Terza opzione per azzerare il timer.
Perfezioniamo il secondo timer: puoi calcolare quanti periodi servono per "aggiornare" la variabile timer. Ad esempio in questo modo:
#define MY_PERIOD 500 // periodo in ms
uint32_t timer1; // variabile
void setup()
{
}
void loop()
{
uint32_t timerLeft = millis() - timer1;
if (timerLeft >= MY_PERIOD)
{
timer1 += MY_PERIOD * (timerLeft / MY_PERIOD);
// eseguire l'azione
}
}
- Qui calcola in anticipo il tempo trascorso dall'ultima operazione e lo scrive nella variabile timerLeft, perché sarà ancora necessario. Alla variabile timer aggiungiamo il periodo moltiplicato per il numero di overflow. Se la chiamata timer non è stata saltata, verrà moltiplicata per 1.
- La divisione intera (timerLeft / MY_PERIOD) ti consente di ottenere un numero intero di overflow, quindi le parentesi sono esattamente questo.
- Questa costruzione del timer consente di osservare rigorosamente il periodo di esecuzione e non teme le chiamate perse, ma richiede calcoli aggiuntivi, inclusa la "costosa"
divisione.
