#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/Picopixel.h>
#define NUM_LEDS 16
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
byte counter;
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
uint8_t red = 50;
uint8_t green = 25;
uint8_t blue = 66;
uint8_t rainbow_speed = 20;
uint8_t menu = 0;
bool clearScreen = false;
long int modeLastChanged = 0;
int prevClk = HIGH;
typedef enum {
SET_RAINBOW_SPEED,
SET_RED,
SET_GREEN,
SET_BLUE,
SET_MENU
} Mode;
Mode mode = SET_MENU;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void nextColorRGBStatic() {
switch (mode) {
case SET_RED:
mode = SET_GREEN;
break;
case SET_GREEN:
mode = SET_BLUE;
break;
case SET_BLUE:
mode = SET_MENU;
break;
case SET_MENU:
mode = SET_RED;
break;
}
}
void nextRowRainbow() {
switch (mode) {
case SET_RAINBOW_SPEED:
mode = SET_MENU;
break;
case SET_MENU:
mode = SET_RAINBOW_SPEED;
break;
}
}
void updateValueRGBStatic(int delta) {
switch (mode) {
case SET_RED:
red = constrain(red + delta, 0, 100);
break;
case SET_GREEN:
green = constrain(green + delta, 0, 100);
break;
case SET_BLUE:
blue = constrain(blue + delta, 0, 100);
break;
}
}
void updateValueRainbowSpeed(int delta) {
rainbow_speed = constrain(red + delta, 0, 100);
}
void updateDisplayRGBStatic() {
display.clearDisplay();
display.setFont();
display.setTextColor(1);
display.setCursor(50, 2);
display.print("MENU");
if (mode == SET_MENU) {
display.setCursor(10, 2);
display.print(">");
}
display.setCursor(30, 20);
display.print("Red Color");
display.drawRoundRect(11, 29, 102, 5, 2, WHITE);
display.fillRect(11, 30, red, 3, WHITE);
if (mode == SET_RED) {
display.setCursor(20, 20);
display.print(">");
}
display.setCursor(30, 35);
display.print("Green Color");
display.drawRoundRect(10, 44, 102, 5, 2, WHITE);
display.fillRect(11, 45, green, 3, WHITE);
if (mode == SET_GREEN) {
display.setCursor(20, 35);
display.print(">");
}
display.setCursor(30, 50);
display.print("Blue Color");
display.drawRoundRect(10, 59, 102, 5, 2, WHITE);
display.fillRect(11, 60, blue, 3, WHITE);
if (mode == SET_BLUE) {
display.setCursor(20, 50);
display.print(">");
}
display.display();
}
void updateDisplayDynamicRainbow() {
display.clearDisplay();
display.setFont();
display.setTextColor(1);
display.setCursor(50, 2);
display.print("MENU");
if (mode == SET_MENU) {
display.setCursor(10, 2);
display.print(">");
}
display.setCursor(30, 20);
display.print("Rainbow Speed");
display.drawRoundRect(11, 29, 102, 5, 2, WHITE);
display.fillRect(11, 30, rainbow_speed, 3, WHITE);
if (mode == SET_RAINBOW_SPEED) {
display.setCursor(20, 20);
display.print(">");
}
display.display();
}
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
updateDisplayRGBStatic();
FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(50);
pinMode(13, OUTPUT);
}
void buttonClickRGBStatic() {
if (digitalRead(ENCODER_SW) == LOW && millis() - modeLastChanged > 300) {
modeLastChanged = millis();
nextColorRGBStatic();
}
}
void updateMenu(int delta) {
menu = constrain(menu + delta, 0, 100);
}
void loop() {
buttonClickRGBStatic();
int clk = digitalRead(ENCODER_CLK);
if (clk != prevClk && clk == LOW) {
int dt = digitalRead(ENCODER_DT);
int delta = dt == HIGH ? 5 : -5;
updateValueRGBStatic(delta);
updateMenu(delta);
}
if (mode != SET_RAINBOW_SPEED) {
updateDisplayRGBStatic();
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CRGB(map(red, 0, 100, 0, 255), map(green, 0, 100, 0, 255), map(blue, 0, 100, 0, 255));
}
}
prevClk = clk;
/*
if (mode == SET_MENU) {
updateMenu(delta);
if ( menu < 20 ){
updateValueRGBStatic(delta);
updateDisplayRGBStatic();
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CRGB(map(red, 0, 100, 0, 255), map(green, 0, 100, 0, 255), map(blue, 0, 100, 0, 255));
}
} else if ( menu >= 20) {
updateDisplayDynamicRainbow();
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CRGB(255, 0, 0);
}
}
} else {
updateValueRGBStatic(delta);
updateDisplayRGBStatic();
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CRGB(map(red, 0, 100, 0, 255), map(green, 0, 100, 0, 255), map(blue, 0, 100, 0, 255));
}
}
*/
/*
Кароче режимы, вс ержимы переключаются кнопками, но есть режим set menu, в котором режимы. 360 - градусы.
Нужно сделать замену экранов повором колеса на определенный градус, типо если режим MENU, то градусы переводим в режимы.
типо проверили режимы, переключили какой нада, потом смотрим. Режим замены цвета, обновляем соответствующие данные
*/
FastLED.setBrightness(255);
/*
for (int i = 0; i < NUM_LEDS; i++ ) { // от 0 до первой трети
leds[i] = CRGB(map(red, 0, 100, 0, 255), map(green, 0, 100, 0, 255), map(blue, 0, 100, 0, 255));
}
*/
FastLED.show();
delay(5); // скорость движения радуги
}