/*
esempio di programmazione a stati, con funzione "Switch...break" che permette di saltare direttamente alla
porzione di programma indipendente selezionata.
Viller Broccoli
*/
byte ledPin[] = {3, 4, 5, 6,}; // creazione di un array di 4 pin a cui vanno collegati i LED
int stato = 0; // variabile il cui valore permette di commutare il relativo case , parte da 0.
unsigned long cambioCase = 5000; // variabile che stabilisce l'intevallo di tempo per ogni case
unsigned long tempoTrascorso; // variabile che calcola la differenza tempo
const int intervallo = 2000; // intervallo di accensione/spegnimento in millisecondi (2 secondi)
const int limiteMassimo = 3; // variabile che determina quanti case in sequenza deve cambiare
unsigned long ultimoTempo = 0; // Memorizza il tempo dell'ultimo incremento
void setup() {
Serial.begin(9600); // attiva la stampa su schermo a 9600 bps
for (byte x=0; x<4; x++) {
pinMode(ledPin[x], OUTPUT); //Ciclo "for" che imposta i quattro PIN da 0 a 3 come OUTPUT
}
tempoTrascorso = millis(); // variabile che registra il tempo del contatore "millis()"
}
void loop() {
unsigned long tempoAttuale = millis();
// Verificare se è trascorso l'intervallo di tempo
if (tempoAttuale - ultimoTempo >= intervallo) {
// Incrementare la variabile e assicurarsi che non superi il limite massimo
stato = (stato + 1) % (limiteMassimo + 1);
// Stampare il valore attuale della variabile
Serial.print("stato:");
Serial.println(stato);
delay(30);
ultimoTempo = tempoAttuale; // Aggiornare l'ultimo tempo di incremento
}
// funzione che permette la commutazione sui diversi stati (case) in base al valore della variabile "stato"
switch(stato){
case 0:
// Spegni tutti i LED tranne quello relativo al caso 0
digitalWrite(5, LOW); // Spegni LED blu
digitalWrite(4, LOW); // Spegni LED rosso
digitalWrite(3, LOW); // Spegni LED verde
// Accendi il LED giallo solo se necessario
// la funzione switch attiva solo il case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
blinkLedGiallo();
break;
case 1:
// Spegni tutti i LED tranne quello relativo al caso 1
digitalWrite(6, LOW); // Spegni LED giallo
digitalWrite(4, LOW); // Spegni LED rosso
digitalWrite(3, LOW); // Spegni LED verde
// Accendi il LED blu solo se necessario
// la funzione switch attiva solo il case 1 e cicla il programma all'interno del loop "blinkLedBlu()"
blinkLedBlu();
break;
case 2:
// Spegni tutti i LED tranne quello relativo al caso 2
digitalWrite(6, LOW); // Spegni LED giallo
digitalWrite(5, LOW); // Spegni LED blu
digitalWrite(3, LOW); // Spegni LED verde
// Accendi il LED rosso solo se necessario
// la funzione switch attiva solo il case 2 e cicla il programma all'interno del loop "blinkLedRosso()"
blinkLedRosso();
break;
case 3:
// Spegni tutti i LED tranne quello relativo al caso 3
digitalWrite(6, LOW); // Spegni LED giallo
digitalWrite(5, LOW); // Spegni LED blu
digitalWrite(4, LOW); // Spegni LED rosso
// Accendi il LED verde solo se necessario
// la funzione switch attiva solo il case 3 e cicla il programma all'interno del loop "blinkLedVerde()"
blinkLedVerde();
break;
}
}
unsigned long t0, dt0 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled0 = LOW; // variabile su cui è scritto lo stato del led
void blinkLedGiallo() { // loop dello stato 4 che fa lampeggiare il LED giallo
dt0 = millis() - t0; // calcola il tempo trascorso
if (dt0 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled0 = !statoled0; // inverte lo stato di uscita del Led
digitalWrite(6, statoled0); // accende il led che cambia stato
t0 = millis(); // resetta il tempo sulla variabile contatore t0
}
}
unsigned long t1, dt1 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled1 = LOW; // variabile su cui è scritto lo stato del led blu
void blinkLedBlu() { // loop dello stato 4 che fa lampeggiare il LED blu
dt1 = millis() - t1; // calcola il tempo trascorso
if (dt1 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled1 = !statoled1; // inverte lo stato di uscita del Led
digitalWrite(5, statoled1); // accende il led che cambia stato
t1 = millis(); // resetta il tempo sulla variabile contatore t1
}
}
unsigned long t2, dt2 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled2 = LOW; // variabile su cui è scritto lo stato del led rosso
void blinkLedRosso() { // loop dello stato 3 che fa lampeggiare il LED rosso
dt2 = millis() - t2; // calcola il tempo trascorso
if (dt2 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled2 = !statoled2; // inverte lo stato di uscita del Led
digitalWrite(4, statoled2); // accende il led che cambia stato
t2 = millis(); // resetta il tempo sulla variabile contatore t2
}
}
unsigned long t3, dt3 = 0; // variabile utile per il calcolo del tempo di lampeggio del led
int statoled3 = LOW; // variabile su cui è scritto lo stato del led verde
void blinkLedVerde() { // loop dello stato 4 che fa lampeggiare il LED verde
dt3 = millis() - t3; // calcola il tempo trascorso
if (dt3 >= 300) { // se il tempo supera il valore impostato di 300mS
statoled3 = !statoled3; // inverte lo stato di uscita del Led
digitalWrite(3, statoled3); // accende il led che cambia stato
t3 = millis(); // resetta il tempo sulla variabile contatore t3
}
}