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
Categorie Articoli
Corso-di-elettrotecnica-ed-elettronica-3-volumi
Libro-tutto-sull-audio---inglese
Libro-ELETTRONICA-FONDAMENTALE
Dove-acquistare-abbigliamento-risparmiando
Come-vedere-le-partite-sullo-smartphone
Come-difendersi-dagli-allegati-pericolosi-nelle-email
KEEPASS-un-posto-sicuro-per-le-nostre-PASSWORD
I-3-trend-estivi-del-2020-scopri-i-tagli-che-ti-stanno-meglio
Ultimi articoli
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
Impara-Giocando APRI
Corso-di-elettrotecnica-ed-elettronica-3-volumi APRI