za pierwszym razem, gdy użyłeś płyty Arduino, prawdopodobnie zrobiłeś coś takiego:
- podłączony DIODA LED Do Arduino
- przesłał domyślny szkic blink, który włącza i wyłącza diodę LED co sekundę
nazywa się to „Hello World” program Arduino i pokazuje, że za pomocą zaledwie kilku linii kodu można stworzyć coś, co ma prawdziwą aplikację świata.
w poprzednim przykładzie funkcja delay() określa odstępy między włączaniem i wyłączaniem diody LED.
oto sprawa: chociaż delay() jest przydatna i działa dla podstawowych przykładów, naprawdę nie powinieneś używać jej w prawdziwym świecie… Czytaj Dalej, aby dowiedzieć się, dlaczego.
jak działa funkcja delay ()
sposób działania funkcji Arduino delay () jest dość prosty.
przyjmuje pojedynczą liczbę całkowitą jako argument. Liczba ta przedstawia Czas w milisekundach, jaki program musi odczekać do przejścia do następnego wiersza kodu.
po opóźnieniu (1000) Twój Arduino zatrzymuje się na tej linii na 1 sekundę.
delay() jest funkcją blokującą. Funkcje blokujące uniemożliwiają programowi robienie czegokolwiek innego, dopóki nie zakończy się to konkretne zadanie. Jeśli chcesz wykonać kilka zadań w tym samym czasie, po prostu nie możesz użyć funkcji delay().
jeśli Twoja aplikacja wymaga ciągłego odczytu / zapisywania danych z wejść, powinieneś unikać używania funkcji delay (). Na szczęście jest rozwiązanie.
funkcja Milis() na ratunek
funkcja Milis() po wywołaniu zwraca liczbę milisekund, które minęły od pierwszego uruchomienia programu.
dlaczego to jest przydatne?
ponieważ za pomocą niektórych matematyki, można łatwo sprawdzić, ile czasu minęło bez blokowania kodu.
poniższy szkic pokazuje, jak można użyć funkcji Milis() do utworzenia projektu blink. Włącza światło LED na 1000 milisekund, a następnie wyłącza. Ale robi to w sposób, który nie blokuje.
przyjrzyjmy się bliżej szkicowi blink, który działa bez funkcji opóźnienia:
/* 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); }}
Zobacz surowy kod
powyższy szkic można znaleźć tutaj i działa poprzez odjęcie poprzedniego zarejestrowanego czasu (previousMillis) od czasu bieżącego (currentMillis). Jeśli pozostała część jest większa niż interwał (w tym przypadku 1000 milisekund), program aktualizuje poprzednią zmienną Millis na bieżący czas i włącza lub wyłącza diodę LED.
a ponieważ jest to nieblokujące, każdy kod znajdujący się poza instrukcją first if powinien działać normalnie.
możesz teraz zrozumieć, że możesz dodać inne zadania do funkcji loop (), a Twój kod nadal miga DIODĄ LED co sekundę.
jakiej funkcji powinieneś użyć?
nauczyliśmy się dwóch różnych sposobów radzenia sobie z czasem z Arduino. Korzystanie z funkcji millis() wymaga trochę dodatkowej pracy w porównaniu z używaniem delay(). Ale Twoje programy nie mogą wykonywać wielozadaniowości na Arduino bez niego.