Arduino Tutorial: brug millis () i stedet for forsinkelse()

en velkendt Arduino-funktion er delay(), som sætter programmet på pause i en mængde millisekunder angivet som parameter.

millis(), på den anden side er en funktion, der returnerer mængden af millisekunder, der er gået siden programstart.

ved første øjekast kan du tvivle på nytten af denne funktion. Faktum er, at det er yderst nyttigt i mange scenarier, ofte “erstatter” delay() helt. Lad os først se på, hvordan vi kan bruge millis() næsten nøjagtigt som delay().

Timingproblemer er ofte til stede i programmeringen.

brug af millis () som forsinkelse()

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {time_now = millis(); Serial.println("Hello"); while(millis() < time_now + period){//wait approx. ms}}

hvis du vil have din kode til bare pause for 1000 ms i slutningen af hver loop-iteration, er koden ovenfor lidt fjollet. Du kan bare bruge delay(1000) i stedet. Den eneste forskel mellem koden ovenfor og en kode med delay(1000) i slutningen er, at sløjfen i ovenstående kode kører ganske nøjagtigt en gang hvert sekund. Sløjfen i en kode med delay(1000) vil køre lidt mindre hyppigt, da det også tager lidt tid at udføre Serial.println("Hello").

Hvorfor bruge millis () i stedet for forsinkelse ()?

vi vil nu se på to fordele med millis() sammenlignet med delay().

nøjagtig Timing

den første fordel, vi vil diskutere, er nøjagtig timing. Kodemæssigt dækkede vi dette i det sidste kapitel. Med millis() kan vi sikre, at sløjfen kører så ofte som vi vil, uanset udførelsestiden (selvfølgelig så længe udførelsestiden er mindre tid den ønskede periode). Med delay() er dette ikke muligt, da vi ikke ved, hvor lang tid sløjfeudførelsestiden er.

nøjagtig timing som denne er meget nyttig, når man blandt andet prøver på en bestemt frekvens eller kører filtre.

ikke-blokerende

den anden fordel med millis() er, at det ikke forhindrer os i at køre kode, mens vi “venter”.

lad os sige, at vi vil udskrive “Hej” over seriel en gang hvert sekund, mens vi laver andre ting i mellemtiden. Dette er ikke muligt med delay(), da det sætter hele koden på pause. Her er en måde, vi kan gøre dette på:

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_now + period){time_now += period;Serial.println("Hello");} //Run other code}

denne del af koden ligner den første del, bortset fra at den ikke blokerer resten af programmet, når den ikke udskrives over seriel.

eksempel: en simpel planlægger

lad os skrive et simpelt eksempel, hvor vi opretter en planlægger, der udskriver bestemte tekststykker med forskellige intervaller.

#define INTERVAL_MESSAGE1 5000#define INTERVAL_MESSAGE2 7000#define INTERVAL_MESSAGE3 11000#define INTERVAL_MESSAGE4 13000unsigned long time_1 = 0;unsigned long time_2 = 0;unsigned long time_3 = 0;unsigned long time_4 = 0;void print_time(unsigned long time_millis);void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_1 + INTERVAL_MESSAGE1){time_1 +=INTERVAL_MESSAGE1;print_time(time_1);Serial.println("I'm message number one!");} if(millis() >= time_2 + INTERVAL_MESSAGE2){time_2 +=INTERVAL_MESSAGE2;print_time(time_2);Serial.println("Hello, I'm the second message.");} if(millis() >= time_3 + INTERVAL_MESSAGE3){time_3 +=INTERVAL_MESSAGE3;print_time(time_3);Serial.println("My name is Message the third.");} if(millis() >= time_4 + INTERVAL_MESSAGE4){time_4 += INTERVAL_MESSAGE4;print_time(time_4);Serial.println("Message four is in the house!");}}void print_time(unsigned long time_millis){Serial.print("Time: ");Serial.print(time_millis/1000);Serial.print("s - ");}

Sådan ser de første 60 sekunder i seriel skærm ud:

dette er en god og nem måde at synkronisere henrettelser i din kode. Du kan også køre anden kode samtidigt.

micros() og overfyldte

ligesom delay() har en mikrosekund-version kaldet delayMicroseconds(), millis()har micros(). Hvis du har brug for bedre opløsning, kan micros() være vejen at gå.

Vær dog opmærksom på, at micros()vil løbe over efter cirka 70 minutter sammenlignet med millis() 50 dage. Dette betyder, at funktionernes returværdier starter forfra fra nul.

endnu vigtigere: for at lære, hvordan du kan undgå overløbsproblemet alltogether, Læs dette blogindlæg.

Resume

millis() og micros() er virkelig praktiske funktioner, der skal bruges, når man beskæftiger sig med timingopgaver. Hvis du ikke er opmærksom på disse, kan du ende med at bruge delay() i stedet, hvilket ikke altid fungerer så godt (hvis overhovedet).

for flere Arduino tips & tricks, tjek vores Arduino Tutorials blog kategori. Hold øje med mere Arduino-relateret indhold i fremtiden også!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.