Als Sie zum ersten Mal ein Arduino-Board verwendet haben, haben Sie wahrscheinlich Folgendes getan:
- Verbunden eine LED zu ihrem Arduino
- Hochgeladen die standard blink skizze, dass würde auf und weg von ihrem LED jede sekunde
Dies ist als die „Hallo Welt“ programm von Arduino und zeigt, dass mit nur ein paar zeilen code können sie etwas, das hat eine reale welt anwendung.
Im vorhergehenden Beispiel definieren Sie mit der Funktion delay() die Intervalle zwischen dem Ein- und Ausschalten der LED.
Hier ist der Deal: Während delay() praktisch ist und für grundlegende Beispiele funktioniert, sollten Sie es wirklich nicht in der realen Welt verwenden … Lesen Sie weiter, um zu erfahren, warum.
Funktionsweise der Delay() -Funktion
Die Funktionsweise der Arduino Delay() -Funktion ist ziemlich einfach.
Es akzeptiert eine einzelne Ganzzahl als Argument. Diese Zahl gibt die Zeit in Millisekunden an, die das Programm warten muss, bis zur nächsten Codezeile übergegangen wird.
Wenn Sie verzögern (1000), stoppt Ihr Arduino auf dieser Linie für 1 Sekunde.
delay() ist eine blockierende Funktion. Blockierende Funktionen verhindern, dass ein Programm etwas anderes tut, bis diese bestimmte Aufgabe abgeschlossen ist. Wenn Sie mehrere Aufgaben gleichzeitig ausführen müssen, können Sie delay() einfach nicht verwenden.
Wenn Ihre Anwendung erfordert, dass Sie ständig Daten von Eingaben lesen / speichern, sollten Sie die Verwendung der Funktion delay() vermeiden. Zum Glück gibt es eine Lösung.
millis() -Funktion zur Rettung
Die Funktion millis() gibt beim Aufruf die Anzahl der Millisekunden zurück, die seit dem ersten Start des Programms vergangen sind.
Warum ist das sinnvoll?
Weil Sie mit etwas Mathematik leicht überprüfen können, wie viel Zeit vergangen ist, ohne Ihren Code zu blockieren.
Die folgende Skizze zeigt, wie Sie mit der Funktion millis() ein Blink-Projekt erstellen können. Es schaltet das LED-Licht für 1000 Millisekunden ein und schaltet es dann aus. Aber es tut es auf eine Weise, die nicht blockiert.
Werfen wir einen genaueren Blick auf eine Blinkskizze, die ohne Verzögerungsfunktion funktioniert:
/* 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); }}
Rohcode anzeigen
Diese Skizze oben finden Sie hier und es funktioniert, indem die zuvor aufgezeichnete Zeit (previousMillis) von der aktuellen Zeit (currentMillis) subtrahiert wird. Wenn der Rest größer als das Intervall ist (in diesem Fall 1000 Millisekunden), aktualisiert das Programm die Variable previousMillis auf die aktuelle Zeit und schaltet die LED ein oder aus.
Und da es sich um einen nicht blockierenden Code handelt, sollte jeder Code, der sich außerhalb dieser ersten if-Anweisung befindet, normal funktionieren.
Sie können jetzt verstehen, dass Sie Ihrer loop() -Funktion weitere Aufgaben hinzufügen können und Ihr Code die LED immer noch jede Sekunde blinkt.
Welche Funktion sollten Sie verwenden?
Wir haben zwei verschiedene Arten des Umgangs mit der Zeit mit dem Arduino gelernt. Die Verwendung der millis() -Funktionen erfordert im Vergleich zur Verwendung von delay () etwas mehr Arbeit. Aber Ihre Programme können nicht Multitasking auf dem Arduino ohne es tun.