#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(float gradientRatio, uint16_t delayval) {
uint8_t numPixel = NUM_PIXELS, colorSet = 0;
uint8_t gradientSize = numPixel * gradientRatio / 2;
for (uint8_t r = 1; r < 4; r++) {
for (int16_t i = - gradientSize; i < (numPixel + gradientSize); i++) {
strip.clear();
for (uint8_t j = 0; j < gradientSize + 1; j++) {
colorSet = 255 - (255 / gradientSize) * j;
if(r == 1) {
strip.setPixelColor((i + j), strip.Color(colorSet, 0, 0));
strip.setPixelColor((i - j), strip.Color(colorSet, 0, 0));
} else if(r == 2) {
strip.setPixelColor((i + j), strip.Color(0, colorSet, 0));
strip.setPixelColor((i - j), strip.Color(0, colorSet, 0));
} else {
strip.setPixelColor((i + j), strip.Color(0, 0, colorSet));
strip.setPixelColor((i - j), strip.Color(0, 0, colorSet));
}
}
delay(delayval);
strip.show();
}
}
}
void blinkRainbow(uint16_t delayVal, uint8_t repeatTimes, uint8_t saturation, uint8_t brightness) {
while (repeatTimes != 0) {
for(uint8_t i = 0; i < 50; i++) {
uint16_t hue = 65535 / 50 * i;
strip.fill(strip.gamma32(strip.ColorHSV(hue, saturation, brightness)));
strip.show();
delay(delayVal);
}
repeatTimes -= 1;
}
}
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 cycle, 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;
repeatTimes *= 2;
while(repeatTimes != 0) {
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 >= cycle * numPixel) {
k *= -1;
count = 0;
repeatTimes -= 1;
}
}
}
void process () {
switch (counter) {
case 1:
rotateGradient(0.66, 30);
break;
case 2:
blinkRainbow(100, 2, 150, 255);
break;
default:
rotateRainbow(40, 2, 1);
break;
}
}
void loop() {
currentButtonState = digitalRead(buttonPin);
if (currentButtonState != lastButtonState && currentButtonState == HIGH) {
strip.clear();
counter++;
counter %= 3;
Serial.println(counter);
process();
}
else {
rainbow();
}
lastButtonState = currentButtonState;
delay(10);
}