Arduino Delay -funktion och varför du inte ska använda den

Arduino Delay -funktion och varför du inte ska använda den

När du började lära sig att utvecklas för Arduino , du har förmodligen byggt en produkt som fungerar lite så här:





Ansluten till din Arduino skulle vara ett enda LED -ljus. Detta skulle stängas av och stängas av varannan sekund och fortsätta tills Arduino stängs av. Detta är 'Hello World' -programmet för Arduino , och illustrerar perfekt hur bara några rader kod kan skapa något konkret.





Jag är också villig att satsa på att du använde dröjsmål() funktion för att definiera intervallet mellan lampan som slås på och av. Men här är saken: även om fördröjning är praktiskt för grundläggande demonstrationer av hur Arduino fungerar, borde du verkligen inte använda det i den verkliga världen. Här är varför - och vad du ska använda istället.





Hur Delay () fungerar

Sättet dröjsmål() funktion fungerar är ganska enkelt. Det accepterar ett enda heltal (eller tal) argument. Detta nummer representerar den tid (mätt i millisekunder) programmet bör vänta tills det går vidare till nästa kodrad.

Men problemet är, dröjsmål() funktion är inte ett bra sätt att få ditt program att vänta, eftersom det är det som kallas en 'blockerande' funktion.



windows stoppkod omonterbar startvolym

Skillnaden mellan blockerande och icke-blockerande funktioner

För att illustrera varför blockeringsfunktioner är dåliga vill jag att du föreställer 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 Henry lagar frukost börjar han med att lägga två varv bröd i brödrosten. När det äntligen pingar , och brödet dyker upp gyllenbrunt, Henry lägger det på en tallrik och spräcker två ägg i en stekpanna. Återigen står han på plats när oljan dyker upp och de vita börjar stelna. När de är färdiga plättar han upp dem och börjar steka två baconhackar. När de är tillräckligt krispiga tar han av dem från stekpannan, lägger dem på tallriken och börjar äta.





Eduardo fungerar på ett lite annorlunda sätt. Medan hans bröd rostar har han redan börjat steka sina ägg och bacon. Istället för att vänta på att ett föremål ska bli klart innan han går vidare till nästa, lagar han flera objekt samtidigt . Slutresultatet är att Eduardo tar mindre tid att laga frukost än Henry gör - och när Henry Blocking är klar har toasten och äggen blivit kalla.

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 specifika uppgiften har slutförts. Om du vill ha flera handlingar att hända samtidigt kan du helt enkelt inte använda dröjsmål() .

I synnerhet, om din applikation kräver att du ständigt hämtar data från anslutna sensorer, bör du vara försiktig så att du inte använder dröjsmål() funktion, eftersom den pausar absolut allt .

Lyckligtvis, dröjsmål() ä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 () funktion utför en enda uppgift. När den kallas återkommer den (som en lång datatyp) antalet millisekunder som har gått sedan programmet först lanserades. Så varför är det användbart?

För genom att använda lite enkel matematik kan du enkelt 'ta' aspekter av ditt program utan att påverka hur det fungerar. Följande är en grundläggande demonstration av hur millis () fungerar. Som du ser kommer programmet att tända LED -lampan i 1000 millisekunder (en sekund) och sedan stänga av den. Men avgörande är att det gör det på ett sätt som inte blockerar.

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

Det här programmet - vilket är starkt baserat på en från den officiella Arduino -dokumentationen - fungerar genom att subtrahera den tidigare inspelade tiden från den aktuella tiden. Om resten (dvs. tiden som har gått sedan tiden senast spelades in) är större än intervallet (i detta fall 1000 millisekunder) uppdaterar programmet föregående tid variabel till aktuell tid, och antingen tänder eller släcker lysdioden.

vad används hallon pi 3 till

Och eftersom det är en icke-blockerande, måste någon kod som ligger utanför det först if uttalande ska fungera normalt.

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

Avbryter

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

Det betyder att det körs tillsammans med huvudprogrammet och ständigt väntar på att en händelse ska inträffa utan att avbryta flödet av din kod. Detta hjälper dig att effektivt svara på händelser, utan att påverka prestandan hos Arduino -processorn.

När ett avbrott utlöses stoppar det antingen programmet eller anropar en funktion, allmänt känd som en Avbryt Handler eller en Avbryt servicerutinen . När detta har avslutats går programmet tillbaka till vad det gick för.

AVR -chipet som driver Arduino stöder bara maskinvaruavbrott. Dessa inträffar när en inmatningsnål går från hög till låg, eller när den utlöses av Arduinos inbyggda timers.

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

Bli inte blockerad

Använder sig av millis () kräver visserligen lite extra arbete jämfört med att använda dröjsmål() . Men lita på mig, dina program kommer att tacka dig för det, och du kan inte göra multitasking på Arduino utan det.

Om du vill se ett exempel på millis () används i ett verkligt Arduino-projekt, kolla in James Bruce's Arduino Night Light and Sunrise Alarm.

Hittade du några andra blockeringsfunktioner som vi bör vara försiktiga med? Låt mig veta i kommentarerna nedan, så chattar vi.

Fotokrediter: Arduino (Daniel Spiess) , Chef (Ollie Svenson)

Dela med sig Dela med sig Tweet E-post Är det värt att uppgradera till Windows 11?

Windows har gjorts om. Men är det tillräckligt för att övertyga dig om att byta från Windows 10 till Windows 11?

Läs Nästa
Relaterade ämnen
  • DIY
  • Programmering
  • Arduino
Om författaren Matthew Hughes(386 artiklar publicerade)

Matthew Hughes är en mjukvaruutvecklare och författare från Liverpool, England. Han hittas sällan utan en kopp starkt svart kaffe i handen och älskar absolut sin Macbook Pro och sin kamera. Du kan läsa hans blogg på http://www.matthewhughes.co.uk och följa honom på twitter på @matthewhughes.

hur fungerar en webbserver
Mer från Matthew Hughes

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera