#include <Adafruit_NeoPixel.h>
#define NUM_PIXELS 64
#define buttonPin 12
Adafruit_NeoPixel strip(NUM_PIXELS, 6, NEO_GRB + NEO_KHZ800);
uint8_t counter = 0;
bool currentButtonState = 0;
bool lastButtonState = 0;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
strip.begin();
strip.clear();
strip.show();
}
void rotateGradient(uint8_t gradientSize, uint16_t delayval) {
uint8_t numPixel = NUM_PIXELS, colorSet = 0;
for (uint8_t r = 1; r < 4; r++) {
for (int16_t i = - numPixel / gradientSize; i < (numPixel + (numPixel / gradientSize)); i++) {
strip.clear();
for (uint8_t j = 0; j < (numPixel / gradientSize); j++) {
colorSet = r;
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == HIGH) return;
if(r == 1) {
strip.setPixelColor((i + j), strip.Color(255 - (255 / (numPixel / gradientSize)) * j, 0, 0));
strip.setPixelColor((i - j), strip.Color(255 - (255 / (numPixel / gradientSize)) * j, 0, 0));
} else if(r == 2) {
strip.setPixelColor((i + j), strip.Color(0, 255 - (255 / (numPixel / gradientSize)) * j, 0));
strip.setPixelColor((i - j), strip.Color(0, 255 - (255 / (numPixel / gradientSize)) * j, 0));
} else {
strip.setPixelColor((i + j), strip.Color(0, 0, 255 - (255 / (numPixel / gradientSize)) * j));
strip.setPixelColor((i - j), strip.Color(0, 0, 255 - (255 / (numPixel / gradientSize)) * j));
}
}
delay(delayval);
strip.show();
}
}
}
void colorTransitionFadeOut(uint16_t delayval, uint8_t r, uint8_t g, uint8_t b) {
uint8_t numPixel = NUM_PIXELS;
for(int i = 0; i < numPixel; i++) { \
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == HIGH) return;
strip.setPixelColor(i, strip.Color(r, g, b));
strip.show();
delay(delayval);
}
for(int i=0; i < numPixel; i++) {
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == HIGH) return;
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
delay(delayval);
}
}
void rotateInOrder (uint16_t delayval) {
colorTransitionFadeOut(delayval, 255, 0, 0);
colorTransitionFadeOut(delayval, 255, 165, 0); //橘
colorTransitionFadeOut(delayval, 255, 255, 0);
colorTransitionFadeOut(delayval, 0, 255, 0);
colorTransitionFadeOut(delayval, 0, 0, 255);
colorTransitionFadeOut(delayval, 75, 0, 130); //靛
colorTransitionFadeOut(delayval, 128, 0, 128); //紫
}
void Wheel(uint8_t wheelPos, uint8_t &r, uint8_t &g, uint8_t &b) {
if (wheelPos <= 85) {
r = 255 - wheelPos * 3;
g = wheelPos * 3;
b = 0;
} else if (wheelPos <= 170) {
wheelPos -= 85;
r = 0;
g = 255 - wheelPos * 3;
b = wheelPos * 3;
} else {
wheelPos -= 170;
r = wheelPos * 3;
g = 0;
b = 255 - wheelPos * 3;
}
}
void rainbow() {
uint8_t wheelPos, numPixel = NUM_PIXELS;
uint8_t r, g, b;
for (uint8_t i = 0; i < numPixel; i++) {
wheelPos = i * (256 / numPixel);
Wheel(wheelPos, r, g, b);
strip.setPixelColor(i, strip.Color(r, g, b));
}
strip.show();
}
void rotateRainbow(uint16_t delayval, uint8_t repeatTimes) {
uint8_t numPixel = NUM_PIXELS;
uint8_t currentWheelPos = 0, wheelPos = 0, count = 0, k = -1;
uint8_t interval = 256 / numPixel;
uint8_t r, g, b;
while(true) {
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == HIGH) return;
for (uint8_t i = 0; i < numPixel; i++) {
wheelPos = ((i + currentWheelPos) * interval) % 256;
Wheel(wheelPos, r, g, b);
strip.setPixelColor(i, strip.Color(r, g, b));
}
strip.show();
delay(delayval);
count++;
currentWheelPos += k;
Serial.println(count);
if (count >= repeatTimes * numPixel) {
k *= -1;
count = 0;
}
}
}
void process () {
switch (counter) {
case 0:
rainbow();
break;
case 1:
rotateGradient(3, 30);
break;
case 2:
rotateInOrder(10);
break;
default:
rotateRainbow(50, 3);
break;
}
}
void loop() {
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == LOW) {
strip.clear();
counter %= 4;
Serial.println(counter);
process();
counter++;
}
else {
process();
}
lastButtonState = currentButtonState;
delay(10);
}