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

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

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 “Hei Verden” program av Arduino, og illustrerer perfekt hvordan bare noen få linjer med kode kan skape noe konkret.

Jeg er også villig til å satse på at du brukte utsette() funksjon for å 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 som utsette() funksjon fungerer er ganske enkelt. 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, det utsette() funksjon er ikke en god måte å få programmet til å vente, fordi det er det som kalles en “blokkerer” funksjon.

Forskjellen mellom blokkering og ikke-blokkerende funksjoner

For å illustrere hvorfor blokkeringsfunksjoner er dårlige, vil jeg at du skal tenke deg to forskjellige kokker i et kjøkken: Henry Blokkering, 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 ping, og brødet dukker opp gullbrunt, Henry legger 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.

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.

blokkering funksjoner hindrer et program fra å gjøre noe annet før den bestemte oppgaven har fullført. Hvis du vil ha flere handlinger å skje på samme tid, kan du ganske enkelt ikke bruke utsette().

Spesielt, hvis søknaden krever at du hele tiden kjøper data fra vedlagte sensorer, bør du passe på å unngå å bruke utsette() funksjon, da det pauser absolutt alt.

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

Møt Millis ()

De millisekund () 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.

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 previousTime variabel til gjeldende tid, og enten slår lysdioden på eller av.

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

Enkelt, ikke sant? Legg merke til hvordan vi opprettet variabelen nåværende tid 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, som betyr en “bit” minne for denne 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 utsette(). Men det er en annen, mye bedre måte, men mer kompleks: avbryter. Disse har fordelen av å tillate deg å presisere tiden din Arduino-programmet, og svare raskt på en ekstern inngang, men i 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 enten programmet, eller kaller en funksjon, vanligvis kjent som en Avbryt Handler eller en Avbryt Service Rutine. 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

Ved hjelp av millisekund () Selvfølgelig tar det litt ekstra arbeid i forhold til bruk utsette(). 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å millisekund () 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)

Utforsk mer om: Arduino, Programmering.