Tutorial Arduino: utilizzo di millis () invece di delay()

Una funzione Arduino ben nota è delay() che mette in pausa il programma per una quantità di millisecondi specificati come parametro.

millis(), d’altra parte, è una funzione che restituisce la quantità di millisecondi passati dall’avvio del programma.

A prima vista potresti dubitare dell’utilità di questa funzione. Il fatto è che è estremamente utile in molti scenari, spesso “sostituendo” delay() completamente. Diamo prima un’occhiata a come possiamo usare millis() quasi esattamente come delay().

I problemi di temporizzazione sono spesso presenti nella programmazione.

Utilizzando millis() come ritardo()

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {time_now = millis(); Serial.println("Hello"); while(millis() < time_now + period){//wait approx. ms}}

Se vuoi che il tuo codice si fermi per 1000 ms alla fine di ogni iterazione del ciclo, il codice sopra è un po ‘ sciocco. Puoi semplicemente usare delay(1000) invece. L’unica differenza tra il codice sopra e un codice con delay(1000) alla fine è che il ciclo nel codice sopra verrà eseguito in modo abbastanza accurato una volta al secondo. Il ciclo in un codice con delay(1000)verrà eseguito un po ‘meno frequente poiché richiede anche un po’ di tempo per eseguire Serial.println("Hello").

Perché usare millis () invece di delay ()?

Esamineremo ora due vantaggi con millis() rispetto a delay().

Tempi precisi

Il primo vantaggio che discuteremo è tempi precisi. Codice-saggio, abbiamo coperto questo nell’ultimo capitolo. Con millis() possiamo garantire che il ciclo venga eseguito tutte le volte che vogliamo, indipendentemente dal tempo di esecuzione (ovviamente purché il tempo di esecuzione sia inferiore al periodo desiderato). Con delay() questo non è possibile poiché non sappiamo quanto sia lungo il tempo di esecuzione del ciclo.

Tempi accurati come questo sono molto utili quando si campionano a una certa frequenza o si eseguono filtri, tra le altre cose.

Non bloccante

L’altro vantaggio con millis() è che non ci impedirà di eseguire il codice mentre “aspetta”.

Diciamo che vogliamo stampare “Hello” su seriale una volta al secondo mentre facciamo altre cose nel frattempo. Questo non è possibile con delay() poiché mette in pausa l’intero codice. Ecco un modo per farlo:

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_now + period){time_now += period;Serial.println("Hello");} //Run other code}

Questo blocco di codice è abbastanza simile al primo blocco, tranne che non blocca il resto del programma quando non si stampa su seriale.

Esempio: un semplice Scheduler

Scriviamo un semplice esempio in cui creiamo uno scheduler che stampa determinati bit di testo a intervalli diversi.

#define INTERVAL_MESSAGE1 5000#define INTERVAL_MESSAGE2 7000#define INTERVAL_MESSAGE3 11000#define INTERVAL_MESSAGE4 13000unsigned long time_1 = 0;unsigned long time_2 = 0;unsigned long time_3 = 0;unsigned long time_4 = 0;void print_time(unsigned long time_millis);void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_1 + INTERVAL_MESSAGE1){time_1 +=INTERVAL_MESSAGE1;print_time(time_1);Serial.println("I'm message number one!");} if(millis() >= time_2 + INTERVAL_MESSAGE2){time_2 +=INTERVAL_MESSAGE2;print_time(time_2);Serial.println("Hello, I'm the second message.");} if(millis() >= time_3 + INTERVAL_MESSAGE3){time_3 +=INTERVAL_MESSAGE3;print_time(time_3);Serial.println("My name is Message the third.");} if(millis() >= time_4 + INTERVAL_MESSAGE4){time_4 += INTERVAL_MESSAGE4;print_time(time_4);Serial.println("Message four is in the house!");}}void print_time(unsigned long time_millis){Serial.print("Time: ");Serial.print(time_millis/1000);Serial.print("s - ");}

Ecco come appaiono i primi 60 secondi nel monitor seriale:

Questo è un modo semplice e piacevole per sincronizzare le esecuzioni nel tuo codice. Siete in grado di eseguire altro codice contemporaneamente pure.

micros() e Traboccante

Proprio come delay() ha una versione a microsecondi chiamata delayMicroseconds(), millis() ha micros(). Se hai bisogno di una risoluzione migliore, micros() potrebbe essere la strada da percorrere.

Tuttavia, tieni presente che micros() traboccherà dopo circa 70 minuti, rispetto ai 50 giorni di millis(). Ciò significa che i valori di ritorno delle funzioni inizieranno da zero.

Ancora più importante: per sapere come è possibile evitare il problema di overflow alltogether, leggere questo post del blog.

Sommario

millis() e micros() sono funzioni davvero utili da utilizzare quando si tratta di compiti di temporizzazione. Se non ne sei a conoscenza, potresti finire per usare delay(), che non funzionerà sempre così bene (se non del tutto).

Per ulteriori suggerimenti Arduino & trucchi, controlla la nostra categoria blog Tutorial Arduino. Restate sintonizzati per ulteriori contenuti Arduino-correlati in futuro pure!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.