#include <FastLED.h>
#define Serial Serial1
#define btn 7
#define LED_PIN 14
#define NUM_LEDS 32
#define BRIGHTNESS 255
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
int menu = 0;
int mode = 0;
bool dir = 0;
// timeout in 60 seconds
int timeOut = 60;
uint8_t hue = 255;
uint8_t val = 255;
uint8_t var = 0;
int clr = 0;
int divisor = 30;
unsigned long timer = 0;
unsigned long timeNow = 0;
void setup() {
//delay(1000);
Serial.begin(115200);
pinMode(btn, INPUT_PULLUP);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
FastLED.show();
Serial.println("Setup Complete");
}
void loop() {
timer = millis();
if (menu == 0) {
modes();
while (digitalRead(btn) == 0) {
delay(1000);
// Press and hold 2 seconds - enters colour options
if (millis() - timer > 2000 && millis() - timer < 5000) {
Serial.println("change color");
menu = 1;
fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
FastLED.show();
timeNow = millis();
}
// press and hold 5 seconds - enters brightness option
if (millis() - timer > 5000 && millis() - timer < 10000) {
Serial.println("Change brightness");
menu = 2;
fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));
FastLED.show();
timeNow = millis();
}
// press and hole 10 seconds - enters mode select
if (millis() - timer > 10000 && millis() - timer < 15000) {
Serial.println("Change modes");
menu = 3;
fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0));
FastLED.show();
timeNow = millis();
}
// press and hole 15 seconds - reset selection
if (millis() - timer > 15000) {
Serial.println("Reset menu");
menu = 0;
fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
FastLED.show();
timer = millis();
}
}
}
// change color
if (menu == 1) {
if (digitalRead(btn) == 0) {
hue++;
}
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, 255));
FastLED.show();
delay(20);
// timeout
if (millis() - timeNow > timeOut*1000) {
menu = 0;
Serial.println("Timeout! going back to main menu");
delay(1000);
}
}
// change brightness
if (menu == 2) {
if (digitalRead(btn) == 0) {
if (dir) val++;
if (!dir) val--;
if (val <= 0) dir = !dir;
//Serial.println(val);
}
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, val));
FastLED.show();
delay(20);
// timeout
if (millis() - timeNow > timeOut*1000) {
menu = 0;
Serial.println("Timeout! going back to main menu");
delay(1000);
}
}
// change modes
if (menu == 3) {
if (digitalRead(btn) == 0) {
mode++;
if (mode >= 4) mode = 0;
delay(250);
}
modes();
// timeout
if (millis() - timeNow > timeOut*1000) {
menu = 0;
Serial.println("Timeout! going back to main menu");
delay(1000);
}
}
}
void modes(){
if(mode == 0){
Serial.println("Mode : Solid");
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, val));
FastLED.show();
delay(100);
}
if(mode == 1){
Serial.println("Mode : Flow");
for (int j = 0; j < 256; j++) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = Scroll((i * 256 / NUM_LEDS + j) % 256);
}
if (digitalRead(btn) == 0) break;
FastLED.show();
delay(1);
}
}
if(mode == 2){
Serial.println("Mode : Breath");
float breath = (exp(sin(millis() / 5000.0 * PI)) - 0.36787944) * 108.0;
breath = map(breath, 0, 255, 16, val);
FastLED.setBrightness(breath);
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, 255));
//fill_rainbow(leds, NUM_LEDS, (var++ / divisor));
if (clr == (255 * divisor)) {
clr = 0;
}
FastLED.show();
delay(5);
}
if(mode == 3){
FastLED.setBrightness(BRIGHTNESS);
Serial.println("Mode : Strobe");
for(int i = 0; i < 10; i++) {
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, val));
FastLED.show();
delay(50);
fill_solid(leds, NUM_LEDS, CHSV(0, 0, 0));
FastLED.show();
delay(50);
if (digitalRead(btn) == 0) break;
}
for(int i = 0; i < 10; i++) {
delay(100);
if (digitalRead(btn) == 0) break;
}
}
}
CRGB Scroll(int pos) {
CRGB color(0, 0, 0);
if (pos < 85) {
color.g = 0;
color.r = ((float)pos / 85.0f) * 255.0f;
color.b = 255 - color.r;
} else if (pos < 170) {
color.g = ((float)(pos - 85) / 85.0f) * 255.0f;
color.r = 255 - color.g;
color.b = 0;
} else if (pos < 256) {
color.b = ((float)(pos - 170) / 85.0f) * 255.0f;
color.g = 255 - color.b;
color.r = 1;
}
return color;
}