Arduino ha due comandi per mettere in pausa lo sketch, una è il delay(), che crea una pausa per i millisecondi indicati all’interno delle parentesi quindi un delay(1000); indicherà una pausa di 1 secondo, l’altro è millis();
La differenza fra i due comandi è che mentre delay() mette in pausa lo sketch per il tempo indicato senza la possibilità che Arduino possa fare altro durante quel tempo, quindi prendendo come esempio il classico lampeggio del led, una volta che Arduino arriva al delay(), si blocca per quel tempo e non farà altro, con millis(); Arduino calcola il tempo senza mettersi in pausa, quindi potrà continuare a svolgere altri comandi.
Per capire meglio colleghiamo un led ad Arduino con la classica resistenza:
Il classico lampeggio con delay(); lo trovate qui
Scriviamo lo sketch con millis()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/*HOBBYEIDDE blink con millis() hobbyeidee.altervista.org */ #define led 3 int statoled = LOW; // stato del LED int ultimo_evento = 0; // ultimo aggiornamento del led int tempoON = 1000; // tempo accensione led int tempoOFF = 500; // tempo spegnimento led void setup() { pinMode(led, OUTPUT); } void loop() { int currentMillis = millis(); if (statoled == LOW){ // controllo se il led è spento if (currentMillis - ultimo_evento > tempoOFF){ // calcolo il tempo di OFF digitalWrite(led, HIGH); // accendi il LED statoled = HIGH; // memorizza il suo stato corrente ultimo_evento = currentMillis; // aggiorna il tempo } } else { // controllo se il led è acceso if (currentMillis - ultimo_evento > tempoON){ // calcolo il tempo di ON digitalWrite(led, LOW); // spegni il LED statoled = LOW; // memorizza il suo stato corrente ultimo_evento = currentMillis; // aggiorna il tempo } } } |
Come vedete il codice è più lungo del blink con delay(), inoltre servono delle variabili per calcolare il tempo, andiamo ad analizzare lo sketch
1 2 3 4 5 6 7 |
#define led 3 int statoled = LOW; // stato del LED int ultimo_evento = 0; // ultimo aggiornamento del led int tempoON = 1000; // tempo accensione led int tempoOFF = 500; // tempo spegnimento led |
iniziamo a dichiarare le variabili:
statoled che dichiaro LOW quindi il led sarà spento.
ultimo_evento dove Arduino memorizza se il led è LOW o HIGH e la usa per la parte successiva.
tempoON il tempo che il led deve restare acceso 1000 ms.
tempoOFF il tempo che il led deve restare spento 1000 ms
Il tempo di ON e OFF in realtà in questa parte è un semplice numero intero non un tempo, ma successivamente Arduino usandolo in un calcolo in cui l’altro elemento è il tempo lo leggera come se fossero ms.
1 2 3 4 5 6 7 8 9 10 |
void loop() { int currentMillis = millis(); if (statoled == LOW){ // controllo se il led è spento if (currentMillis - ultimo_evento > tempoOFF){ // calcolo il tempo di OFF digitalWrite(led, HIGH); // accendi il LED statoled = HIGH; // memorizza il suo stato corrente ultimo_evento = currentMillis; // aggiorna il tempo } |
Analizziamo il loop:
dopo aver dichiarato una variabile denominata currentMillis con valore millis(), quindi con un valore sempre uguale all’arco di tempo passato dall’accensione di Arduino, sviluppo la parte del if dando la condizione di avere il led spento.
Se il led è spento Arduino, egge il secondo if, controlla se la condizione è vera o meno, nella condizione troviamo la variabile ultimo_evento che varia ad ogni if memorizzando il tempo a quell’istante, quindi Arduino tramite l’if controlla se il tempo attuale – il tempo dell’ultimo stato è maggiore del tempo ON o OFF e svolge il comando accende o spegne il led e memorizza la condizione del led oltre ad aggiornare la variabile currentMillis.