Arduino Delay-Funktion und warum Sie sie nicht verwenden sollten
Als Sie zum ersten Mal mit dem Entwickeln von Erste Schritte mit Arduino begonnen haben: Anfängerhandbuch Erste Schritte mit Arduino: Anfängerhandbuch Arduino ist eine Open-Source-Plattform für Prototyping-Elektronik, die auf flexibler, benutzerfreundlicher Hardware und Software basiert. Es ist für Künstler, Designer, Hobbyisten und alle gedacht, die interaktive Objekte oder Umgebungen erstellen möchten. Lesen Sie mehr für das Arduino Was ist Arduino und was können Sie damit machen? Was ist Arduino und was können Sie damit machen? Das Arduino ist ein bemerkenswertes kleines elektronisches Gerät, aber wenn Sie noch nie eines benutzt haben, was genau sind sie und was können Sie damit machen? Lesen Sie mehr, Sie haben wahrscheinlich ein Produkt entwickelt, das ein bisschen so funktioniert:
An Ihr Arduino angeschlossen wäre ein einzelnes LED-Licht. Dies würde sich etwa jede Sekunde ein- und ausschalten und wird fortgesetzt, bis der Arduino ausgeschaltet ist. Dies ist das “Hallo Welt” Programm von Arduino, und zeigt auf perfekte Weise, wie nur ein paar Zeilen Code etwas Erreichbares schaffen können.
Ich bin auch bereit zu wetten, dass Sie das benutzt haben verzögern() Funktion zum Definieren der Intervalle zwischen dem Ein- und Ausschalten des Lichts. Aber hier ist die Sache: Während Verzögerung für grundlegende Demonstrationen der Funktionsweise von Arduino praktisch ist, sollten Sie es wirklich nicht in der realen Welt verwenden. Hier ist warum - und was Sie stattdessen verwenden sollten.
Wie funktioniert Delay ()?
Die Art und Weise der verzögern() Funktion funktioniert ziemlich einfach. Es akzeptiert eine einzelne Ganzzahl. Die Grundlagen der Computerprogrammierung 101 - Variablen und Datentypen Die Grundlagen der Computerprogrammierung 101 - Variablen und Datentypen Nachdem ich etwas über objektorientierte Programmierung beschrieben und darüber gesprochen habe, woher der Namensgeber stammt, dachte ich, es sei an der Zeit die absoluten Grundlagen der Programmierung auf nicht-sprachspezifische Weise. Dieses… Lesen Sie mehr (oder Nummer) Argument. Diese Zahl gibt die Zeit (in Millisekunden gemessen) an, die das Programm warten soll, bis es zur nächsten Codezeile weitergeht.
Aber das Problem ist das verzögern() Funktion ist kein guter Weg, um Ihr Programm warten zu lassen, weil es das ist, was als “Blockierung” Funktion.
Der Unterschied zwischen blockierenden und nicht blockierenden Funktionen
Um zu veranschaulichen, warum Sperrfunktionen schlecht sind, möchte ich, dass Sie sich zwei verschiedene Köche in einer Küche vorstellen: Henry Blocking, und Eduardo NonBlocking. Beide machen den gleichen Job, aber auf ganz unterschiedliche Weise.
Als Henry frühstückt, legt er zwei Toastbrote in den Toaster. Wenn es endlich geht Pings, und das Brot erscheint goldbraun, Henry legt es auf einen Teller und zerbricht zwei Eier in eine Pfanne. Wieder steht er bereit, als das Öl knallt und die Weißen beginnen zu härten. Als sie fertig sind, legt er sie ab und brät zwei Speckstreifen Speck an. Sobald sie knusprig genug sind, nimmt er sie aus der Pfanne, stellt sie auf den Teller und beginnt zu essen.
Eduardo arbeitet etwas anders. Während sein Brot röstet, brät er schon seine Eier und Speck. Anstatt darauf zu warten, dass ein Gegenstand fertig ist, bevor er mit dem nächsten fortfährt, kocht er mehrere Gegenstände gleichzeitig. Das Endergebnis ist, dass Eduardo weniger Zeit zum Frühstück braucht als Henry - und als Henry Blocking fertig ist, sind der Toast und die Eier kalt geworden.
Es ist eine dumme Analogie, aber es zeigt den Punkt.
Blockierung Funktionen verhindern, dass ein Programm irgendetwas anderes tut, bis diese bestimmte Aufgabe abgeschlossen ist. Wenn du mehrere haben willst Aktionen Um gleichzeitig zu geschehen, können Sie einfach nicht verwenden verzögern().
Insbesondere wenn Sie in Ihrer Anwendung ständig Daten von angeschlossenen Sensoren erfassen müssen, sollten Sie darauf achten, die Verwendung des Systems zu vermeiden verzögern() Funktion, da es absolut pausiert alles.
Glücklicherweise, verzögern() Es ist nicht die einzige Möglichkeit, Ihr Programm warten zu lassen, wenn Sie Arduino programmieren.
Treffen Sie Millis ()
Das Millis () Funktion führt eine einzelne Aufgabe aus. Beim Aufruf kehrt es zurück (als lange Datentyp) die Anzahl der Millisekunden, die seit dem Start des Programms vergangen sind. Warum ist das so nützlich??
Denn mit ein bisschen einfacher Mathematik können Sie dies leicht tun “Zeit” Aspekte Ihres Programms ohne Auswirkungen auf die Funktionsweise. Das Folgende ist eine grundlegende Demonstration der Funktionsweise von millis (). Wie Sie sehen, schaltet das Programm das LED-Licht für 1000 Millisekunden (eine Sekunde) ein und dann aus. Aber entscheidend ist, dass es auf eine Weise funktioniert, die nicht blockiert.
Nun schauen wir uns an, wie es mit Arduino funktioniert.
Dieses Programm, das stark auf einem der offiziellen Arduino-Dokumentation basiert, arbeitet, indem es die zuvor aufgezeichnete Zeit von der aktuellen Uhrzeit subtrahiert. Wenn der Rest (dh die seit der letzten Aufzeichnung verstrichene Zeit) größer als das Intervall ist (in diesem Fall 1000 Millisekunden), aktualisiert das Programm die vorherigeZeit auf die aktuelle Uhrzeit eingestellt und schaltet die LED entweder ein oder aus.
Und weil es sich nicht um einen blockierenden Code handelt, muss der Code außerhalb des ersten Bereichs liegen wenn Aussage sollte normal funktionieren.
Einfach ist es nicht? Beachten Sie, wie wir die Variable erstellt haben aktuelle Uhrzeit als ein ohne Vorzeichen lange. Ein ohne Vorzeichen Wert bedeutet einfach, dass es niemals negativ sein kann; Wir tun dies, damit die maximale Anzahl, die wir speichern können, größer ist. Standardmäßig sind Zahlenvariablen signiert, also eins “bisschen” Speicherplatz für diese Variable wird verwendet, um zu speichern, ob der Wert positiv oder negativ ist. Durch die Angabe, dass es nur positiv ist, haben wir ein Extra-Bit zum Spielen.
Unterbricht
Bisher haben wir gelernt, wie man mit unserem Arduino-Programm das Timing besser angehen kann verzögern(). Aber es gibt einen anderen, viel besseren, aber komplexeren Weg: unterbricht. Diese haben den Vorteil, dass Sie Ihr Arduino-Programm genau festlegen können und schnell auf einen externen Eingang reagieren können, jedoch in einer asynchron Weise.
Das bedeutet, dass es in Verbindung mit dem Hauptprogramm ausgeführt wird und ständig auf das Auftreten eines Ereignisses wartet, ohne den Codefluss zu unterbrechen. Dadurch können Sie effizient auf Ereignisse reagieren, ohne die Leistung des Arduino-Prozessors zu beeinträchtigen.
Wenn ein Interrupt ausgelöst wird, stoppt er entweder das Programm oder ruft eine Funktion auf, die allgemein als bekannt ist Interrupt-Handler oder ein Serviceroutine unterbrechen. Sobald dies abgeschlossen ist, kehrt das Programm zu dem zurück, was es gerade war.
Der AVR-Chip des Arduino unterstützt nur Hardware-Interrupts. Diese treten auf, wenn ein Eingangspin von hoch nach niedrig geht oder wenn er durch die integrierten Timer des Arduino ausgelöst wird.
Es klingt kryptisch. Selbst verwirrend. Ist es aber nicht In der Arduino-Dokumentation erfahren Sie, wie sie funktionieren und wie sie in der realen Welt verwendet werden.
Lassen Sie sich nicht blockieren
Verwenden Millis () Zugegeben, erfordert im Vergleich zur Verwendung ein wenig mehr Arbeit verzögern(). Aber glauben Sie mir, Ihre Programme werden es Ihnen danken, und Sie können kein Multitasking auf dem Arduino durchführen.
Wenn Sie ein Beispiel von sehen möchten Millis () In einem realistischen Arduino-Projekt können Sie James Bruces Arduino Night Light und Sunrise Alarm überprüfen. Arduino Nachtlicht- und Sonnenaufgangswarnprojekt Arduino Nachtlicht- und Sonnenaufgangswarnprojekt Heute werden wir einen Sonnenaufgangswecker herstellen, der Sie sanft und langsam weckt, ohne auf eine anstößige Geräuschmaschine zurückzugreifen. Weiterlesen
Haben Sie andere Blockierungsfunktionen gefunden, vor denen wir vorsichtig sein sollten? Lass es mich in den Kommentaren wissen, und wir werden uns unterhalten.
Bildnachweise: Arduino (Daniel Spiess), Küchenchef (Ollie Svenson)
Erfahren Sie mehr über: Arduino, Programmierung.