La Funzione millis() su Arduino


Arduino: funzione millis()

Qui di seguito trovi una spiegazione semplice per capire la funzione millis(), che consente di fare ritardi non bloccanti con Arduino. Iniziamo con un esempio calato sulla vita reale: immagina di trovare lavoro come operaio in una fabbrica di penne a sfera, tipo le classiche BIC. La paga sarà a cottimo, quindi più penne prodotte, più soldi guadagnati.

Il primo giorno di lavoro, il caporeparto ti fa una breve spiegazione: qui ci sono i refill pieni di inchiostro, qui i tubetti (il corpo della penna), e qui i tappi anteriori ed i tappini posteriori; montare una penna è semplice, lo sa fare chiunque: infili il refill nel tubetto, metti il tappino posteriore ed il tappo anteriore. Unico punto a cui fare attenzione, questa è la macchina automatica che riempie i refill di inchiostro: fa tutto da sola, ma ogni 27 minuti devi riempire il serbatoio dell'inchiostro premendo questo bottone.
Se lo fai troppo presto il serbatoio versa, e devi fermarti per pulire la macchina, se lo fai troppo tardi non escono abbastanza refill, pronti per montare le penne velocemente, e devi rallentare il ritmo. Quindi cerca di essere molto preciso, premilo allo scadere dei 27 minuti.
Parti subito, sono le 8,03, il serbatoio è pieno, quindi prossimo rifornimento alle 8,30.

Tu inizi a montare penne più veloce che puoi, ma ogni tanto guardi il tuo orologio, ed appena sono le 8,30, o pochi secondi dopo, riempi il serbatoio di inchiostro, e poi continui a montare penne, non prima di aver calcolato il prossimo rabbocco di inchiostro, che sarà alle 8 ,57. Buona idea è segnare su un foglietto l'ora della prossima scadenza. Continui così, per tutto il turno di lavoro, sicuro che la pila del tuo orologio continuerà a mandarlo avanti. Lo devi solo guardare ogni tanto.

Vediamo come potremmo utilizzare Arduino per far premere il pulsante ogni 27 minuti. Tanto per complicare le cose supponiamo che Arduino stia già facendo altre cose, ad esempio, interrogare ogni 10 secondi un sensore di temperatura e scrivere il valore su un display.

Arduino al suo interno ha un orologio, con caratteristiche leggermente diverse da quello che portiamo al polso. Le sue lancette non fanno un giro ogni 12 ore, ma essendo un contatore a 32 bit, incrementato ogni millisecondo (da qui il nome), dopo circa 1193 ore raggiunge il suo valore massimo (4294967295), per poi ritornare a zero e ricominciare ad incrementarsi.
Calcoliamo quanti millisecondi ci sono nei 27 minuti che passano fino alla prossima ricarica del serbatoio:
PeriodoRicarica = 27 x 60 x 1000 ovvero 1.620.000
Scriviamolo per comodità in una variabile a 32 bit (unsigned long), così lo potremo cambiare facilmente:

unsigned long PeriodoRicarica = 1620000;

Definiamo un'altra variabile dello stesso tipo, dove ci scriveremo di volta in volta, l'ora del prossimo rabbocco di inchiostro.

unsigned long ProssimoRabbocco;

Ora nel nostro setup scriviamo il primo valore del prossimo rabbocco

void setup() {
  bla bla
  // sommo 27 minuti al valore attuale dell'orologio
  ProssimoRabbocco = millis() + PeriodoRicarica ;
}

Come avrai forse intuito, scrivere millis() equivale a dire ad Arduino di guardare il suo orologio. In qualsiasi punto dello sketch puoi scrivere Serial.println(millis() , ottenendo una stampa del valore su terminale.

Nel nostro ciclo (loop), inseriamo tra le altre azioni, il ControlloRabbocco, quello che facciamo noi ogni tanto, quando guardiamo l'ora in attesa dei 27 minuti:

void loop() {
  Bla bla
  LeggiTemperatura();
  VisualizzaTemperatura();
  ControllaRabbocco();
  bla bla
}


Ecco la funzione che controlla l'orologio

void ControlloRabbocco(){
  if (millis() > ProssimoRabbocco){
    // se entriamo qui significa che sono passati i 27 minuti
    // impostiamo la prossima scadenza
    // sommo 27 minuti al valore attuale dell'orologio
    ProssimoRabbocco = millis() + PeriodoRicarica ;
   //premiamo il bottone di rabbocco
   digitalWrite(ButtonPin, HIGH);
    delay(200);
    digitalWrite(ButtonPin, LOW);
  }
}

Non ci resta che collaudarlo.
Nota bene: questa soluzione è affetta dal problema dell'Overflow, e potrebbe sbagliare se Arduino è tenuto costantemente acceso per più di 49,7 giorni (4.294.967.295 ms corrispondono a 1193,05 ore, che sono appunto 49,7 giorni). In questo caso occorre fare un tipo diverso di controllo per scongiurare il problema.
Trovi qui un approfondimento: https://www.realmeteo.com/arduino/arduino_millis_no_overflow/ .


Luciano Pautasso

Se hai gradito questa guida, clicca su una o più banner pubblicitari. Ci aiuterai a sostenere le spese per il server. GRAZIE



Cerca 


Categorie Articoli

Ultimi articoli

OPTA-FINDER-ARDUINO-COMPATIBLE   APRI 

whatsapp-alarm-repeater   APRI 

Arduino_Template_Menu_Eng   APRI 

Arduino_Template_Menu   APRI 

Power-Supply-with-Current-Control   APRI 

Vantaggi_Alimentatori-Controllo_Corrente   APRI 

Camping-La-Secca-Moneglia   APRI 

Safety-Relays   APRI 

Rele-di-sicurezza   APRI 

Internal-or-External-Watchdog   APRI 

Watchdog-interno-o-esterno   APRI 

Ripetitore-di-allarme-su-Whatsapp   APRI 

Bufala-in-crosta   APRI 

Home-Automation-ESPeriment   APRI 

ESPerimento-Domotica   APRI 

Arduino-measures-liquid-level   APRI 

Arduino-misura-livello-liquidi   APRI 

finder   APRI 

LORA-english-version   APRI 

Pluviometro-LORA   APRI 

Pillole_di_Promessi_Sposi   APRI 

LORA   APRI 

promessisposi-riscrittura   APRI 

Arduino_crashes   APRI 

Arduino_si_blocca   APRI 

Arduino_e_Trenino   APRI 

millis_no_overflow   APRI 

millis   APRI 

Arduino_millis_no_Overflow   APRI 

millis   APRI