#include <WS2812FX.h>
#include <EncButton.h>
#define LED_PIN 3 // digital pin used to drive the LED strip
#define LED_COUNT 95 // number of LEDs on the strip
#define CLK 6
#define DT 5
#define SW 4
#define FX_MODE_STATIC 0
#define FX_MODE_BLINK 1
#define FX_MODE_BREATH 2
#define FX_MODE_COLOR_WIPE 3
byte Option = 0;
int q = 0;
//int w = 0;
//int e = 0;
int speed1 = 1000;
int speed2 = 1000;
int speed3 = 1000;
uint8_t effectmode1;
uint8_t effectmode2;
uint8_t effectmode3;
//FX_MODE_STATIC, FX_MODE_STATIC, FX_MODE_RAINBOW, FX_MODE_RAINBOW_CYCLE, FX_MODE_CHASE_RAINBOW, FX_MODE_COLOR_SWEEP_RANDOM, FX_MODE_RUNNING_RANDOM, FX_MODE_RAINBOW_FIREWORKS, FX_MODE_RAINBOW_LARSON, FX_MODE_BITS
String modes1 = "";
String modes2 = "";
String modes3 = "";
uint8_t mode1[] = {};
uint8_t mode2[] = {};
uint8_t mode3[] = {};
EncButton<EB_TICK, DT, CLK, SW> enc;
WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
enc.setEncType(EB_FULLSTEP);
ws2812fx.init();
ws2812fx.setBrightness(10);
ws2812fx.setSegment(0, 0, 29, FX_MODE_STATIC, 0x000001, speed1, false);
ws2812fx.setSegment(1, 30, 63, FX_MODE_STATIC, 0x000001, speed2, false);
ws2812fx.setSegment(2, 64, 95, FX_MODE_STATIC, 0x000001, speed3, false);
modes1 = "";
uint8_t num_modes = sizeof(mode1) > 0 ? sizeof(mode1) : ws2812fx.getModeCount();
for(uint8_t i=0; i < num_modes; i++) {
uint8_t m = sizeof(mode1) > 0 ? mode1[i] : i;
modes1 += ws2812fx.getModeName(m);
}
modes2 = "";
for(uint8_t i=0; i < num_modes; i++) {
uint8_t m = sizeof(mode2) > 0 ? mode2[i] : i;
modes2 += ws2812fx.getModeName(m);
}
modes3 = "";
for(uint8_t i=0; i < num_modes; i++) {
uint8_t m = sizeof(mode3) > 0 ? mode3[i] : i;
modes3 += ws2812fx.getModeName(m);
}
ws2812fx.start();
}
void loop() {
enc.tick();
ws2812fx.service();
switch (Option) {
case 0:
Option1();
Speed1();
Serial.println("Section 1");
break;
case 1:
Option2();
Speed2();
Serial.println("Section 2");
break;
case 2:
Option3();
Speed3();
Serial.println("Section 3");
break;
case 3:
changeBrightness();
Serial.println("Brightness");
break;
}
if (enc.hasClicks(1)) {
Option++;
}
if (enc.hasClicks(2)) {
Option--;
}
}
void Option1() {
if (enc.right() && q < ws2812fx.getModeCount()) q++;
if (enc.left() && q > 0) q--;
if (enc.turn()) {
if (q == 0) {
Serial.println(q);
ws2812fx.setSegment(0, 0, 29, FX_MODE_STATIC, 0x000001, speed1, false);
}
else {
uint8_t new_mode = sizeof(mode1) > 0 ? mode1[q % sizeof(mode1)] : q % ws2812fx.getModeCount();
Serial.println(q);
ws2812fx.setSegment(0, 0, 29, new_mode, 0xFFFFFF, speed1, false);
}
}
}
void Speed1() {
if (enc.rightH() && speed1 < 100000) speed1 += 1000;
if (enc.leftH() && speed1 > 0) speed1 -= 1000;
if (enc.turnH()) {
if (q == 0) {
Serial.println(speed1);
ws2812fx.setSegment(0, 0, 29, FX_MODE_STATIC, 0x000001, speed1, false);
}
else {
uint8_t new_mode = sizeof(mode1) > 0 ? mode1[q % sizeof(mode1)] : q % ws2812fx.getModeCount();
Serial.println(speed1);
ws2812fx.setSegment(0, 0, 29, new_mode, 0xFFFFFF, speed1, false);
}
}
}
void Option2() {
if (enc.right() && q < ws2812fx.getModeCount()) q++;
if (enc.left() && q > 0) q--;
if (enc.turn()) {
if (q == 0) {
Serial.println(q);
ws2812fx.setSegment(1, 30, 63, FX_MODE_STATIC, 0x000001, speed2, false);
}
else {
uint8_t new_mode = sizeof(mode2) > 0 ? mode2[q % sizeof(mode2)] : q % ws2812fx.getModeCount();
Serial.println(q);
ws2812fx.setSegment(1, 30, 63, new_mode, 0xFFFFFF, speed2, false);
}
}
}
void Speed2() {
if (enc.rightH() && speed2 < 100000) speed2 += 1000;
if (enc.leftH() && speed2 > 0) speed2 -= 1000;
if (enc.turnH()) {
if (q == 0) {
Serial.println(speed2);
ws2812fx.setSegment(1, 30, 63, FX_MODE_STATIC, 0x000001, speed2, false);
}
else {
uint8_t new_mode = sizeof(mode2) > 0 ? mode2[q % sizeof(mode2)] : q % ws2812fx.getModeCount();
Serial.println(speed2);
ws2812fx.setSegment(1, 30, 63, new_mode, 0xFFFFFF, speed2, false);
}
}
}
void Option3() {
if (enc.right() && q < ws2812fx.getModeCount()) q++;
if (enc.left() && q > 0) q--;
if (enc.turn()) {
if (q == 0) {
Serial.println(q);
ws2812fx.setSegment(2, 64, 95, FX_MODE_STATIC, 0x000001, speed3, false);
}
else {
uint8_t new_mode = sizeof(mode3) > 0 ? mode3[q % sizeof(mode3)] : q % ws2812fx.getModeCount();
Serial.println(q);
ws2812fx.setSegment(2, 64, 95, new_mode, 0xFFFFFF, speed3, false);
}
}
}
void Speed3() {
if (enc.rightH() && speed3 < 100000) speed3 += 1000;
if (enc.leftH() && speed3 > 0) speed3 -= 1000;
if (enc.turnH()) {
if (q == 0) {
Serial.println(speed3);
ws2812fx.setSegment(2, 64, 95, FX_MODE_STATIC, 0x000001, speed3, false);
}
else {
uint8_t new_mode = sizeof(mode2) > 0 ? mode2[q % sizeof(mode2)] : q % ws2812fx.getModeCount();
Serial.println(speed3);
ws2812fx.setSegment(2, 64, 95, new_mode, 0xFFFFFF, speed3, false);
}
}
}
void changeBrightness() {
int brightness = ws2812fx.getBrightness();
if (enc.right()) {
brightness += 5;
} else if (enc.left()) {
brightness -= 5;
}
if (brightness < 0) {
brightness = 0;
} else if (brightness > 255) {
brightness = 255;
}
Serial.println(brightness);
ws2812fx.setBrightness(brightness);
}