Arduino Delay Funktion, og hvorfor du ikke bør bruge det

Mens forsinkelse () er praktisk til grundlæggende demonstrationer af, hvordan Arduino fungerer, skal du virkelig ikke bruge det i den virkelige verden. Her er hvorfor, og hvad du skal bruge i stedet.

Mens forsinkelse () er praktisk til grundlæggende demonstrationer af, hvordan Arduino fungerer, skal du virkelig ikke bruge det i den virkelige verden.  Her er hvorfor, og hvad du skal bruge i stedet.
Reklame

Når du først begyndte at lære at udvikle Kom i gang med Arduino: En nybegyndervejledning Kom godt i gang med Arduino: En nybegyndervejledning Arduino er en open source elektronik prototypeplanlægning baseret på fleksibel, brugervenlig hardware og software. Det er beregnet til kunstnere, designere, hobbyister og alle interesserede i at skabe interaktive objekter eller miljøer. Læs mere for Arduino Hvad er Arduino & Hvad kan du gøre med det? Hvad er Arduino & Hvad kan du gøre med det? Arduino er en bemærkelsesværdig lille elektronik enhed, men hvis du aldrig har brugt en før, hvad præcist er de, og hvad kan du gøre med en? Læs mere, du har sikkert bygget et produkt, der virker lidt som dette:

Tilsluttet din Arduino ville være et enkelt LED-lys. Dette ville slukkes hvert sekund eller deromkring og vil fortsætte, indtil Arduino er slukket. Dette er "Hello World" -programmet for Arduino, og illustrerer perfekt, hvordan kun nogle få linjer kode kan skabe noget håndgribeligt.

Arduino-ledede

Jeg er også villig til at satse på, at du brugte funktionen delay () til at definere intervallerne mellem lyset, der tænder og slukker. Men her er sagen: Mens forsinkelsen er praktisk til grundlæggende demonstrationer af, hvordan Arduino fungerer, skal du virkelig ikke bruge det i den virkelige verden. Her er hvorfor - og hvad du skal bruge i stedet.

Hvordan forsinkelse () virker

Den måde, forsinkelsen () fungerer på, er ret simpel. Det accepterer et enkelt heltal Grundlæggende om Computer Programmering 101 - Variabler og datatyper Grundlaget for Computer Programmering 101 - Variabler og datatyper Efter at have introduceret og snakket lidt om objektorienteret programmering før og hvor dets navnebringer kommer fra, tænkte jeg, det er på tide, vi går igennem Det absolutte grundlæggende ved programmering på en ikke-sproglig måde. Dette ... Læs mere (eller nummer) argument. Dette tal repræsenterer tiden (målt i millisekunder), programmet skal vente, indtil det går videre til den næste linje af kode.

Men problemet er, at forsinkelsen () -funktionen ikke er en god måde at få dit program til at vente, fordi det er hvad der er kendt som en "blokering" -funktion.

Forskellen mellem blokerende og ikke-blokerende funktioner

For at illustrere, hvorfor blokeringsfunktioner er dårlige, vil jeg gerne forestille dig to forskellige kokke i et køkken: Henry Blocking og Eduardo NonBlocking . Begge gør det samme arbejde, men på meget forskellige måder.

Når Henry laver morgenmad begynder han at sætte to runder brød i brødristeren. Når det endelig pinger, og brødet springer ud gyldenbrunt, lægger Henry det på en tallerken og revner to æg i en stegepande. Igen står han ved som olien dukker op, og de hvide begynder at hærde. Når de er færdige, plader han dem op og begynder stegning to udslæt af bacon. Når de er tilstrækkeligt sprøde, tager han dem ud af stegepanden, sætter dem på pladen og begynder at spise.

Arduino-kok

Eduardo arbejder på en lidt anden måde. Mens hans brød er ristet, er han allerede begyndt at stege hans æg og bacon. I stedet for at vente på en genstand til at afslutte madlavningen, før han går videre til den næste, laver han flere elementer samtidigt . Slutresultatet er, at Eduardo tager mindre tid at lave morgenmad end Henry gør - og da Henry Blocking er færdig, er toast og æg gået koldt.

Det er en dumt analogi, men det illustrerer punktet.

Blokeringsfunktioner forhindrer et program i at gøre noget andet, indtil den pågældende opgave er afsluttet. Hvis du vil have flere handlinger på samme tid, kan du simpelthen ikke bruge forsinkelse () .

Især hvis din ansøgning kræver, at du konstant erhverver data fra vedhæftede sensorer, skal du være forsigtig med at undgå at bruge funktionen forsinkelse (), da det pauser helt alt .

Heldigvis er forsinkelse () ikke den eneste måde at få programmet til at vente, når du kodes for Arduino.

Mød Millis ()

Funktionen millis () udfører en enkelt opgave. Når den kaldes, returnerer den (som en lang datatype) antallet af millisekunder, der er gået siden programmet blev lanceret. Så hvorfor er det nyttigt?

Fordi ved at bruge en lille smule enkel matematik, kan du nemt "tid" aspekter af dit program uden at påvirke, hvordan det virker. Følgende er en grundlæggende demonstration af hvordan millis () fungerer. Som du vil se, vil programmet tænde lysdioden i 1000 millisekunder (et sekund) og slukke for det. Men afgørende gør det det på en måde, der ikke blokkerer.

Lad os nu se på, hvordan det fungerer med Arduino.

Arduino-ms-eksempel

Dette program - som er stærkt baseret på en fra den officielle Arduino dokumentation - virker ved at trække den tidligere optagne tid fra den aktuelle tid. Hvis resten (dvs. tiden der er gået siden tidspunktet sidst blev registreret) er større end intervallet (i dette tilfælde 1000 millisekunder), opdaterer programmet tidligere tidvariablen til den aktuelle tid, og enten tænder eller slukker lysdioden.

Og fordi det er en ikke-blokering, skal enhver kode, der ligger uden for det første, hvis erklæringen skal fungere normalt.

Enkel, er det ikke? Bemærk, hvordan vi skabte variablen currentTime som en usigneret lang. En usigneret værdi betyder simpelthen, at det aldrig kan være negativt; det gør vi således, at det maksimale antal vi kan gemme er større. Som standard er tallvariabler underskrevet, hvilket betyder, at en "bit" af hukommelsen for denne variabel bruges til at gemme om værdien er positiv eller negativ. Ved at angive det vil det kun være positivt, vi har en ekstra smule at lege med.

afbryder

Hidtil har vi lært om en måde at nærme timingen til i vores Arduino-program, hvilket er bedre end forsinkelsen () . Men der er en anden, meget bedre måde, men mere kompleks: afbryder . Disse har den fordel at give dig mulighed for at præcis teste dit Arduino-program og reagere hurtigt på en ekstern indgang, men på asynkron måde.

Det betyder, at det kører i forbindelse med hovedprogrammet og konstant venter på en begivenhed, uden at afbryde strømmen af ​​din kode. Dette hjælper dig med effektivt at reagere på begivenheder uden at påvirke Arduino-processorens ydeevne.

Når en afbrydelse udløses, stopper den enten programmet eller kalder en funktion, almindeligvis kendt som en Interrupt Handler eller en Interrupt Service Routine . Når dette er afsluttet, går programmet derefter tilbage til, hvad det gik.

AVR-chipet, der driver Arduino, understøtter kun hardwareafbrydelser. Disse forekommer, når en indgangsstift går fra høj til lav, eller når den udløses af Arduino's indbyggede timere.

Det lyder kryptisk. Forvirrende, selv. Men det er det ikke. For at se, hvordan de fungerer, og se nogle eksempler på, at de bliver brugt i den virkelige verden, skal du slå Arduino-dokumentationen.

Bliv ikke blokeret

Brug af millis () tager ganske vist lidt ekstra arbejde i forhold til at bruge forsinkelse () . Men tro mig, dine programmer vil takke dig for det, og du kan ikke gøre multitasking på Arduino uden det.

Hvis du vil se et eksempel på millis (), der bruges i et virkeligt Arduino-projekt, skal du tjekke James Bruces Arduino Night Light og Sunrise Alarm. Arduino Nattlys og Solopgang Alarm Projekt Arduino Nattlys og Solopgang Alarmprojekt I dag laver vi et solopgangsvækkeur, som forsigtigt og langsomt vil vække dig uden at ty til en offensiv støjdannende maskine. Læs mere

Har vi fundet andre blokeringsfunktioner, vi bør være forsigtige med? Lad mig vide i kommentarerne nedenfor, og vi vil chatte.

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

In this article