Funzione di ritardo Arduino, e perché non si dovrebbe usare
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 “Ciao mondo” programma di Arduino, e illustra perfettamente come solo poche righe di codice possano creare qualcosa di tangibile.
Sono anche disposto a scommettere che hai usato il ritardo() funzione 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 il ritardo() la funzione funziona è piuttosto semplice. Accetta un singolo numero intero Le basi della programmazione al 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 è, il ritardo() la funzione non è un buon modo per far aspettare il tuo programma, perché è noto come a “blocco” funzione.
La differenza tra le funzioni di blocco e non di blocco
Per illustrare perché le funzioni di blocco sono pessime, voglio che tu immagini due diversi chef 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 finalmente ping, e il pane diventa marrone dorato, Henry lo mette su un piatto e fa scoppiare 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.
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 più oggetti in concomitanza. 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.
Blocco le funzioni impediscono a un programma di fare qualsiasi altra cosa fino a quando quella particolare attività non è completata. Se vuoi più Azioni per succedere allo stesso tempo, semplicemente non puoi usare ritardo().
In particolare, se l'applicazione richiede di acquisire costantemente dati dai sensori collegati, è necessario fare attenzione ad evitare l'uso del ritardo() funzione, poiché si ferma assolutamente qualunque cosa.
per fortuna, ritardo() non è l'unico modo per far aspettare il tuo programma quando si scrive per Arduino.
Conosci Millis ()
Il millis () la funzione esegue una singola attività. Quando chiamato, restituisce (come a lungo datatype) il numero di millisecondi che sono trascorsi da quando il programma è stato lanciato per la prima volta. Quindi, perché è utile?
Perché usando un po 'di matematica semplice, puoi facilmente “tempo” 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.
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 il tempo precedente variabile all'ora corrente e accende o spegne il LED.
E perché è un non blocco, qualsiasi codice che si trova al di fuori di quello prima se la dichiarazione dovrebbe funzionare normalmente.
Semplice, non è vero? Nota come abbiamo creato la variabile ora attuale come un unsigned lungo. Un unsigned valore semplicemente significa 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 una “po” 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 imparato a conoscere un modo di affrontare i tempi nel nostro programma Arduino che è migliore di ritardo(). Ma c'è un altro, molto meglio, ma più complesso: interrupt. Questi hanno il vantaggio di permetterti di programmare con precisione il tuo programma Arduino e di rispondere rapidamente a un input esterno, ma in un modo asincrono maniera.
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 interrupt o un Interrompere la routine di servizio. 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
utilizzando millis () ammette un po 'di lavoro in più rispetto all'utilizzo ritardo(). 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 del mondo 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)
Scopri di più su: Arduino, programmazione.