Arduino Delay Function, och varför du inte ska använda den

Arduino Delay Function, och varför du inte ska använda den / DIY

När du började lära dig hur du utvecklar Komma igång med Arduino: En nybörjarhandbok Komma igång med Arduino: En nybörjarhandbok Arduino är en öppen prototypplattform för öppen källkod baserad på flexibel, lättanvänd maskinvara och programvara. Den är avsedd för artister, designers, hobbyister och alla som är intresserade av att skapa interaktiva objekt eller miljöer. Läs mer för Arduino Vad är Arduino och vad kan du göra med det? Vad är Arduino och vad kan du göra med det? Arduino är en anmärkningsvärd liten elektronik enhet, men om du aldrig har använt en tidigare, precis vad exakt är de, och vad kan du göra med en? Läs mer, du har förmodligen byggt en produkt som fungerar lite så här:

Ansluten till din Arduino skulle vara en enda LED-lampa. Detta skulle stängas av varje sekund eller så och fortsätter tills Arduino är avstängd. Det här är “Hej världen” program av Arduino, och illustrerar perfekt hur bara några rader av kod kan skapa något påtagligt.

Jag är också beredd att satsa att du använde fördröjning() funktion för att definiera intervall mellan ljuset på och av. Men här är saken: medan fördröjningen är praktisk för grundläggande demonstrationer av hur Arduino fungerar, borde du verkligen inte använda den i den verkliga världen. Här är varför - och vad du borde använda istället.

Hur Fördröjning () Fungerar

Hur den fördröjning() funktion fungerar är ganska enkelt. Det accepterar ett enda heltal Grunderna för dataprogrammering 101 - Variabler och datatyper Grunderna i dataprogrammering 101 - Variabler och datatyper Efter att ha introducerat och pratat lite om Objektorienterad programmering före och var sitt namnnamn kommer från, tyckte jag att det är dags att vi går igenom De absoluta grunderna för programmering på ett icke-språkligt sätt. Detta ... Läs mer (eller antal) argument. Detta nummer representerar tiden (mätt i millisekunder) programmet ska vänta tills det går vidare till nästa kodlinje.

Men problemet är, det fördröjning() funktion är inte ett bra sätt att få ditt program att vänta, för det är det som kallas a “blockering” fungera.

Skillnaden mellan blockering och icke-blockerande funktioner

För att illustrera varför blockeringsfunktioner är dåliga vill jag att du ska föreställa dig två olika kockar i ett kök: Henry Blocking, och Eduardo NonBlocking. Båda gör samma jobb, men på väldigt olika sätt.

När Henrik gör frukost börjar han med att lägga två brödroder i brödrosten. När det äntligen pingar, och brödet dyker upp guldbrunt, lägger Henry det på en tallrik och sprickar två ägg i en stekpanna. Återigen står han när oljan dyker upp, och de vita börjar börja härda. När de är färdiga plåtar de dem och börjar steka två rashers av bacon. När de är tillräckligt krispiga tar han dem av stekpannan, lägger dem på tallriken och börjar äta.

Eduardo arbetar på ett annorlunda sätt. Medan hans bröd rostar, har han redan börjat steka ägg och bacon. I stället för att vänta på att ett objekt ska sluta laga mat innan man går vidare till nästa, lagar han flera saker samtidigt. Slutresultatet är att Eduardo tar mindre tid att göra frukost än Henry gör - och när Henry Blocking är klar har toast och ägg gått kallt.

Det är en dum analogi, men det illustrerar poängen.

Blockering funktioner hindrar ett program från att göra något annat tills den särskilda uppgiften har slutförts. Om du vill ha flera åtgärder att hända samtidigt, kan du helt enkelt inte använda fördröjning().

Speciellt om din ansökan kräver att du ständigt förvärvar data från bifogade sensorer, bör du ta hand om att undvika att använda fördröjning() funktion, eftersom det pausar absolut allt.

Lyckligtvis, fördröjning() är inte det enda sättet att få ditt program att vänta när du kodar för Arduino.

Möt Millis ()

De Millis () funktionen utför en enda uppgift. När den kallas returnerar den (som en lång datatyp) antalet millisekunder som har förflutit sedan programmet lanserades först. Så varför är det användbart?

För att använda en liten bit av enkel matte kan du enkelt “tid” aspekter av ditt program utan att påverka hur det fungerar. Nedan följer en grundläggande demonstration av hur millis () fungerar. Som du ser kommer programmet att tända LED-lampan i 1000 millisekunder (en sekund) och släcker sedan den. Men avgörande gör det på ett sätt som inte blockerar.

Låt oss nu titta på hur det fungerar med Arduino.

Detta program - som är starkt baserat på en från den officiella Arduino dokumentationen - fungerar genom att subtrahera tidigare inspelad tid från den aktuella tiden. Om resten (dvs tiden som gått sedan tiden senast registrerades) är större än intervallet (i detta fall 1000 millisekunder) uppdaterar programmet previousTime variabel till den aktuella tiden och antingen slår lysdioden på eller av.

Och eftersom det är en icke-blockering, någon kod som ligger utanför den först om uttalande borde fungera normalt.

Enkelt, eller hur? Notera hur vi skapade variabeln aktuell tid som en osignerad lång. En osignerad värde betyder helt enkelt att det aldrig kan vara negativt; det gör vi så att det maximala antalet vi kan lagra är större. Som standard signeras talvariabler, vilket betyder en “bit” av minnet för den variabeln används för att lagra om värdet är positivt eller negativt. Genom att ange det blir det bara positivt, vi har en extra bit att leka med.

avbrott

Hittills har vi lärt oss om ett sätt att närma sig timing i vårt Arduino-program vilket är bättre än fördröjning(). Men det finns ett annat, mycket bättre sätt, men mer komplext: avbrott. Dessa har fördelen att du precis kan klara ditt Arduino-program och svara snabbt på en extern ingång, men i en asynkron sätt.

Det innebär att det går i samband med huvudprogrammet och väntar ständigt på att en händelse inträffar, utan att avbryta flödet av din kod. Detta hjälper dig att effektivt svara på händelser, utan att påverka Arduino-processorns prestanda.

När ett avbrott utlöses, stannar det antingen programmet, eller kallar en funktion, allmänt känd som en Avbryt Handler eller en Avbryt Service Rutin. När detta har avslutats går programmet sedan tillbaka till vad det gick.

AVR-chipet som driver Arduino stöder endast hårdvaruproblem. Dessa inträffar när en ingångsstift går från hög till låg eller när den utlöses av Arduinos inbyggda timer.

Det låter kryptiskt. Förvirrande, även. Men det är det inte. För att se hur de fungerar, och se några exempel på att de används i den verkliga världen, slå Arduino dokumentationen.

Bli inte blockerad

Använder sig av Millis () tar visserligen lite extra arbete jämfört med att använda fördröjning(). Men lita på mig, dina program kommer att tacka för det, och du kan inte göra multitasking på Arduino utan det.

Om du vill se ett exempel på Millis () som används i ett verkligt Arduino-projekt, kolla in James Bruces Arduino Night Light och Sunrise Alarm. Arduino Nattljus och Soluppgång Larmprojekt Arduino Nattljus och Soluppgång Larmprojekt Idag ska vi göra en soluppgång väckarklocka, som försiktigt och långsamt väcker dig utan att tillgripa en offensiv brusmaskin. Läs mer

Fanns några andra blockeringsfunktioner som vi borde vara försiktiga med? Låt mig veta i kommentarerna nedan, och vi chattar.

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

Utforska mer om: Arduino, Programmering.