Molti programmi per Arduino utilizzano il comando delay(), ma questo approccio può rallentare il loop principale, riducendo la reattività del microcontrollore. Fortunatamente, esistono strategie avanzate per eseguire più operazioni in parallelo senza bloccare il codice.
In questa guida, esploreremo la programmazione non bloccante, una tecnica utile per migliorare le prestazioni del tuo sketch Arduino.
Indice dei contenuti
Perché Evitare delay() in Arduino?
Il comando delay(ms) ferma l’esecuzione del codice per un determinato numero di millisecondi, impedendo l’esecuzione di altre istruzioni nel frattempo. Questo può essere un problema in progetti che richiedono:
- Gestione di più eventi contemporaneamente (es. lettura di sensori, controllo di motori, comunicazione seriale).
- Reattività elevata (es. robotica, domotica, giochi interattivi).
- Ottimizzazione dell’uso della CPU per ridurre sprechi di risorse.
Soluzione: Usare millis()
Il segreto per evitare delay() è utilizzare la funzione millis(), che restituisce il tempo trascorso dall’accensione di Arduino in millisecondi. millis() restituisce un timer vita che viene attivato in automatico all’accensione della nostra basetta. Essendo un valore potenzialmente molto grande è bene utilizzare una variabile long per contenerlo.
Come Funziona?
- Salviamo il tempo corrente utilizzando
millis(). - Confrontiamo il tempo attuale con l’ultimo evento eseguito.
- Se è trascorso abbastanza tempo, eseguiamo l’azione desiderata e aggiorniamo il valore registrato.
Esempio Pratico: Lampeggio di un LED senza delay()
Ecco un semplice esempio di codice che accende e spegne un LED ogni secondo senza bloccare l’esecuzione del programma, contemporaneamente alla possibilità di attivare un bottone che accende un altro led.
/*
* Questo sketch permette di eliminare i delay bloccanti ma di avere
* una temporizzazione di un led senza bloccarlo nel lampeggio
* così da poter eseguire un'operazione fintamente in parallelo
*/
const int BOTTONE = 2;
const int LEDROSSO = 10; //led che si accende al click
const int LEDVERDE = 13; //led che lampeggia
const int DELAY= 1000;
int tempoPassato = 0;
void setup()
{
pinMode(LEDROSSO, OUTPUT);
pinMode(LEDVERDE, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int bottone = digitalRead(BOTTONE);
digitalWrite(LEDROSSO, bottone);
//millis() legge il tempo del sistema
//questa if viene eseguita
int tempoAttuale = millis();
if (tempoAttuale - tempoPassato >= DELAY)
{
//eseguo il codice che avrei dovuto fare senza delay
digitalWrite(LEDVERDE, !digitalRead(LEDVERDE));
tempoPassato = millis();
}
}Vantaggi della Programmazione Non Bloccante
✅ Migliore efficienza: Il microcontrollore può eseguire altre istruzioni mentre attende il tempo impostato.
✅ Maggiore reattività: Puoi gestire più eventi contemporaneamente.
✅ Codice più scalabile: Perfetto per progetti complessi come la comunicazione con sensori o il controllo di più dispositivi.
Conclusione
Se vuoi migliorare le prestazioni di Arduino e rendere il tuo codice più efficiente, la programmazione non bloccante con millis() è una tecnica essenziale. Evitare delay() permette di sviluppare progetti avanzati, ottimizzando il tempo di esecuzione del microcontrollore.
Ultima modifica 31 Marzo 2025




