#include <LiquidCrystal.h>
// LCD pins: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// LED pins
const int Led1Pin = 2;
const int Led2Pin = 3;
// Button pins
const int BtnToggle = 4;
const int BtnInc = 5;
const int BtnDec = 6;
// Variabile globale
bool Led1State = false;
bool Led2State = false;
unsigned long BlinkInterval = 500;
unsigned long LastBlinkTime = 0;
// Flags
bool ToggleFlag = false;
bool IncFlag = false;
bool DecFlag = false;
void setup() {
pinMode(Led1Pin, OUTPUT);
pinMode(Led2Pin, OUTPUT);
pinMode(BtnToggle, INPUT_PULLUP);
pinMode(BtnInc, INPUT_PULLUP);
pinMode(BtnDec, INPUT_PULLUP);
lcd.begin(16, 2);
Serial.begin(9600);
lcd.print("Init sistem...");
delay(1000);
lcd.clear();
}
void loop() {
ToggleLedTask();
Led2BlinkTask();
IncDecTask();
IdleTask();
}
// Task 1: Toggle LED1
void ToggleLedTask() {
if (digitalRead(BtnToggle) == LOW && !ToggleFlag) {
Led1State = !Led1State;
digitalWrite(Led1Pin, Led1State);
ToggleFlag = true;
}
if (digitalRead(BtnToggle) == HIGH) ToggleFlag = false;
}
// Task 2: LED2 blink (numai când LED1 e OFF)
void Led2BlinkTask() {
if (!Led1State) {
unsigned long currentTime = millis();
if (currentTime - LastBlinkTime >= BlinkInterval) {
Led2State = !Led2State;
digitalWrite(Led2Pin, Led2State);
LastBlinkTime = currentTime;
}
} else {
digitalWrite(Led2Pin, LOW);
}
}
// Task 3: Increment / Decrement blink interval
void IncDecTask() {
if (digitalRead(BtnInc) == LOW && !IncFlag) {
BlinkInterval += 100;
if (BlinkInterval > 2000) BlinkInterval = 2000;
IncFlag = true;
}
if (digitalRead(BtnInc) == HIGH) IncFlag = false;
if (digitalRead(BtnDec) == LOW && !DecFlag) {
BlinkInterval = max(100, BlinkInterval - 100);
DecFlag = true;
}
if (digitalRead(BtnDec) == HIGH) DecFlag = false;
}
// Task 4: Idle - raportare LCD + Serial
void IdleTask() {
// LCD
lcd.setCursor(0, 0);
lcd.print("LED1: ");
lcd.print(Led1State ? "ON " : "OFF");
lcd.setCursor(0, 1);
lcd.print("Blink: ");
lcd.print(BlinkInterval);
lcd.print("ms ");
// Serial
Serial.print("LED1=");
Serial.print(Led1State ? "ON" : "OFF");
Serial.print(" | Blink=");
Serial.print(BlinkInterval);
Serial.println(" ms");
delay(200); // simulare raportare
}