In quest’articolo vedremo come far eseguire al nostro arduino diverse operazioni temporizzate.

Di solito quando dobbiamo dare un certo tempo tra un’operazione e un’altra usiamo il comando delay(). Questa soluzione va bene per la maggior parte degli sketch che realizziamo, ma ha un inconveniente.

Durante l’attesa l’arduino è fermo: non può eseguire alcuna istruzione, non legge lo stato dei sensori, non possiamo dargli alcun input.

Come possiamo risolvere ciò?

Possiamo usare la funzione millis().

L’idea è quella di racchiudere le diverse operazioni all’interno di funzioni, e all’inizio di ogni funzione controllare se è giunto il tempo per l’esecuzione.

Vediamo un’esempio:


int led_b, led_r, led_v, time;
boolean v, r, b;

void setup(){
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
led_b = millis();
led_r = millis();
led_v = millis();
v = false;
r = false;
b = false;
}

void loop (){
time = millis();
verde();
rosso();
blu();
}

void verde() {
if((led_v+500)<time){
v = !v;
digitalWrite(13,v);
led_v = millis();
}
}

void blu() {
if((led_b+700)<time){
b = !b;
digitalWrite(12,b);
led_b = millis();
}
}

void rosso() {
if((led_r+800)<time){
r = !r;
digitalWrite(11,r);
led_r = millis();
}
}

In questo sketch facciamo lampeggiare 3 led (ipoteticamente uno rosso, uno blu e uno verde) con frequenza differente.

Abbiamo dichiarato 3 variabili (led_b, led_v e led_r) che ciservono per tenere il tempo delle tre diverse funzioni.

Nel loop non facciamo altro che prendere il tempo ( riga 17) e chiamare le diverse funzioni. All’inizio di ogni funzione attraverso un if controlliamo che siano passati un tot di millisecondi, in caso affermativo eseguiamo il codice della funzione.

Da notare che è necessario mettere il “<” (minore) nell’if perchè potrebbe passare qualche millisecondo (per effetto di qualche istruzione o funzione in esecuzione) prima di verificare la condizione. Alla fine di ogni funzione riazzeriamo il conteggio riassegnando un nuovo valore alla variabile con la millis().

In pratica abbiamo realizzato 3 timer con le tre variabili (led_b, led_v e led_r) e contiamo il tempo indipendentemente l’una dalle altre. Da notare che nel void setup() diamo alle 3 variabili il valore dell’istante di tempo corrente, istante che per noi rappresenta il tempo di partenza per i nostri timer.

Consiglio: In questo caso non si è presentata la necessità, ma nel caso di sketch e funzioni più complesse e lunghe torna molto utile sfruttare la funzione “tab” messa a disposizione nella nostra interfaccia grafica di Arduino.