#define LED PB0
#define BTN PB1
bool reverseMode = false;
bool lastBtn = true;
unsigned long lastDebounce = 0;
int userFreq = 0;
char buf[4];
byte pos = 0;
// дані для етапів ефекту
int freqSeq[3] = {6, 12, 2};
int timeSeq[3] = {2000, 1000, 10000};
int stage = 0;
unsigned long stageStart = 0;
bool ledState = false;
unsigned long lastBlink = 0;
void setup() {
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("System started. Normal mode.");
stageStart = millis();
}
void taskButton() {
bool s = digitalRead(BTN);
if (!s && lastBtn && millis() - lastDebounce > 200) {
reverseMode = !reverseMode;
Serial.println(reverseMode ? "Reverse mode" : "Normal mode");
stage = 0;
stageStart = millis();
lastDebounce = millis();
}
lastBtn = s;
}
void taskUART() {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
buf[pos] = 0;
userFreq = atoi(buf);
pos = 0;
if (userFreq > 0) {
Serial.print("Custom frequency: ");
Serial.print(userFreq);
Serial.println(" Hz");
}
} else if (pos < 3) buf[pos++] = c;
}
}
void taskEffect() {
unsigned long now = millis();
if (userFreq > 0) {
int period = 500 / userFreq;
if (now - lastBlink >= (unsigned long)period) {
lastBlink = now;
ledState = !ledState;
digitalWrite(LED, ledState);
}
return;
}
int idx = reverseMode ? (2 - stage) : stage;
int f = freqSeq[idx];
int dur = timeSeq[idx];
int period = 500 / f;
if (now - lastBlink >= (unsigned long)period) {
lastBlink = now;
ledState = !ledState;
digitalWrite(LED, ledState);
}
if (now - stageStart > (unsigned long)dur) {
stage++;
if (stage > 2) {
digitalWrite(LED, HIGH); // постійно горить
return;
}
stageStart = now;
Serial.print("Freq ");
Serial.print(f);
Serial.println("Hz");
}
}
void loop() {
taskButton();
taskUART();
taskEffect();
}