första gången du använde ett Arduino-kort gjorde du förmodligen något så här:
- ansluten en LED till din Arduino
- laddade upp standard blink sketch som skulle slå på och stänga av din LED varje sekund
detta kallas ”Hello World” – programmet för Arduino och visar att med bara några rader kod kan du skapa något som har en verklig applikation.
i det föregående exemplet använder du funktionen delay() för att definiera intervallen mellan lysdioden som tänds och släcks.
här är affären: medan delay() är praktiskt och fungerar för grundläggande exempel, borde du verkligen inte använda den i den verkliga världen… Fortsätt läsa för att lära dig varför.
hur delay () – funktionen fungerar
hur Arduino delay () – funktionen fungerar är ganska rakt framåt.
det accepterar ett enda heltal som ett argument. Detta nummer representerar tiden i millisekunder som programmet måste vänta tills det går vidare till nästa kodrad.
när du fördröjer(1000) stannar din Arduino på den linjen i 1 sekund.
delay () är en blockeringsfunktion. Blockeringsfunktioner hindrar ett program från att göra något annat tills den specifika uppgiften har slutförts. Om du behöver flera uppgifter att inträffa samtidigt kan du helt enkelt inte använda delay().
om din ansökan kräver att du ständigt läser/sparar data från ingångar, bör du undvika att använda funktionen delay (). Lyckligtvis finns det en lösning.
millis () – funktionen till undsättning
millis () – funktionen när den anropas returnerar antalet millisekunder som har passerat sedan programmet startades först.
Varför är det användbart?
eftersom du med hjälp av lite matematik enkelt kan verifiera hur mycket tid som har gått utan att blockera din kod.
skissen nedan visar hur du kan använda millis () – funktionen för att skapa ett blink-projekt. Det slår på LED-lampan i 1000 millisekunder och stänger sedan av den. Men det gör det på ett sätt som inte blockerar.
Låt oss titta närmare på en blinkskiss som fungerar utan fördröjningsfunktion:
/* 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); }}
Visa raw-kod
denna skiss ovan kan hittas här och det fungerar genom att subtrahera den tidigare inspelade tiden (previousMillis) från den aktuella tiden (currentMillis). Om återstoden är större än intervallet (i det här fallet 1000 millisekunder) uppdaterar programmet den föregåendemillis-variabeln till den aktuella tiden och slår antingen på eller av lysdioden.
och eftersom det är en icke-blockerande, någon kod som ligger utanför det första if-uttalandet ska fungera normalt.
du kan nu förstå att du kan lägga till andra uppgifter i din loop () – funktion och din kod skulle fortfarande blinka lysdioden varje sekund.
vilken funktion ska du använda?
vi har lärt oss två olika sätt att hantera tiden med Arduino. Att använda millis () – funktionerna tar lite extra arbete jämfört med att använda delay(). Men dina program kan inte göra multitasking på Arduino utan det.