Arduino Delay Funksjon, og hvorfor du ikke bør bruke den

Mens forsinkelse () er praktisk for grunnleggende demonstrasjoner av hvordan Arduino fungerer, bør du ikke bruke den i den virkelige verden. Her er hvorfor, og hva du bør bruke i stedet.

Mens forsinkelse () er praktisk for grunnleggende demonstrasjoner av hvordan Arduino fungerer, bør du ikke bruke den i den virkelige verden.  Her er hvorfor, og hva du bør bruke i stedet.
Annonse

Når du begynte å lære å utvikle Komme i gang med Arduino: En nybegynnersveiledning Komme i gang med Arduino: En nybegynners guide Arduino er en åpen kilde elektronikk prototyping plattform basert på fleksibel, brukervennlig maskinvare og programvare. Det er ment for kunstnere, designere, hobbyister, og alle som er interessert i å lage interaktive objekter eller miljøer. Les mer for Arduino Hva er Arduino og hva kan du gjøre med det? Hva er Arduino og hva kan du gjøre med det? Arduino er en bemerkelsesverdig liten elektronikk enhet, men hvis du aldri har brukt en før, akkurat hva er de, og hva kan du gjøre med en? Les mer, du har sannsynligvis bygget et produkt som virker litt slik:

Koblet til din Arduino ville være et enkelt LED-lys. Dette ville slå av og på hvert sekund eller så, og vil fortsette til Arduino er slått av. Dette er "Hello World" -programmet til Arduino, og illustrerer perfekt hvordan bare noen få linjer med kode kan skape noe konkret.

Arduino-ledede

Jeg er også villig til å satse på at du brukte forsinkelsen () -funksjonen til å definere intervaller mellom lyset slås på og av. Men her er saken: Mens forsinkelse er praktisk for grunnleggende demonstrasjoner av hvordan Arduino fungerer, bør du ikke bruke den i den virkelige verden. Her er hvorfor - og hva du bør bruke i stedet.

Hvordan Forsinkelse () Fungerer

Måten forsinkelsen () -funksjonen fungerer, er ganske enkel. Det aksepterer et heltall Grunnleggende om dataprogrammering 101 - Variabler og datatyper Grunnleggende om dataprogrammering 101 - Variabler og datatyper Etter å ha introdusert og snakket litt om Objektorientert programmering før og hvor dets navnebringer kommer fra, trodde jeg det er på tide vi går gjennom Det absolutt grunnleggende for programmering på en ikke-språkspesifikk måte. Dette ... Les mer (eller nummer) argument. Dette tallet representerer tiden (målt i millisekunder) programmet bør vente til du går videre til neste linje med kode.

Men problemet er at forsinkelsen () -funksjonen ikke er en god måte å få programmet til å vente, fordi det er det som kalles "blokkering" -funksjon.

Forskjellen mellom blokkering og ikke-blokkerende funksjoner

For å illustrere hvorfor blokkeringsfunksjonene er dårlige, vil jeg at dere skal tenke på to forskjellige kokker i et kjøkken: Henry Blocking og Eduardo NonBlocking . Begge gjør den samme jobben, men på helt forskjellige måter.

Når Henry lager frokost, begynner han å sette to brødrunder i brødristeren. Når det endelig pinger, og brødet dukker opp gyldenbrunt, legger Henry det på en tallerken og sprekker to egg i en panne. Igjen står han forbi når oljen popper, og de hvite begynner å herdes. Når de er ferdige, plater de dem opp og begynner å steke to rashers av bacon. Når de er tilstrekkelig sprø, tar han dem av stekepannen, legger dem på tallerkenen og begynner å spise.

Arduino-kokk

Eduardo jobber på en litt annen måte. Mens hans brød er ristet, har han allerede begynt å steke egg og bacon. I stedet for å vente på ett element for å fullføre matlagingen før du går videre til neste, lagrer han flere elementer samtidig . Sluttresultatet er at Eduardo tar mindre tid å lage frokost enn Henry gjør - og da Henry Blocking er ferdig, har toast og egg gått kaldt.

Det er en dum analogi, men det illustrerer poenget.

Blokkeringsfunksjoner forhindrer et program fra å gjøre noe annet før den oppgaven har fullført. Hvis du vil at flere handlinger skal skje samtidig, kan du ganske enkelt ikke bruke forsinkelse () .

Spesielt, hvis din søknad krever at du hele tiden kjøper data fra vedlagte sensorer, bør du passe på å unngå å bruke forsinkelsen () -funksjonen, da det pauser absolutt alt .

Heldigvis er forsinkelse () ikke den eneste måten å få programmet til å vente når du koder for Arduino.

Møt Millis ()

Millis () -funksjonen utfører en enkelt oppgave. Når den blir ringt, returnerer den (som en lang datatype) antall millisekunder som har gått siden programmet ble lansert. Så hvorfor er det nyttig?

Fordi ved å bruke litt enkel matte, kan du enkelt "tid" aspekter av programmet uten å påvirke hvordan det fungerer. Følgende er en grunnleggende demonstrasjon av hvordan millis () fungerer. Som du ser, vil programmet slå LED-lampen på i 1000 millisekunder (ett sekund), og slår den av. Men avgjørende, det gjør det på en måte som ikke blokkerer.

La oss se på hvordan det fungerer med Arduino.

Arduino-Milli f.eks

Dette programmet - som er sterkt basert på en fra den offisielle Arduino-dokumentasjonen - fungerer ved å trekke forrige innspilt tid fra den nåværende tiden. Hvis resten (dvs. tiden som er gått siden tidspunktet sist ble registrert) er større enn intervallet (i dette tilfellet 1000 millisekunder), oppdaterer programmet tidligereTime- variabelen til gjeldende tid, og enten slår lysdioden på eller av.

Og fordi det er en ikke-blokkering, vil noen kode som ligger utenfor det første hvis setningen skal fungere normalt.

Enkelt, ikke sant? Legg merke til hvordan vi opprettet variabelen currentTime som en usignert lang. En usignert verdi betyr ganske enkelt at det aldri kan være negativt; Vi gjør dette slik at det maksimale antallet vi kan lagre er større. Som standard er tallvariabler signert, noe som betyr at en "bit" av minne for den variabelen brukes til å lagre om verdien er positiv eller negativ. Ved å spesifisere det vil det bare være positivt, vi har en ekstra bit å leke med.

avbryter

Så langt har vi lært om en måte å nærme seg timing i vårt Arduino-program, som er bedre enn forsinkelse () . Men det er en annen, mye bedre måte, men mer kompleks: avbrudd . Disse har fordelen av å tillate deg å presisere tiden din Arduino-program, og svare raskt på en ekstern inngang, men på en asynkron måte.

Det betyr at det går i forbindelse med hovedprogrammet, hele tiden venter på at en hendelse skal oppstå, uten å forstyrre strømmen av koden. Dette hjelper deg med å reagere effektivt på hendelser uten å påvirke ytelsen til Arduino-prosessoren.

Når en avbrudd utløses, stopper den programmet enten, eller kaller en funksjon, vanligvis kjent som en avbruddshåndterer eller en avbruddstjeneste . Når dette er blitt avsluttet, går programmet deretter tilbake til det det var på vei.

AVR-brikken som driver Arduino støtter bare maskinvareavbrudd. Disse oppstår når en inngangspinne går fra høy til lav, eller når den utløses av Arduino sine innebygde tidtakere.

Det høres kryptisk ut. Forvirrende, selv. Men det er det ikke. For å se hvordan de fungerer, og se noen eksempler på at de blir brukt i den virkelige verden, slå Arduino dokumentasjonen.

Ikke bli blokkert

Bruke millis () tar i tillegg litt ekstra arbeid sammenlignet med å bruke forsinkelse () . Men stol på, programmene dine vil takke for det, og du kan ikke gjøre multitasking på Arduino uten det.

Hvis du vil se et eksempel på millis () brukt i et virkelige Arduino-prosjekt, sjekk ut James Bruces Arduino Night Light og Sunrise Alarm. Arduino Nattlys og Soloppgang Alarm Prosjekt Arduino Nattlys og Soloppgang Alarmprosjekt I dag skal vi lage en soloppgangsvekkerklokke, som forsiktig og sakte vekker deg uten å benytte seg av en støtende støymaskin. Les mer

Funnet noen andre blokkeringsfunksjoner vi bør være forsiktige med? Gi meg beskjed i kommentarene nedenfor, og vi vil chatte.

Foto Credits: Arduino (Daniel Spiess), Chef (Ollie Svenson)

In this article