første gang du brugte et Arduino-bord, gjorde du sandsynligvis noget som dette:
- tilsluttet en LED til din Arduino
- uploadet standard blink skitse, der ville tænde og slukke din LED hvert sekund
dette kaldes “Hej Verden” program af Arduino og viser, at med blot et par linjer kode kan du oprette noget, der har en virkelige verden ansøgning.
i det foregående eksempel bruger du funktionen delay() til at definere intervallerne mellem, at LED ‘ en tændes og slukkes.
her er aftalen: mens delay() er praktisk og fungerer til grundlæggende eksempler, bør du virkelig ikke bruge det i den virkelige verden… fortsæt med at læse for at lære hvorfor.
Sådan fungerer delay () – funktionen
den måde, Arduino delay () – funktionen fungerer på, er ret ligetil.
det accepterer et enkelt heltal som et argument. Dette tal repræsenterer tiden i millisekunder, som programmet skal vente, indtil det går videre til den næste kodelinje.
når du forsinker(1000), stopper din Arduino på den linje i 1 sekund.
forsinkelse() er en blokeringsfunktion. Blokeringsfunktioner forhindrer et program i at gøre noget andet, indtil den pågældende opgave er afsluttet. Hvis du har brug for flere opgaver på samme tid, kan du simpelthen ikke bruge delay().
hvis din applikation kræver, at du konstant læser/gemmer data fra input, skal du undgå at bruge funktionen delay (). Heldigvis er der en løsning.
millis () – funktion til redning
millis () – funktionen, når den kaldes, Returnerer antallet af millisekunder, der er gået siden programmet først blev startet.
Hvorfor er det nyttigt?
fordi ved at bruge nogle matematik, kan du nemt kontrollere, hvor meget tid der er gået uden at blokere din kode.
skitsen nedenfor viser, hvordan du kan bruge funktionen millis() til at oprette et blink-projekt. Det tænder LED-lyset i 1000 millisekunder, og slukker det derefter. Men det gør det på en måde, der ikke blokerer.
lad os se nærmere på en blink-skitse, der fungerer uden en forsinkelsesfunktion:
/* 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); }}
se rå kode
denne skitse ovenfor kan findes her, og den fungerer ved at trække den forrige registrerede tid (previousMillis) fra den aktuelle tid (currentMillis). Hvis resten er større end intervallet (i dette tilfælde 1000 millisekunder), opdaterer programmet den forrige millisekunder variabel til den aktuelle tid, og enten tænder eller slukker LED ‘ en.
og fordi det er en ikke-blokering, skal enhver kode, der er placeret uden for den første if-sætning, fungere normalt.
du kan nu forstå, at du kan tilføje andre opgaver til din loop () – funktion, og din kode blinker stadig LED ‘ en hvert sekund.
hvilken funktion skal du bruge?
vi har lært to forskellige måder at håndtere tiden med Arduino. Brug af millis () – funktionerne kræver lidt ekstra arbejde sammenlignet med brug af delay (). Men dine programmer kan ikke gøre multitasking på Arduino uden det.