Arduino Delay-Funktion, und warum Sie es nicht verwenden sollten

Während delay () praktisch ist für grundlegende Demonstrationen, wie Arduino funktioniert, sollten Sie es wirklich nicht in der realen Welt verwenden. Hier ist warum, und was Sie stattdessen verwenden sollten.

Während delay () praktisch ist für grundlegende Demonstrationen, wie Arduino funktioniert, sollten Sie es wirklich nicht in der realen Welt verwenden.  Hier ist warum, und was Sie stattdessen verwenden sollten.
Werbung

Erste Schritte mit Arduino: Ein Anfängerhandbuch Erste Schritte mit Arduino: Ein Anfängerhandbuch Arduino ist eine Open-Source-Prototyping-Plattform für Elektronik, die auf flexibler, benutzerfreundlicher Hardware und Software basiert. Es richtet sich an Künstler, Designer, Bastler und alle, die interaktive Objekte oder Umgebungen erstellen möchten. Lesen Sie mehr für den Arduino Was ist Arduino und was können Sie damit tun? Was ist Arduino und was können Sie damit machen? Der Arduino ist ein bemerkenswertes kleines elektronisches Gerät, aber wenn Sie noch nie zuvor eines verwendet haben, was genau sind sie und was können Sie mit einem tun? Lesen Sie mehr, Sie haben wahrscheinlich ein Produkt gebaut, das ein bisschen wie folgt funktioniert:

Verbunden mit Ihrem Arduino wäre ein einzelnes LED-Licht. Dies würde jede Sekunde oder so ab und wird fortgesetzt, bis der Arduino ausgeschaltet ist. Dies ist das "Hello World" -Programm von Arduino und zeigt perfekt, wie nur ein paar Zeilen Code etwas Greifbares erzeugen können.

Arduino-geführt

Ich wette auch, dass Sie die Funktion delay () verwendet haben, um die Intervalle zwischen dem Ein- und Ausschalten des Lichts zu definieren. Aber hier ist die Sache: Während Verzögerung ist praktisch für grundlegende Demonstrationen, wie Arduino funktioniert, sollten Sie es wirklich nicht in der realen Welt verwenden. Hier ist warum - und was Sie stattdessen verwenden sollten.

Wie funktioniert Delay ()?

Die Funktionsweise der Funktion delay () ist ziemlich einfach. Die Grundlagen der Computerprogrammierung 101 - Variablen und Datentypen Die Grundlagen der Computerprogrammierung 101 - Variablen und Datentypen Nachdem ich etwas über objektorientierte Programmierung eingeführt und darüber gesprochen habe und woher der Name stammt, dachte ich, es ist Zeit, dass wir es durchmachen die absoluten Grundlagen der Programmierung in einer nicht sprachspezifischen Weise. This ... Read More (oder Nummer) Argument. Diese Zahl repräsentiert die Zeit (gemessen in Millisekunden), die das Programm bis zur nächsten Codezeile warten soll.

Aber das Problem ist, dass die Funktion delay () keine gute Methode ist, um Ihr Programm warten zu lassen, denn es handelt sich um eine sogenannte "blockierende" 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 die gleiche Arbeit, aber auf ganz andere Weise.

Als Henry Frühstück macht, legt er zwei Brotscheiben in den Toaster. Als es endlich klingelt und das Brot goldbraun herausspringt, legt Henry es auf einen Teller und knackt zwei Eier in eine Bratpfanne. Wiederum steht er bei, wie das Öl knallt, und die Weißen beginnen zu verhärten. Als sie fertig sind, legt er sie auf und beginnt zwei Speckscheiben zu braten. Sobald sie ausreichend knusprig sind, nimmt er sie aus der Pfanne, legt sie auf den Teller und beginnt zu essen.

Arduino-Koch

Eduardo funktioniert etwas anders. Während sein Brot toastet, hat er schon angefangen, seine Eier und seinen Speck zu braten. Anstatt zu warten, bis ein Gegenstand fertig gekocht ist, bevor er zum nächsten übergeht, kocht er mehrere Gegenstände gleichzeitig . Das Endergebnis ist, dass Eduardo weniger Zeit braucht, um Frühstück zu machen, als Henry - und als Henry Blocking fertig ist, sind der Toast und die Eier kalt geworden.

Es ist eine alberne Analogie, aber es veranschaulicht den Punkt.

Blockierungsfunktionen verhindern, dass ein Programm etwas anderes tut, bis diese bestimmte Aufgabe abgeschlossen ist. Wenn Sie möchten, dass mehrere Aktionen gleichzeitig ausgeführt werden, können Sie delay () einfach nicht verwenden.

Insbesondere wenn Ihre Anwendung erfordert, dass Sie ständig Daten von angeschlossenen Sensoren erfassen, sollten Sie darauf achten, die Funktion delay () zu vermeiden, da sie absolut alles pausiert.

Glücklicherweise ist delay () nicht die einzige Möglichkeit, um beim Programmieren auf Arduino zu warten.

Treffen Sie Millis ()

Die Funktion millis () führt eine einzelne Aufgabe aus. Wenn sie aufgerufen wird, gibt sie (als langen Datentyp) die Anzahl der Millisekunden zurück, die seit dem ersten Start des Programms verstrichen sind. Also, warum ist das nützlich?

Denn mit ein wenig einfacher Mathematik können Sie Aspekte Ihres Programms einfach "zeitlich abmessen", ohne die Funktionsweise zu beeinträchtigen. Das Folgende ist eine grundlegende Demonstration der Funktionsweise von millis (). Wie Sie sehen werden, schaltet das Programm das LED-Licht für 1000 Millisekunden (eine Sekunde) ein und dann aus. Aber entscheidend ist, dass es nicht blockierend ist.

Sehen wir uns jetzt an, wie es mit Arduino funktioniert.

Arduino-Millis-Beispiel

Dieses Programm - das stark auf einem aus der offiziellen Arduino-Dokumentation basiert - arbeitet, indem es die vorher aufgezeichnete Zeit von der aktuellen Zeit subtrahiert. Wenn der Rest (dh die Zeit, die seit der letzten Aufzeichnung vergangen ist) größer ist als das Intervall (in diesem Fall 1000 Millisekunden), aktualisiert das Programm die Variable previousTime auf die aktuelle Zeit und schaltet entweder die LED ein oder aus.

Und da es nicht blockierend ist, sollte jeder Code, der sich außerhalb dieser ersten if-Anweisung befindet, normal funktionieren.

Einfach, nicht wahr? Beachten Sie, wie wir die Variable currentTime als unsigned long erstellt haben. Ein vorzeichenloser Wert bedeutet einfach, dass er niemals negativ sein kann. Wir machen das so, dass die maximale Anzahl, die wir speichern können, größer ist. Standardmäßig sind Zahlenvariablen signiert, was bedeutet, dass ein "Bit" des Speichers für diese Variable verwendet wird, um zu speichern, ob der Wert positiv oder negativ ist. Durch Angabe wird es nur positiv, wir haben ein zusätzliches Bit zu spielen.

Unterbricht

Bisher haben wir in unserem Arduino-Programm etwas über das Timing gelernt, das besser ist als delay () . Aber es gibt einen anderen, viel besseren Weg, aber komplexer: Interrupts . Diese haben den Vorteil, dass Sie Ihr Arduino-Programm genau zeitlich einstellen und schnell auf eine externe Eingabe reagieren können, jedoch auf asynchrone Weise.

Das bedeutet, dass es in Verbindung mit dem Hauptprogramm ausgeführt wird und ständig auf ein Ereignis wartet, ohne den Fluss des Codes 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 es entweder das Programm oder ruft eine Funktion auf, die allgemein als Interrupt-Handler oder Interrupt-Service-Routine bekannt ist . Sobald dies abgeschlossen ist, geht das Programm dann zurück, was es vorhatte.

Der AVR-Chip, der den Arduino mit Strom versorgt, unterstützt nur Hardware-Interrupts. Diese treten auf, wenn ein Eingangspin von hoch auf tief geht oder wenn er von den eingebauten Timern des Arduino ausgelöst wird.

Es klingt kryptisch. Verwirrend, sogar. Aber es ist nicht. Sehen Sie sich die Arduino-Dokumentation an, um zu sehen, wie sie funktionieren, und sehen Sie, wie sie in der realen Welt verwendet werden.

Nicht blockiert werden

Die Verwendung von millis () erfordert zugegebenermaßen ein wenig zusätzliche Arbeit im Vergleich zur Verwendung von delay () . Aber vertrau mir, deine Programme werden dir dafür danken, und du kannst kein Multitasking auf dem Arduino ohne es tun.

Wenn Sie ein Beispiel für millis () in einem realen Arduino-Projekt sehen möchten, schauen Sie sich das Arduino Night Light und den Sunrise Alarm von James Bruce an. Arduino Nachtlicht und Sonnenaufgang Alarm Projekt Arduino Nachtlicht und Sonnenaufgang Alarm Projekt Heute machen wir einen Sonnenaufgang Wecker, der sanft und langsam weckt Sie ohne auf eine offensive Geräuschmaschine zurückgreifen. Weiterlesen

Haben Sie andere blockierende Funktionen gefunden, vor denen wir uns hüten sollten? Lass es mich in den Kommentaren unten wissen und wir werden uns unterhalten.

Bildnachweis: Arduino (Daniel Spiess), Küchenchef (Ollie Svenson)

In this article