#include <Arduino.h>
// Definirea pinilor pentru LED-uri și butoane
const int ledRGBRedPin = 6; // LED RGB - Roșu
const int ledRGBGreenPin = 5; // LED RGB - Verde
const int ledRGBBluePin = 4; // LED RGB - Albastru
const int ledChargePins[] = {7, 8, 9, 10}; // LED-uri pentru procentul de încărcare
const int startButtonPin = 3; // Buton pentru start
const int stopButtonPin = 2; // Buton pentru stop
// Variabile de stare
bool isCharging = false; // Starea de încărcare
unsigned long lastDebounceTimeStart = 0;
unsigned long lastDebounceTimeStop = 0;
const unsigned long debounceDelay = 50; // Delay pentru debouncing
// Variabile pentru gestionarea butoanelor
int startButtonState = HIGH; // Starea butonului de start
int lastStartButtonState = HIGH; // Ultima stare a butonului de start
int stopButtonState = HIGH; // Starea butonului de stop
int lastStopButtonState = HIGH; // Ultima stare a butonului de stop
// Variabile pentru timpul de încărcare
unsigned long chargeStartTime;
const int chargeDuration = 3000; // Timpul de încărcare pentru fiecare LED (în milisecunde)
// Prototipuri pentru funcții
void startCharging();
void manageCharging();
void stopCharging();
void completeCharging();
void resetStation();
void blinkLed(int ledIndex, int blinkCount);
// Funcții de inițializare
void setup() {
Serial.begin(9600); // Inițializarea comunicației seriale
delay(1000); // Delay pentru a te asigura că serialul este gata
// Setarea pinilor
pinMode(ledRGBRedPin, OUTPUT);
pinMode(ledRGBGreenPin, OUTPUT);
pinMode(ledRGBBluePin, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(ledChargePins[i], OUTPUT);
}
pinMode(startButtonPin, INPUT_PULLUP); // Configurare buton start
pinMode(stopButtonPin, INPUT_PULLUP); // Configurare buton stop
// Initializare stări
digitalWrite(ledRGBGreenPin, HIGH); // Stația este liberă, LED verde aprins
digitalWrite(ledRGBRedPin, LOW); // LED roșu stins
digitalWrite(ledRGBBluePin, LOW); // LED albastru stins
Serial.println("Sistem inițializat. Apasă butonul de start.");
}
// Funcția principală
void loop() {
// Citirea stării butonului de start
int readingStart = digitalRead(startButtonPin);
if (readingStart != lastStartButtonState) {
lastDebounceTimeStart = millis();
}
if ((millis() - lastDebounceTimeStart) > debounceDelay) {
if (readingStart == LOW && startButtonState == HIGH) {
Serial.println("Butonul de start a fost apăsat.");
startCharging();
}
}
startButtonState = readingStart;
lastStartButtonState = readingStart;
// Citirea stării butonului de stop
int readingStop = digitalRead(stopButtonPin);
// Debouncing buton stop
if (readingStop != lastStopButtonState) {
lastDebounceTimeStop = millis();
}
if ((millis() - lastDebounceTimeStop) > debounceDelay) {
if (readingStop == LOW && stopButtonState == HIGH && isCharging) {
Serial.println("Butonul de stop a fost apăsat.");
stopCharging();
}
}
stopButtonState = readingStop;
lastStopButtonState = readingStop;
// Verificare starea de încărcare
if (isCharging) {
manageCharging();
}
}
// Funcția pentru a începe încărcarea
void startCharging() {
isCharging = true;
digitalWrite(ledRGBGreenPin, LOW); // LED-ul devine roșu
digitalWrite(ledRGBRedPin, HIGH); // LED-ul roșu se aprinde
digitalWrite(ledRGBBluePin, LOW); // LED-ul albastru stins
for (int i = 0; i < 4; i++) {
digitalWrite(ledChargePins[i], LOW); // Stinge toate LED-urile de încărcare
}
chargeStartTime = millis();
}
// Funcția pentru a gestiona procesul de încărcare
void manageCharging() {
static int currentLed = 0;
if (currentLed < 4) {
// Palpează LED-ul curent
blinkLed(currentLed, 3); // Palpează de 3 ori
digitalWrite(ledChargePins[currentLed], HIGH); // Aprinde LED-ul curent
// Verifică dacă s-a terminat perioada de încărcare pentru LED-ul curent
if (millis() - chargeStartTime >= chargeDuration) {
chargeStartTime = millis(); // Resetează timerul
currentLed++; // Trecerea la următorul LED
}
} else {
completeCharging(); // Finalizarea încărcării
}
}
// Funcția pentru a palpa LED-urile
void blinkLed(int ledIndex, int blinkCount) {
for (int i = 0; i < blinkCount; i++) {
digitalWrite(ledChargePins[ledIndex], HIGH); // Aprinde LED-ul
delay(250);
digitalWrite(ledChargePins[ledIndex], LOW); // Stinge LED-ul
delay(250);
}
}
// Funcția pentru a opri încărcarea
void stopCharging() {
isCharging = false;
// Animația de finalizare
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
digitalWrite(ledChargePins[j], HIGH);
}
delay(300);
for (int j = 0; j < 4; j++) {
digitalWrite(ledChargePins[j], LOW);
}
delay(300);
}
resetStation();
}
// Funcția pentru a finaliza încărcarea
void completeCharging() {
// Animația de finalizare
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
digitalWrite(ledChargePins[j], HIGH);
}
delay(300);
for (int j = 0; j < 4; j++) {
digitalWrite(ledChargePins[j], LOW);
}
delay(300);
}
resetStation();
}
// Funcția pentru a reseta stația
void resetStation() {
for (int i = 0; i < 4; i++) {
digitalWrite(ledChargePins[i], LOW); // Stinge toate LED-urile de încărcare
}
digitalWrite(ledRGBGreenPin, HIGH); // LED-ul devine verde
digitalWrite(ledRGBRedPin, LOW); // LED-ul roșu se stinge
digitalWrite(ledRGBBluePin, LOW); // LED-ul albastru stins
}