#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int leds[] = {16, 17, 18, 19, 25, 26};
int btn1 = 4;
int btn2 = 5;
int btn3 = 14;
int pot = 34;
bool active = false;
bool reversed = false;
int mode = 0;
unsigned long ledTimer = 0;
unsigned long btnTimer = 0;
unsigned long oledTimer = 0;
int ledIndex = 0;
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED не знайдено!");
while (true);
}
for (int i = 0; i < 6; i++) {
pinMode(leds[i], OUTPUT);
}
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(10, 20);
display.println("Ready!");
display.display();
delay(1500);
}
void allLeds(bool state) {
for (int i = 0; i < 6; i++) {
digitalWrite(leds[i], state);
}
}
void updateDisplay(int speed) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(25, 0);
display.println("Fire_Storm");
display.drawLine(0, 10, 127, 10, WHITE);
display.setCursor(0, 15);
display.print("State: ");
display.println(active ? "ON" : "OFF");
display.setCursor(0, 28);
display.print("Mode: ");
if (mode == 0) display.println("Together");
if (mode == 1) display.println("Sequence");
if (mode == 2) display.println("Alternate");
display.setCursor(0, 40);
display.print("Dir: ");
display.println(reversed ? "<<< REV" : ">>> FWD");
display.setCursor(0, 55);
display.print("Speed: ");
display.print(speed);
display.println("ms");
display.display();
}
void loop() {
unsigned long now = millis();
int speed = map(analogRead(pot), 0, 4095, 100, 800);
if (now - btnTimer >= 400) {
if (digitalRead(btn1) == LOW) {
active = !active;
if (!active) allLeds(false);
btnTimer = now;
}
if (digitalRead(btn2) == LOW) {
mode = (mode + 1) % 3;
btnTimer = now;
}
if (digitalRead(btn3) == LOW) {
reversed = !reversed;
btnTimer = now;
}
}
if (active && now - ledTimer >= speed) {
ledTimer = now;
if (mode == 0) {
bool state = digitalRead(leds[0]);
allLeds(!state);
} else if (mode == 1) {
allLeds(false);
int i = reversed ? (5 - ledIndex) : ledIndex;
digitalWrite(leds[i], HIGH);
ledIndex = (ledIndex +1) % 6;
} else {
bool state = digitalRead(leds[0]);
for (int i = 0; i < 6; i += 2) {
digitalWrite(leds[i], !state);
}
for (int i = 1; i < 6; i += 2) {
digitalWrite(leds[i], state);
}
}
}
if (now - oledTimer >= 200) {
oledTimer = now;
updateDisplay(speed);
}
}