Created
December 23, 2020 01:38
-
-
Save gitaeks/3f1af34636be8b22e3e285b07df75d90 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Adafruit_NeoPixel.h> | |
#define BUTTON_PIN 2 | |
#define PIXEL_PIN 5 // Digital IO pin connected to the NeoPixels. | |
#define PIXEL_COUNT 8 // Number of NeoPixels | |
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); | |
//Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRBW + NEO_KHZ800); | |
volatile unsigned btnPrevious = 0; | |
const unsigned int btnInterval = 500; | |
volatile bool btnFlag = false; | |
volatile int mode = 0; // Currently-active animation mode, 0-8 | |
void setup() { | |
Serial.begin(9600); | |
pinMode(BUTTON_PIN, INPUT_PULLUP); | |
strip.begin(); // Initialize NeoPixel strip object (REQUIRED) | |
strip.setBrightness(255); | |
strip.show(); // Initialize all pixels to 'off' | |
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), btnPressed, FALLING); | |
/**** | |
interrupt : 인터럽트 번호 | |
ISR : 인터럽트 발생 시 호출 할 함수(매개변수나 반환값이 없어야 함.) | |
mode : 인터럽트가 동작되는 시기 설정 | |
· LOW : 핀 값이 LOW일 때 인터럽트 동작 | |
· CHANGE : 핀 값이 HIGH에서 LOW 또는 LOW에서 HIGH로 변경될 때 인터럽트 동작 | |
· RISING : 핀 값이 LOW에서 HIGH로 변경될 때 인터럽트 동작 | |
· FALLING : 핀 값이 HIGH에서 LOW로 변경될 때 인터럽트 동작 | |
· HIGH : 핀 값이 HIGH일 때 인터럽트 동작 | |
****/ | |
} | |
void loop() { | |
switch (mode) { // Start the new animation... | |
case 0: | |
colorWipe(strip.Color( 0, 0, 0), 50); // Black/off | |
break; | |
case 1: | |
colorWipe(strip.Color(255, 0, 0), 50); // Red | |
break; | |
case 2: | |
colorWipe(strip.Color( 0, 255, 0), 50); // Green | |
break; | |
case 3: | |
colorWipe(strip.Color( 0, 0, 255), 50); // Blue | |
break; | |
case 4: | |
theaterChase(strip.Color(127, 127, 127), 50); // White | |
break; | |
case 5: | |
theaterChase(strip.Color(127, 0, 0), 50); // Red | |
break; | |
case 6: | |
theaterChase(strip.Color( 0, 0, 127), 50); // Blue | |
break; | |
case 7: | |
rainbow(10); | |
break; | |
case 8: | |
theaterChaseRainbow(50); | |
break; | |
} | |
} | |
void btnPressed() { | |
unsigned long btnCurrent = millis(); | |
if ((btnCurrent - btnPrevious) >= btnInterval) { | |
btnPrevious = btnCurrent; | |
btnFlag = true; | |
mode = (mode + 1) % 9; | |
} | |
} | |
// Fill strip pixels one after another with a color. Strip is NOT cleared | |
// first; anything there will be covered pixel by pixel. Pass in color | |
// (as a single 'packed' 32-bit value, which you can get by calling | |
// strip.Color(red, green, blue) as shown in the loop() function above), | |
// and a delay time (in milliseconds) between pixels. | |
void colorWipe(uint32_t color, int wait) { | |
for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip... | |
if (btnFlag == true) { | |
btnFlag = false; | |
break; | |
} | |
strip.setPixelColor(i, color); // Set pixel's color (in RAM) | |
strip.show(); // Update strip to match | |
delay(wait); // Pause for a moment | |
} | |
} | |
// Theater-marquee-style chasing lights. Pass in a color (32-bit value, | |
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms) | |
// between frames. | |
void theaterChase(uint32_t color, int wait) { | |
for (int a = 0; a < 10; a++) { // Repeat 10 times... | |
if (btnFlag == true) { | |
btnFlag = false; | |
break; | |
} | |
for (int b = 0; b < 3; b++) { // 'b' counts from 0 to 2... | |
strip.clear(); // Set all pixels in RAM to 0 (off) | |
// 'c' counts up from 'b' to end of strip in steps of 3... | |
for (int c = b; c < strip.numPixels(); c += 3) { | |
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color' | |
} | |
strip.show(); // Update strip with new contents | |
delay(wait); // Pause for a moment | |
} | |
} | |
} | |
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames. | |
void rainbow(int wait) { | |
// Hue of first pixel runs 3 complete loops through the color wheel. | |
// Color wheel has a range of 65536 but it's OK if we roll over, so | |
// just count from 0 to 3*65536. Adding 256 to firstPixelHue each time | |
// means we'll make 3*65536/256 = 768 passes through this outer loop: | |
for (long firstPixelHue = 0; firstPixelHue < 3 * 65536; firstPixelHue += 256) { | |
if (btnFlag == true) { | |
btnFlag = false; | |
break; | |
} | |
for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip... | |
// Offset pixel hue by an amount to make one full revolution of the | |
// color wheel (range of 65536) along the length of the strip | |
// (strip.numPixels() steps): | |
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels()); | |
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or | |
// optionally add saturation and value (brightness) (each 0 to 255). | |
// Here we're using just the single-argument hue variant. The result | |
// is passed through strip.gamma32() to provide 'truer' colors | |
// before assigning to each pixel: | |
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); | |
} | |
strip.show(); // Update strip with new contents | |
delay(wait); // Pause for a moment | |
} | |
} | |
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames. | |
void theaterChaseRainbow(int wait) { | |
int firstPixelHue = 0; // First pixel starts at red (hue 0) | |
for (int a = 0; a < 30; a++) { // Repeat 30 times... | |
if (btnFlag == true) { | |
btnFlag = false; | |
break; | |
} | |
for (int b = 0; b < 3; b++) { // 'b' counts from 0 to 2... | |
strip.clear(); // Set all pixels in RAM to 0 (off) | |
// 'c' counts up from 'b' to end of strip in increments of 3... | |
for (int c = b; c < strip.numPixels(); c += 3) { | |
// hue of pixel 'c' is offset by an amount to make one full | |
// revolution of the color wheel (range 65536) along the length | |
// of the strip (strip.numPixels() steps): | |
int hue = firstPixelHue + c * 65536L / strip.numPixels(); | |
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB | |
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color' | |
} | |
strip.show(); // Update strip with new contents | |
delay(wait); // Pause for a moment | |
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment