SOLUZIONE:
Avevo erroneamente dichiarato ad int t0 e t1 alle quali assegnavo il risultato della funzione millis(). Cambiandolo da int a unsigned long, tutto funziona perfettamente non andando più in overflow la variabile.
Ciao a tutti. Finalmente oggi mi sono deciso ad acquistare arduino e mi sono cimentato in un piccolo esperimento.
Ho fatto un semaforo, molto easy. 3 led dei colori ovvi, verde acceso per 4 secondi, giallo per 2, rosso per 5 e daccapo.
Non capisco però come mai dopo la 3a/4a esecuzione, si blocca con il rosso acceso.
Se diminuisco il tempo, mettendo 400ms (invece di 4000) il semaforo scorre tranquillamente per molti più loops, anche se poi si blocca comunque.
E' normale? Io direi di no, ma non conoscendo bene il sistema, chiedo aiuto a voi.
A seguire il listato del sorgente. Che ne pensate?
D.
int statoSemaforo;
int t0;
int t1;
int durataRosso = 5000; //milliseconds
int durataGiallo = 2000;
int durataVerde = 4000;void setup() {
statoSemaforo = 0; //verde
t0 = millis();
t1 = durataVerde;
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
}boolean isRosso() {
return statoSemaforo == 2;
}boolean isVerde() {
return statoSemaforo == 0;
}boolean isGiallo() {
return statoSemaforo == 1;
}void switchSemaforo(int nuovoStato) {
switch (nuovoStato) {
case 0:
digitalWrite(13,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
break;
case 1:
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
break;
default :
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
break;
}
statoSemaforo = nuovoStato;
}void loop() {
if (millis() > (t0 + t1)) { //devo cambiare stato al semaforo
if (isVerde()) {
switchSemaforo(1);
t1 = durataGiallo;
}
else {
if (isGiallo()) {
switchSemaforo(2);
t1 = durataRosso;
}
else {
switchSemaforo(0);
t1 = durataVerde;
}
}
t0 = millis();
}
}