Arduino-forsinkelsesfunktion, og hvorfor du ikke bør bruge den

  • Harry James
  • 0
  • 5203
  • 460
Reklame

Første gang du begyndte at lære at udvikle Kom godt i gang med Arduino: En begynderguide Kom godt i gang med Arduino: En begynderguide Arduino er en open source-elektronikprototypeplatform, der er baseret på fleksibel, brugervenlig hardware og software. Det er beregnet til kunstnere, designere, hobbyister og enhver der er interesseret i at skabe interaktive objekter eller miljøer. til Arduino Hvad er Arduino & Hvad kan du gøre med det? Hvad er Arduino og hvad kan du gøre med det? Arduino er en bemærkelsesværdig lille elektronik, men hvis du aldrig har brugt en før, hvad er de nøjagtigt, og hvad kan du gøre med en? , har du sandsynligvis bygget et produkt, der fungerer lidt sådan:

Tilsluttet din Arduino ville være et enkelt LED-lys. Dette vil slukke og slukke hvert sekund eller deromkring og vil fortsætte, indtil Arduino er slukket. Dette er “Hej Verden” program af Arduino, og illustrerer perfekt, hvordan bare et par kodelinjer kan skabe noget håndgribeligt.

Jeg er også villig til at satse på, at du brugte forsinke() funktion til at definere intervaller mellem lyset, der tændes og slukkes. Men her er 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.

Sådan fungerer forsinkelse ()

Måden forsinke() funktion fungerer er temmelig enkel. Det accepterer et enkelt heltal Grundlæggende om computerprogrammering 101 - variabler og datatyper Grundlæggende om computerprogrammering 101 - variabler og datatyper Efter at have introduceret og talt lidt om objektorienteret programmering før, og hvor dens navnebror kommer fra, troede jeg, det er på tide, at vi går igennem de absolutte grundlæggende programmering på en ikke-sprogspecifik måde. Dette ... (eller nummer) argument. Dette nummer repræsenterer tiden (målt i millisekunder), som programmet skal vente, indtil det går videre til den næste kodelinie.

Men problemet er, forsinke() funktion er ikke en god måde at få dit program til at vente på, fordi det er det der er kendt som en “blokering” fungere.

Forskellen mellem blokerende og ikke-blokerende funktioner

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

Når Henry laver morgenmad, starter han med at lægge to runder brød i brødristeren. Når det endelig pinger, og brødet springer gyldenbrunt ud, Henry lægger det på en tallerken og krakker to æg i en stegepande. Igen står han ved, når olien springer, og de hvide begynder at hærde. Når de er færdige, plader han dem op og begynder at stege to rashers af bacon. Når de er tilstrækkelig sprøde, tager han dem ud af stegepanden, sætter dem på pladen og begynder at spise.

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

Det er en fjollet analogi, men det illustrerer pointen.

Blokering funktioner forhindrer et program i at gøre noget andet, indtil den bestemte opgave er afsluttet. Hvis du vil have flere handlinger at ske på samme tid, kan du simpelthen ikke bruge forsinke().

Især hvis din ansøgning kræver, at du konstant henter data fra tilknyttede sensorer, skal du passe på at undgå at bruge forsinke() fungerer, da det holder pause alt.

Heldigvis, forsinke() er ikke den eneste måde at få dit program til at vente på, når der kodes til Arduino.

Mød Millis ()

Det Millis () funktion udfører en enkelt opgave. Når det kaldes, vender det tilbage (som en lang datatype) antallet af millisekunder, der er gået siden programmet først blev lanceret. Så hvorfor er det nyttigt?

For ved at bruge en lille smule simpel matematik kan du nemt “tid” aspekter af dit program uden at påvirke, hvordan det fungerer. Følgende er en grundlæggende demonstration af, hvordan millis () fungerer. Som du ser, tænder programmet LED-lyset i 1000 millisekunder (et sekund) og slukker det derefter. Men afgørende, det gør det på en måde, der ikke blokerer.

Lad os nu se, hvordan det fungerer med Arduino.

Dette program - som er stærkt baseret på et fra den officielle Arduino-dokumentation - fungerer ved at trække det forrige indspillede tidspunkt fra det aktuelle tidspunkt. Hvis resten (dvs. den tid, der er gået siden sidst blev optaget), er større end intervallet (i dette tilfælde 1000 millisekunder), opdaterer programmet previousTime variabel til den aktuelle tid, og tænder eller slukker enten LED'en.

Og fordi det er en ikke-blokerende, er enhver kode der er placeret uden for den første hvis erklæring skal fungere normalt.

Enkelt, er det ikke? Bemærk, hvordan vi oprettede variablen nuværende tid som en usigneret lang. en usigneret værdi betyder simpelthen, at det aldrig kan være negativt; vi gør dette, så det maksimale antal, vi kan gemme, er større. Som standard underskrives talvariabler, hvilket betyder en “bit” hukommelse for den variabel bruges til at gemme, om værdien er positiv eller negativ. Ved at specificere, at det kun vil være positivt, har vi en ekstra bit at lege med.

afbryder

Indtil videre har vi lært om en måde at nærme os timing i vores Arduino-program, som er bedre end forsinke(). Men der er en anden, meget bedre måde, men mere kompleks: afbryder. Disse har fordelen ved at give dig mulighed for præcist at indstille dit Arduino-program og svare hurtigt på en ekstern input, men i et asynkron måde.

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

Når en afbrydelse udløses, stopper den enten programmet eller kalder en funktion, almindeligvis kendt som en Afbryd håndterer eller en Afbryd servicerutine. Når dette er afsluttet, går programmet derefter tilbage til, hvad det foregik.

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

Det lyder kryptisk. Selv forvirrende. Men det er det ikke. For at se, hvordan de fungerer, og se nogle eksempler på, at de bliver brugt i den virkelige verden, ramte Arduino-dokumentationen.

Bliv ikke blokeret

Ved brug af Millis () tager ganske vist lidt ekstra arbejde i sammenligning med brug forsinke(). Men tro mig, dine programmer vil takke dig for det, og du kan ikke lave multitasking på Arduino uden det.

Hvis du vil se et eksempel på Millis () brugt i et ægte Arduino-projekt, se James Bruces Arduino Night Light og Sunrise Alarm. Arduino Night Light og Sunrise Alarm Project Arduino Night Light og Sunrise Alarm Project I dag laver vi et solopgang vækkeur, der forsigtigt og langsomt vækker dig uden at ty til en stødende støjfremstillende maskine.

Har du fundet andre blokeringsfunktioner, vi skal være på vagt med? Fortæl mig det i kommentarerne nedenfor, så chatter vi.

Fotokreditter: Arduino (Daniel Spiess), kok (Ollie Svenson)




Endnu ingen kommentarer

Om moderne teknologi, enkel og overkommelig.
Din guide i en verden af moderne teknologi. Lær hvordan du bruger de teknologier og gadgets, der omgiver os hver dag, og lær, hvordan du finder interessante ting på Internettet.