Arduino Tutorial: Bruke millis () I Stedet for forsinkelse()

En velkjent Arduino funksjon er delay() som pauser programmet for en mengde millisekunder angitt som parameter.

millis(), på den annen side er en funksjon som returnerer mengden millisekunder som har gått siden programstart.

ved første øyekast kan du tvile på nytten av denne funksjonen. Faktum er at det er ekstremt nyttig i mange scenarier, ofte «erstatter» delay() helt. La oss først se på hvordan vi kan bruke millis() nesten akkurat som delay().

Timing problemer er ofte til stede i programmering.

Bruke 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 at koden din bare skal pause for 1000 ms på slutten av hver løkke iterasjon, er koden ovenfor litt dum. Du kan bare bruke delay(1000) i stedet. Den eneste forskjellen mellom koden over og en kode med delay(1000) på slutten er at sløyfen i koden ovenfor vil løpe ganske nøyaktig en gang hvert sekund. Sløyfen i en kode med delay(1000) vil kjøre litt mindre hyppig siden det også tar litt tid å utføre Serial.println("Hello").

Hvorfor Bruke millis() I Stedet for delay ()?

Vi vil nå se på to fordeler med millis() sammenlignet med delay().

Nøyaktig Timing

den første fordelen vi diskuterer er nøyaktig timing. Kodevis, vi dekket dette i siste kapittel. Med millis() kan vi sikre at sløyfen går så ofte vi vil, uavhengig av kjøretid (åpenbart så lenge kjøretiden er mindre tid ønsket periode). Med delay() er dette ikke mulig siden vi ikke vet hvor lenge sløyfens kjøretid er.

Nøyaktig timing som dette er veldig nyttig når du prøver på en bestemt frekvens eller kjører filtre, blant annet.

Ikke-blokkering

den andre fordelen med millis() er at den ikke hindrer oss i å kjøre kode mens «venter».

la oss si at vi vil skrive ut » Hei » over serie en gang hvert sekund mens du gjør andre ting i mellomtiden. Dette er ikke mulig med delay() siden det pauser hele koden. Her er en måte vi kan gjø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 delen av koden er ganske lik den første delen, bortsett fra at den ikke blokkerer resten av programmet når den ikke skrives ut over seriell.

Eksempel: En Enkel Planlegger

la oss skrive et enkelt eksempel der vi lager en planlegger som skriver ut bestemte biter av tekst med forskjellige 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 - ");}

her er hva de første 60 sekundene i seriell skjerm ser ut:

Dette er en fin og enkel måte å synkronisere henrettelser i koden din. Du kan også kjøre annen kode samtidig.

micros() og Overfylte

akkurat som delay() har en mikrosekund-versjon kalt delayMicroseconds(), millis() har micros(). Hvis du trenger bedre oppløsning, kan micros() være veien å gå.

vær imidlertid oppmerksom på at micros() vil overflyte etter omtrent 70 minutter, sammenlignet med millis()‘s 50 dager. Dette betyr at funksjonenes returverdier vil starte helt fra null.

Enda viktigere: for å lære hvordan du kan unngå overløp problemet helt, les dette blogginnlegget.

Sammendrag

millis() og micros() er veldig praktiske funksjoner å bruke når du arbeider med timing oppgaver. Hvis du ikke er klar over disse, kan du ende opp med å bruke delay() i stedet, noe som ikke alltid fungerer så bra (hvis i det hele tatt).

for Flere Arduino tips & triks, sjekk ut Vår Arduino Tutorials blog kategori. Følg med for Mer Arduino-relatert innhold i fremtiden også!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.