Funzione millis() e micros().

La maggior parte degli esempi per vari moduli/sensori utilizza delay() come una "frenata" del programma, ad esempio, per inviare i dati dal sensore alla porta seriale. Sono questi esempi che rovinano la percezione del principiante e inizia anche a usare i delay(). E non andrai lontano con i delay()! 
Queste funzioni restituiscono il tempo trascorso dall'avvio del programma, il cosiddetto uptime. Abbiamo due di queste funzioni:
  • millis() - millisecondi, tipo unsigned long, da 1 a 4.294.967.295 ms (~50 giorni), risoluzione 1 ms. Dopo "overflow", il conteggio riparte da zero.
  • micros() - microsecondi, tipo unsigned long, da 4 a 4294967295 µs (~70 minuti), risoluzione 4 µs. Dopo "overflow", il conteggio riparte da zero.
Queste funzioni consentono di organizzare un programma di quasi qualsiasi complessità con un numero qualsiasi di attività eseguite in parallelo su un timer.
Utilizzando le funzioni temporali millis() o micros(), puoi organizzare un timer software, in base al quale puoi eseguire le azioni necessarie. Lo schema è questo:
  • Imposta una variabile per il timer di tipo unsigned long (uint32_t): questo è il tipo restituito da millis().
  • Cerca la differenza tra il tempo di esecuzione corrente del programma e la variabile timer.
  • Se la differenza è maggiore del periodo richiesto, eseguiamo il codice necessario e resettiamo il timer.
Tutti i costrutti seguenti possono anche funzionare con micros() per creare timer di microsecondi.
L'implementazione del classico timer si presenta così:
#define MY_PERIOD 500 // periodo
uint32_t timer1; // variabile
void setup() 
{
}
void loop() 
     if (millis() - timer1 >= MY_PERIOD) // cerca la differenza
     
          timer1 = millis(); // reset timer 
           // eseguire un'azione
      }
}
  • Questa costruzione "lascia" il periodo se ci sono ritardi e altre sezioni di blocco nel codice, durante i quali millis() ha il tempo di aumentare di un tempo maggiore del periodo del timer. Questo può essere critico, ad esempio, per il conteggio del tempo e altre situazioni simili in cui il periodo di funzionamento del timer non deve essere spostato.
  • Allo stesso tempo, se l'esecuzione del codice è bloccata per più di un periodo, l'algoritmo correggerà semplicemente questa differenza, poiché la reimpostiamo sul valore millis() corrente.
Considera alcune altre opzioni per implementare e reimpostare il timer:
Multitasking con millis().
Vogliamo eseguire un'azione due volte al secondo, la seconda - tre e la terza - 10. Abbiamo bisogno di 3 variabili timer e 3 costrutti con una condizione:
uint32_t myTimer1, myTimer2, myTimer3; // variabili
void setup() 
{
void loop() 
      if (millis() - myTimer1 >= 500) // timer per 500 ms (2 volte al secondo)
      {
      myTimer1 = millis(); // reset timer 
      // eseguire azione 1 
     
      if (millis() - myTimer2 >= 333) // timer per 333 ms (3 volte al secondo)
      {  
      myTimer2 = millis(); // reset timer
      // eseguire azione 2 
     
      if (millis() - myTimer3 >= 100) // timer per 100 ms (10 volte al secondo)
     
      myTimer3 = millis(); // reset timer 
      // eseguire azione 3 
     
}
Ed è così che possiamo, ad esempio: interrogare il sensore 10 volte al secondo, filtrare i valori e visualizzare le letture due volte al secondo. E lampeggia la luce tre volte al secondo.
Tutte le costruzioni di timer discusse sopra sopravvivono in modo sicuro alla transizione attraverso 0 e continuano a funzionare senza modificare e spostare il periodo, perché stiamo usando un tipo di dati senza segno.

Crea il tuo sito web gratis! Questo sito è stato creato con Webnode. Crea il tuo sito gratuito oggi stesso! Inizia