#include <Arduino.h>
#include <U8x8lib.h>
#include <FastLED.h>
#define EB_DEB_TIME 50 // таймаут гашения дребезга кнопки (кнопка)
#define EB_CLICK_TIME 500 // таймаут ожидания кликов (кнопка)
#define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
#define LED_PIN 5 // Пин DATA подключен к D6
#define NUM_LEDS 16 // Количество светодиодов в ленте
#define LED_TYPE WS2812B // Тип ленты (например, WS2812B, NEOPIXEL)
#define COLOR_ORDER GRB // Порядок цветов (зависит от ленты)
#include <EncButton.h>
EncButton eb(3, 4, 6);
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
typedef enum choiceStatus {
changeMode = 0,
changeR = 1,
changeG,
changeB,
changingMode,
changingR,
changingG,
changingB
} choiceStatus;
int curStatus = choiceStatus::changeMode;
uint8_t r = 0;
uint8_t g = 0;
uint8_t b = 0;
CRGB leds[NUM_LEDS];
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
//SW - KEY CLK -S2 DT - S1
void setup() {
Serial.begin(115200);
u8x8.begin();
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.drawString(0, 0, "mode");
u8x8.drawString(7, 0, "color");
u8x8.drawString(15, 0, "-");
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(100); // Яркость (0-255)
}
bool isChangeState() {
return curStatus < choiceStatus::changingMode;
}
void processChangeStatus() {
Serial.println((int)eb.dir(), DEC);
curStatus += eb.dir();
curStatus %= 4;
if (curStatus < 0) {
curStatus = 0;
}
}
void processChangingStatus() {
if (curStatus == choiceStatus::changeMode
|| curStatus == choiceStatus::changingMode) {
return;
}
if (curStatus == choiceStatus::changingR) {
r+=eb.dir();
}
if (curStatus == choiceStatus::changingG) {
g+=eb.dir();
}
if (curStatus == choiceStatus::changingB) {
b+=eb.dir();
}
}
void changeState() {
if (isChangeState()) {
curStatus += 4;
} else {
curStatus -= 4;
}
}
void printStatus() {
u8x8.clearDisplay();
u8x8.drawString(0, 0, "mode");
u8x8.drawString(7, 0, "color");
u8x8.drawString(0, 2, "r");
u8x8.drawString(0, 4, "g");
u8x8.drawString(0, 6, "b");
char* str;
if (isChangeState()) {
str = "+";
} else {
str = "-";
}
if (curStatus % 4 == 1) {
u8x8.drawString(14, 2, str);
} else if (curStatus % 4 == 2) {
u8x8.drawString(14, 4, str);
} else if (curStatus % 4 == 3) {
u8x8.drawString(14, 6, str);
}
char numstr[5];
sprintf(numstr, "%d", r);
u8x8.drawString(7, 2, numstr);
sprintf(numstr, "%d", g);
u8x8.drawString(7, 4, numstr);
sprintf(numstr, "%d", b);
u8x8.drawString(7, 6, numstr);
}
void updateRGB() {
for (int i = 0; i < 16; i++) {
leds[i] = CRGB(r, g, b);
}
FastLED.show();
}
void loop() {
eb.tick();
if (eb.click()) {
changeState();
} else if (!eb.turn()) {
return;
} else if (isChangeState()) {
processChangeStatus();
} else {
processChangingStatus();
}
printStatus();
updateRGB();
}