La prima volta è stato utilizzato un Arduino, probabilmente avete fatto qualcosa di simile a questo:
- Collegato un LED di Arduino
- Caricato il default blink schizzo che vorresti accendere e spegnere il LED ogni secondo
Questo è chiamato il programma “Ciao Mondo” di Arduino e mostra che con poche righe di codice è possibile creare qualcosa che ha un’applicazione reale.
Nell’esempio precedente, utilizzare la funzione delay() per definire gli intervalli tra l’accensione e lo spegnimento del LED.
Ecco l’affare: mentre delay () è utile e funziona per esempi di base, non dovresti usarlo nel mondo reale-Continua a leggere per imparare perché.
Come funziona la funzione delay ()
Il modo in cui funziona la funzione Arduino delay() è abbastanza semplice.
Accetta un singolo intero come argomento. Questo numero rappresenta il tempo in millisecondi che il programma deve attendere fino a passare alla riga successiva di codice.
Quando fai delay (1000) il tuo Arduino si ferma su quella linea per 1 secondo.
delay() è una funzione di blocco. Le funzioni di blocco impediscono a un programma di fare qualsiasi altra cosa fino a quando quel particolare compito non è stato completato. Se hai bisogno di più attività contemporaneamente, semplicemente non puoi usare delay ().
Se la tua applicazione richiede di leggere/salvare costantemente i dati dagli input, dovresti evitare di usare la funzione delay (). Fortunatamente c’è una soluzione.
Funzione millis() in soccorso
La funzione millis() quando viene chiamata, restituisce il numero di millisecondi trascorsi dall’avvio del programma.
Perché è utile?
Perché usando un po ‘ di matematica, puoi facilmente verificare quanto tempo è passato senza bloccare il tuo codice.
Lo schizzo qui sotto mostra come è possibile utilizzare la funzione millis() per creare un progetto blink. Si accende la luce del LED per 1000 millisecondi, e poi si spegne. Ma lo fa in un modo che non blocca.
Diamo un’occhiata più da vicino a uno schizzo di blink che funziona senza una funzione di ritardo:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Visualizza codice raw
Questo schizzo sopra può essere trovato qui e funziona sottraendo l’ora registrata precedente (previousMillis) dall’ora corrente (currentMillis). Se il resto è maggiore dell’intervallo (in questo caso, 1000 millisecondi), il programma aggiorna la variabile previousMillis all’ora corrente e accende o spegne il LED.
E poiché è un non-blocking, qualsiasi codice che si trova al di fuori di quella prima istruzione if dovrebbe funzionare normalmente.
Ora puoi capire che potresti aggiungere altre attività alla tua funzione loop() e il tuo codice lampeggerebbe ancora il LED ogni secondo.
Quale funzione si dovrebbe usare?
Abbiamo imparato due modi diversi di affrontare il tempo con Arduino. L’utilizzo delle funzioni millis () richiede un po ‘ di lavoro in più rispetto all’utilizzo di delay (). Ma i tuoi programmi non possono fare multitasking su Arduino senza di esso.