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

Medan fördröjning () ä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.

Medan fördröjning () ä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.
Annons

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. Detta är "Hello World" -programmet för Arduino, och illustrerar perfekt hur bara några rader av kod kan skapa något påtagligt.

arduino-ledda

Jag är också beredd att satsa på att du använde funktionen delay () för att definiera intervall mellan ljuset som slås 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 funktionen delay () fungerar är ganska enkel. 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 att funktionen fördröjning () inte är ett bra sätt att få ditt program att vänta, för det är så kallat en "blockering" -funktion.

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 guldbrun, sätter 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.

arduino-kock

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 objekt samtidigt . Slutresultatet är att Eduardo tar mindre tid att äta frukost än Henry gör - och när Henry Blocking är klar har toast och ägg blivit kalla.

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

Blockeringsfunktioner förhindrar att ett program gör någonting annat tills den specifika uppgiften har slutförts. Om du vill att flera åtgärder ska ske samtidigt kan du helt enkelt inte använda fördröjning () .

I synnerhet 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 funktionen fördröjning (), eftersom det pausar absolut allt .

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

Möt Millis ()

Funktionen millis () 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?

Eftersom du använder 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.

Arduino-millis-exempel

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 det här fallet 1000 millisekunder) uppdaterar programmet tidigare tidvariabeln till den aktuella tiden och antingen slår lysdioden på eller av.

Och eftersom det är en icke-blockering, måste någon kod som ligger utanför den första om uttalandet ska fungera normalt.

Enkelt, eller hur? Observera hur vi skapade variabeln currentTime som unsigned long. Ett osignerat 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 innebär att en "bit" av minne 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örseningen () . 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 reagera snabbt på en extern ingång, men på ett asynkront 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 avbrottshanterare eller en avbrottsservicerutin . 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ända 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)

In this article