Arduino Delay [Tutorial]

i denne opplæringen vil du lære hvordan du skal bruke delay() funksjon for å legge til noen forsinkelse mellom 2 handlinger I arduino programmer. Da vil du oppdage hvorfor det å bruke delay() ofte ikke er en god ide når du vil lage programmene dine, og hvordan du kan fikse det.

Ok, la oss komme i gang!

Innholdsfortegnelse

Hvorfor trenger du forsinkelser I Arduino-programmene dine?

vel, et Arduino-program er avhengig av eksterne innganger / utganger for å fungere.

Ta et enkelt eksempel: du vil kanskje overvåke tilstanden til en trykknapp 100 ganger per sekund, eller få EN LED til å blinke hvert 0,5 sekund.

Nå, Hvordan kan du oppnå det? En Arduino programmer fungerer som dette:

  • først utføres funksjonen setup() en gang.
  • deretter utføres loop() – funksjonen igjen og igjen, til Du slår Av Arduino.

ethvert program du skriver vil bli utført med full fart. Så hvis DU lager EN LED-blink i koden din, vil DET skje AT LYSDIODEN blinker med svært høy hastighet(minst flere tusen ganger per sekund).

lærer Du Hvordan Du bruker Arduino til å bygge dine egne prosjekter?

Sjekk Ut Arduino For Nybegynnere og lær trinnvis.

hvis du vil kontrollere tiden – det vil si at LYSDIODEN blinker bare hvert 0,5 sekund og ikke i full fart – må du legge til litt forsinkelse i koden din.

Implementere Arduino delay i koden

arduino delay () – funksjonen

her er en kode for Å få EN LED-blink (her velger vi den innebygde LED, trenger ikke å legge til noen ekstern LED) hvert 0,5 sekund – dette er et av de vanligste eksemplene du vil se om Du begynner Med Arduino.

#define LED_PIN 13void setup() { pinMode(LED_PIN, OUTPUT);}void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500);}

Så, hvordan fungerer denne koden?

først bruker du en «definer», slik at du ikke trenger å kode nummeret «13» flere ganger i koden din, og det gjør programmet mer lesbart.

du konfigurerer modusen for pinnen TIL UTGANG med pinMode() – funksjonen.

i funksjonen loop() kan du:

  1. Strøm PÅ LED
  2. Bruk delay(500) for å få programmet til å sove i 500 millisekunder, eller 0,5 sekunder
  3. Slå AV LED
  4. Bruk delay(500) for å få programmet til å sove igjen i 0,5 sekunder
  5. Og gå tilbake til trinn 1, fordi loop() – funksjonen fortsetter å bli utført igjen og igjen.

funksjonen delay() forventer at du gir et antall millisekunder – ikke sekunder-å sove. Så, hvis du tenker på sekunder, så multipliser tallet med 1000 og du har verdien du trenger.

Lag En arduino forsinkelse i 1 minutt

hvis Du vil gjøre Din Arduino søvn i 1 minutt, eller i flere minutter, så er det ganske enkelt.

ta antall minutter, multipliser det med 60 for å få antall sekunder, og multipliser det med 1000 for å få antall millisekunder.

Ex: delay(3 * 60 * 1000); vil gjøre programmet sove i 3 minutter.

funksjonen Arduino delayMicroseconds ()

hvis du må være mer presis, må du kanskje bruke funksjonen delayMicroseconds(). Med delayMicroseconds() kan du gi et antall mikrosekunder å sove. Minimumsvarigheten for delay() er 1 millisekund, så hvis du trenger å sove i bare 400 mikrosekunder, har du en ny løsning.

denne funksjonen kan være svært nyttig når du kommuniserer med enkelte maskinvarekomponenter. For Eksempel Må Arduino sende noen data til komponenten og deretter lese noe svar. La oss si at komponenten trenger 6 mikrosekunder for å behandle forespørselen og levere nøyaktige data.

så i programmet ditt kan du ha noe slikt:

...void loop() { // send data to component delayMicroseconds(6); // reach out to component again to read data}

Non blocking delay – hvorfor du bør unngå å bruke delay()

så nå som du forstår hva som er en forsinkelse I Arduino, og hvordan du implementerer den med delay() og delayMicroseconds(), la oss se hvordan du bruker forsinkelsesfunksjonaliteten-men uten disse funksjonene.

Hvorfor?

når du bruker delay(), vil utførelsen av programmet stoppe, og bare fortsette etter at forsinkelsen er ferdig.

Dette ER OK hvis du bare har en handling å gjøre-eksempel: blink en ENKELT LED – men hva om du trenger å ta vare på flere maskinvarekomponenter eller kommunisere med Andre enheter som Arduino-kort eller din egen datamaskin?

Ved hjelp av forrige eksempel, hvordan kan DU få EN LED til å blinke hvert 0,5 sekund, og en annen blinke hvert 0,8 sekund?

I så fall vil du bli sittende fast ganske raskt. Hvis du fortsatt vil bruke delay(), kan du finne en løsning der du bruker kortere forsinkelser mellom flere handlinger, men dette vil gjøre programmet mer komplisert hver gang du legger til en ny handling.

løsningen på det er ganske enkelt å overvåke tiden uten å bruke funksjonen delay(), i utgangspunktet for å finne en måte å reprodusere oppførselen til delay() uten å bruke den.

Kodeeksempel-Arduino forsinkelse uten forsinkelse ()

La oss omskrive vårt blink LED-eksempel uten å bruke delay().

#define LED_PIN 13unsigned int lastTimeLedBlinked = millis();unsigned int delayBetweenBlink = 500;byte ledState = LOW;void setup() { pinMode(LED_PIN, OUTPUT);}void loop() { unsigned int timeNow = millis(); if (timeNow - lastTimeLedBlinked > delayBetweenBlink) { if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(LED_PIN, ledState); lastTimeLedBlinked = timeNow; }}

la oss analysere denne kodelinjen for linje.

Initialisering

#define LED_PIN 13unsigned int lastTimeLedBlinked = millis();unsigned int delayBetweenBlink = 500;byte ledState = LOW;

først initialiserer du 3 variabler i det globale området:

  • lastTimeLedBlinked: denne variabelen vil bli brukt til å lagre siste GANG LED blunket. I utgangspunktet, hver GANG VI får LYSDIODEN til å blinke, oppdaterer vi denne variabelen med gjeldende tid-ved hjelp av millis () – funksjonen.
  • delayBetweenBlink: dette er tiden du vil vente mellom 2 handlinger – her er handlingen å blinke LYSDIODEN.
  • ledState: vi må lagre dagens LED-tilstand (HØY eller LAV) slik at vi kan vite hva som var den forrige tilstanden,og handle deretter.

Hvorfor i det globale omfanget? Vel, det vi planlegger å gjøre er å oppdatere disse variablene i loop() – funksjonen og få tilgang til dem igjen neste gang vi går inn i loop(). Hvis vi lager variablene inne i loop(), vil variablene være lokale variabler og dermed bli ødelagt når du avslutter loop() – funksjonen. Dermed neste gang loop() kalles igjen, vil alle verdier gå tapt, og du vil opprette variabler igjen uten tidligere verdi inne. Her, ved å lage variablene utenfor funksjonen, kan vi få dem til å» overleve » og beholde verdien hver gang vi går inn i loop().

Implementere arduino delay-funksjonaliteten i loop-funksjonen

Nå, la oss se hva som skjer i funksjonen loop().

void loop() { unsigned int timeNow = millis();

først leser du gjeldende klokkeslett med millis() – funksjonen.

 if (timeNow - lastTimeLedBlinked > delayBetweenBlink) {

og nå sammenligner du gjeldende tid du nettopp har lest, med forrige GANG LED-lampen blinket. Hvis nok tid har gått (mer enn verdien lagret i delayBetweenBlink), betyr det at du kan skrive inn if().

denne kodestrukturen – leser tiden og sammenligner den med forrige gang du har gjort en handling – er hvordan du erstatter funksjonen delay(). I utgangspunktet beregner du bare en varighet her. Og som du kan se betyr det at programmet inneholder flere linjer for et enkelt program, men det gir deg mye mer kontroll og det er mye mer skalerbar.

så, hva vil skje? Vel, loop() vil fortsette å bli henrettet i full fart. Hver gang, vil programmet sjekke om nok tid har gått. Hvis ikke, slutter loop() her, fordi det ikke kommer inn i if-strukturen.

Og når akkurat nok tid har gått, går vi inn i if().

Utfører handlingen

 if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(LED_PIN, ledState);

OK, du har nettopp skrevet inn if(), og dette hvor du vil gjøre hva du trenger å gjøre.

HER får VI LYSDIODEN til å blinke. Og fordi vi ikke kan vite direkte hva SOM var den forrige tilstanden FOR LED (siden vi har skrevet inn loop() mange ganger og mistet alle lokale variabler opprettet inne), får vi den tilstanden fra en global variabel.

det vi gjør med denne globale variabelen er enkelt: hvis DEN VAR LAV, satte VI DEN TIL HØY, og hvis DEN VAR HØY, satte VI DEN TIL LAV. Og så oppdaterer vi selvfølgelig den fysiske LED-tilstanden tilsvarende, med digitalWrite().

 lastTimeLedBlinked = timeNow; }}

Til Slutt, og Dette er super viktig, lagrer vi gjeldende tid som siste gang vi blinket LYSDIODEN. Hvis vi ikke gjør det da programmet vil blinke LED i full fart fordi tilstanden inne i if() vil alltid være sant.

ved å sette forrige tid til gjeldende tid, «tilbakestill timeren».

så i dette eksemplet vil if() bare bli oppgitt hvert 500 millisekunder, eller 0,5 sekunder.

og nå er dette bra fordi programmet ikke stopper, slik at du kan fortsette å utføre forskjellige uavhengige handlinger mens du fortsatt «venter» for å blinke LYSDIODEN.

2 handlinger «samtidig»

la oss for eksempel si at du vil blinke EN LED hver 0.5 sekund, og en annen hvert 0,8 sekund.

#define LED_1_PIN 13#define LED_2_PIN 10unsigned int lastTimeLed1Blinked = millis();unsigned int delayBetweenBlink1 = 500;byte led1State = LOW;unsigned int lastTimeLed2Blinked = millis();unsigned int delayBetweenBlink2 = 800;byte led2State = LOW;void setup() { pinMode(LED_1_PIN, OUTPUT); pinMode(LED_2_PIN, OUTPUT);}void loop() { unsigned int timeNow = millis(); // Action 1 - Blink LED 1 if (timeNow - lastTimeLed1Blinked > delayBetweenBlink1) { if (led1State == LOW) { led1State = HIGH; } else { led1State = LOW; } digitalWrite(LED_1_PIN, led1State); lastTimeLed1Blinked = timeNow; } // Action 2 - Blink LED 2 if (timeNow - lastTimeLed2Blinked > delayBetweenBlink2) { if (led2State == LOW) { led2State = HIGH; } else { led2State = LOW; } digitalWrite(LED_2_PIN, led2State); lastTimeLed2Blinked = timeNow; }}

som du kan se, gjentar vi kodestrukturen for den andre handlingen vi har lagt til. Og begge handlinger vil ikke forstyrre hverandre!

Oppsummering

hvis Du vil gjøre En arduino-forsinkelse uten å bruke delay():

  1. Opprett en global variabel for å lagre sist gang du gjorde en bestemt handling.
  2. Opprett en annen global variabel for å lagre varigheten du vil ha mellom 2 handlinger.
  3. i funksjonen loop() leser du gjeldende klokkeslett med millis().
  4. Like etter det, bruk en if-struktur, og bruk betingelsen (timeNow - lastTimeActionWasExecuted > delayBetweenActions).
  5. når du har angitt if(), gjør du handlingen.
  6. og fortsatt i if(), lagre gjeldende tid som forrige gang.

du kan gjenta disse trinnene for hver handling som Du trenger En arduino forsinkelse.

når det er ok å bruke delay () og delayMicroseconds ()

det er spesielle anledninger når du bruker delay() i koden DIN, ER DET FORTSATT OK.

her er 2 av dem:

  • du må initialisere en komponent under oppsettet av programmet, og denne komponenten trenger litt tid til å bli initialisert – for eksempel 1,5 sekunder. I dette tilfellet er det helt greit å bruke delay(1500) i setup() – funksjonen. I utgangspunktet vil noen delay() i setup() – funksjonen Til Arduino-programmet ikke være et problem.
  • som forklart i delayMicroseconds() – delen, må du vente på noen mikrosekunder (ikke millisekunder!) når du kommuniserer med en ekstern komponent. Hvis du finner ut at bruk av delayMicroseconds() med et lite nummer (for eksempel 10) ikke forstyrrer resten av programmet, kan du fortsatt bruke det uten å måtte bekymre deg for mye. Men betrakt det som et unntak, ikke den vanlige regelen.

Konklusjon-Bruk Arduino delay () med forsiktighet

på grunn Av arten Av Arduino-programmer, må du ofte legge til forsinkelser i koden din, slik at du kan velge når du skal utføre noen handlinger, og hvor ofte du vil utføre dem.

funksjonene delay() og delayMicroseconds() er svært enkle funksjoner å bruke Og ble lagt Til Arduino-språket slik at komplette nybegynnere kunne starte med noe enkelt.

men som du så i denne opplæringen, bruker delay() kan gjøre deg fast veldig raskt. Så det er best å først forstå hvorfor du trenger det, hvordan du bruker det, og deretter hvordan du får samme oppførsel uten Å bruke Arduino delay() – funksjonen direkte.

Når du har forstått kodestrukturen for å bli kvitt delay(), vil Du kunne forbedre Arduino-programmene dine mye, og multitasking blir ganske enkelt.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.