/*
esempio di programmazione a stati, con funzione "Switch...break" che permette di saltare direttamente alla
porzione di programma indipendente selezionata.
Viller Broccoli
*/
int stato = 0; // variabile il cui valore fa commutare il relativo case , parte da 0.
void setup() {
pinMode(3, OUTPUT); // assegnazione dei pin
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(2, INPUT);
Serial.print(9600); // attiva la stampa su schermo a 9600 bps
}
void loop() {
// funzione che permette la commutazione sui diversi stati (case) in base al valore della variabile "stato"
switch(stato){
case 0:
// la funzione switch indirizza al case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
blinkLedGiallo();
break;
case 1:
// la funzione switch indirizza al case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
blinkLedBlu();
break;
case 2:
// la funzione switch indirizza al case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
blinkLedRosso();
break;
case 3:
// la funzione switch indirizza al case 0 e cicla il programma all'interno del loop "blinkLedGiallo()"
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 >= 1000) { // se il tempo supera il valore impostato di 1000mS
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
}
if (digitalRead(2)) { // controlla se il pulsante viene premuto
digitalWrite(6, LOW); // Spegne l'uscita del led giallo
stato = 1; // cambia stato per passare allo stato sucessivo "case 1"
delay (200); // un piccolo ritardo per aumentare la percezione del pulsante premuto
}
}
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 >= 1000) { // se il tempo supera il valore impostato di 1000mS
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
}
if (digitalRead(2)) { // controlla se il pulsante viene premuto
digitalWrite(5, LOW); // Spegne l'uscita del led blu
stato = 2; // cambia stato per passare allo stato sucessivo "case 2"
delay (200); // un piccolo ritardo per aumentare la percezione del pulsante premuto
}
}
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 >= 1000) { // se il tempo supera il valore impostato di 1000mS
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
}
if (digitalRead(2)) { // controlla se il pulsante viene premuto
digitalWrite(4, LOW); // Spegne l'uscita del led rosso
stato = 3; // cambia stato per passare allo stato sucessivo "case 3"
delay (200); // un piccolo ritardo per aumentare la percezione del pulsante premuto
}
}
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 >= 1000) { // se il tempo supera il valore impostato di 1000mS
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
}
if (digitalRead(2)) { // controlla se il pulsante viene premuto
digitalWrite(3, LOW); // Spegne l'uscita del led verde
stato = 0; // cambia stato per passare allo stato sucessivo "case 4"
delay (200); // un piccolo ritardo per aumentare la percezione del pulsante premuto
}
}