Funzione di ritardo Arduino, e perché non si dovrebbe usare

Mentre delay () è utile per le dimostrazioni di base su come funziona Arduino, non dovresti usarlo nel mondo reale. Ecco perché e cosa invece dovresti usare.

Mentre delay () è utile per le dimostrazioni di base su come funziona Arduino, non dovresti usarlo nel mondo reale.  Ecco perché e cosa invece dovresti usare.
Annuncio pubblicitario

Quando hai iniziato a imparare come sviluppare Guida introduttiva di Arduino: Guida per principianti Guida introduttiva ad Arduino: Guida per principianti Arduino è una piattaforma di prototipazione elettronica open source basata su hardware e software flessibili e facili da usare. È pensato per artisti, designer, hobbisti e chiunque sia interessato a creare oggetti o ambienti interattivi. Maggiori informazioni sull'arduino Cos'è Arduino e cosa puoi fare con esso? Cosa è Arduino e cosa puoi fare con esso? L'Arduino è un eccezionale dispositivo elettronico, ma se non ne hai mai usato uno prima, cosa sono esattamente e cosa puoi fare con uno? Per saperne di più, probabilmente hai creato un prodotto che funziona un po 'in questo modo:

Collegato al tuo Arduino sarebbe una singola luce a LED. Questo si accendeva e spegneva ogni secondo o così e continuerà fino a quando l'Arduino non viene spento. Questo è il programma "Hello World" di Arduino, e illustra perfettamente come solo poche righe di codice possano creare qualcosa di tangibile.

arduino-led

Sono anche disposto a scommettere che hai usato la funzione delay () per definire gli intervalli tra l'accensione e lo spegnimento della luce. Ma ecco il punto: mentre il ritardo è utile per le dimostrazioni di base su come funziona Arduino, non dovresti usarlo nel mondo reale. Ecco perché, e cosa invece dovresti usare.

Come funziona Delay ()

Il modo in cui funziona la funzione delay () è piuttosto semplice. Accetta un singolo numero intero Le basi della programmazione del computer 101 - Variabili e tipi di dati Le basi della programmazione per computer 101 - Variabili e tipi di dati Avendo introdotto e parlato un po 'di programmazione orientata agli oggetti prima e da dove proviene il suo omonimo, ho pensato che fosse ora di passare le basi assolute della programmazione in un modo specifico non linguistico. Questo ... Leggi altro (o numero) argomento. Questo numero rappresenta il tempo (misurato in millisecondi) che il programma dovrebbe attendere fino a passare alla riga successiva del codice.

Ma il problema è che la funzione delay () non è un buon modo per far attendere il tuo programma, perché si tratta di una cosiddetta funzione di "blocco".

La differenza tra le funzioni di blocco e non di blocco

Per illustrare il motivo per cui le funzioni di blocco sono pessime, voglio che immaginiate due chef diversi in una cucina: Henry Blocking e Eduardo NonBlocking . Entrambi fanno lo stesso lavoro, ma in modi completamente diversi.

Quando Henry fa colazione, inizia mettendo due tondi di pane nel tostapane. Quando alla fine squilla, e il pane diventa marrone dorato, Henry lo mette su un piatto e mette due uova in una padella. Ancora una volta, resta in piedi mentre l'olio si apre e i bianchi iniziano a indurirsi. Quando hanno finito, li prepara e inizia a friggere due fette di pancetta. Una volta che sono sufficientemente croccanti, li toglie dalla padella, li mette sul piatto e inizia a mangiare.

arduino-cuoco

Eduardo funziona in un modo leggermente diverso. Mentre il suo pane sta tostando, ha già iniziato a friggere uova e bacon. Invece di aspettare che un oggetto finisca di cuocere prima di passare al prossimo, sta cucinando contemporaneamente più oggetti. Il risultato finale è che Eduardo impiega meno tempo a fare colazione rispetto a Henry - e quando Henry Blocking ha finito, i toast e le uova sono diventati freddi.

È un'analogia sciocca, ma illustra il punto.

Le funzioni di blocco impediscono a un programma di fare qualsiasi altra cosa fino a quando quella particolare attività non è completata. Se si desidera che più azioni si verifichino contemporaneamente, non è possibile utilizzare delay () .

In particolare, se l'applicazione richiede di acquisire costantemente dati dai sensori collegati, è necessario fare attenzione ad evitare l'uso della funzione delay (), poiché mette assolutamente tutto in pausa.

Fortunatamente, delay () non è l'unico modo per far attendere il programma durante la codifica di Arduino.

Conosci Millis ()

La funzione millis () esegue una singola attività. Quando chiamato, restituisce (come un lungo datatype) il numero di millisecondi che sono trascorsi da quando il programma è stato lanciato. Quindi, perché è utile?

Perché utilizzando un po 'di matematica semplice, puoi facilmente "temporizzare" aspetti del tuo programma senza influire sul suo funzionamento. Quanto segue è una dimostrazione di base di come funziona millis (). Come vedrai, il programma accenderà la luce del LED per 1000 millisecondi (un secondo), quindi la spegnerà. Ma in modo cruciale, lo fa in un modo che non blocca.

Ora vediamo come funziona con Arduino.

Arduino millis-example

Questo programma, che è basato pesantemente su uno della documentazione ufficiale di Arduino, funziona sottraendo il tempo registrato precedente dall'ora corrente. Se il resto (cioè il tempo trascorso dall'ultima registrazione dell'ora) è maggiore dell'intervallo (in questo caso, 1000 millisecondi), il programma aggiorna la variabile precedenteTime sull'ora corrente e accende o spegne il LED.

E poiché è un non-blocco, qualsiasi codice che si trova al di fuori della prima istruzione if dovrebbe funzionare normalmente.

Semplice, non è vero? Nota come abbiamo creato la variabile currentTime come unsigned long. Un valore senza segno significa semplicemente che non può mai essere negativo; lo facciamo in modo che il numero massimo che possiamo memorizzare sia più grande. Per impostazione predefinita, le variabili numeriche sono firmate, il che significa che un "bit" di memoria per quella variabile viene utilizzato per memorizzare se il valore è positivo o negativo. Specificando che sarà solo positivo, abbiamo un altro extra con cui giocare.

interrupt

Finora, abbiamo appreso un modo per affrontare i tempi nel nostro programma Arduino che è meglio del delay () . Ma c'è un altro, molto meglio, ma più complesso: interruzioni . Questi hanno il vantaggio di permetterti di programmare con precisione il tuo programma Arduino e di rispondere rapidamente a un input esterno, ma in modo asincrono .

Ciò significa che viene eseguito in concomitanza con il programma principale, in attesa costante di un evento, senza interrompere il flusso del codice. Questo ti aiuta a rispondere in modo efficiente agli eventi, senza influire sulle prestazioni del processore Arduino.

Quando viene attivato un interrupt, interrompe il programma o chiama una funzione, comunemente nota come gestore di interrupt o routine di interrupt . Una volta che questo è stato concluso, il programma torna a ciò che stava succedendo.

Il chip AVR che alimenta Arduino supporta solo interrupt hardware. Si verificano quando un pin di input passa da alto a basso o quando viene attivato dai timer incorporati di Arduino.

Sembra criptico. Confuso, anche. Ma non lo è. Per vedere come funzionano, e vedere alcuni esempi di loro usati nel mondo reale, clicca la documentazione di Arduino.

Non essere bloccato

L'uso di millis () richiede un po 'di lavoro in più rispetto all'utilizzo di delay () . Ma fidati di me, i tuoi programmi ti ringrazieranno per questo, e non puoi fare il multitasking su Arduino senza di esso.

Se vuoi vedere un esempio di millis () utilizzato in un progetto Arduino reale, dai un'occhiata a Arduino Night Light e Sunrise Alarm di James Bruce. Arduino Night Light and Sunrise Progetto di allarme Arduino Night Light and Sunrise Alarm Project Oggi, prepareremo una sveglia all'alba, che ti farà svegliare dolcemente e lentamente senza ricorrere a una macchina offensiva per la produzione di rumore. Leggi di più

Abbiamo trovato altre funzioni di blocco di cui dovremmo essere prudenti? Fatemi sapere nei commenti qui sotto, e faremo chat.

Crediti fotografici: Arduino (Daniel Spiess), Chef (Ollie Svenson)

In this article