Arduino Vertragingsfunctie en waarom u het niet zou moeten gebruiken

Terwijl delay () handig is voor eenvoudige demonstraties van hoe Arduino werkt, zou je het echt niet in de echte wereld moeten gebruiken. Dit is waarom, en wat u in plaats daarvan zou moeten gebruiken.

Terwijl delay () handig is voor eenvoudige demonstraties van hoe Arduino werkt, zou je het echt niet in de echte wereld moeten gebruiken.  Dit is waarom, en wat u in plaats daarvan zou moeten gebruiken.
Advertentie

Toen je begon te leren hoe je kon ontwikkelen Aan de slag met Arduino: een beginnershandleiding Aan de slag met Arduino: een beginnersgids Arduino is een open-source prototype-platform voor elektronica op basis van flexibele, gebruiksvriendelijke hardware en software. Het is bedoeld voor kunstenaars, ontwerpers, hobbyisten en iedereen die geïnteresseerd is in het maken van interactieve objecten of omgevingen. Meer lezen voor de Arduino Wat is Arduino en wat kunt u ermee doen? Wat is Arduino en wat kun je ermee doen? De Arduino is een opmerkelijk klein elektronisch apparaat, maar als je er nog nooit een hebt gebruikt, wat precies zijn ze dan, en wat kun je ermee doen? Lees Meer, je hebt waarschijnlijk een product gebouwd dat een beetje als volgt werkt:

Verbonden met je Arduino zou een enkel LED-licht zijn. Deze zou elke seconde of zo worden uitgeschakeld en zal doorgaan totdat de Arduino is uitgeschakeld. Dit is het "Hello World" -programma van Arduino en illustreert perfect hoe slechts enkele regels code iets tastbaars kunnen creëren.

Arduino geleide

Ik durf te wedden dat je de delay () functie hebt gebruikt om de intervallen tussen het in- en uitschakelen van het licht te definiëren. Maar hier is het ding: terwijl vertraging handig is voor basale demonstraties van hoe Arduino werkt, zou je het echt niet in de echte wereld moeten gebruiken. Dit is waarom - en wat u in plaats daarvan zou moeten gebruiken.

Hoe vertraging () werkt

De manier waarop de functie delay () werkt, is vrij eenvoudig. Het accepteert een enkel integer De grondbeginselen van computerprogrammering 101 - Variabelen en gegevenstypen De basisprincipes van computerprogrammering 101 - Variabelen en gegevenstypes Nadat ik iets had geïntroduceerd en gepraat over objectgeoriënteerde programmering voor en waar zijn naamgenoot vandaan komt, dacht ik dat het tijd is om door te gaan de absolute basis van programmeren op een niet-taalspecifieke manier. Dit ... Lees meer (of cijfer) argument. Dit getal vertegenwoordigt de tijd (gemeten in milliseconden) dat het programma moet wachten tot de volgende coderegel wordt weergegeven.

Maar het probleem is dat de functie delay () geen goede manier is om je programma te laten wachten, omdat dit een zogenaamde "blokkeer" -functie is.

Het verschil tussen blokkerende en niet-blokkerende functies

Om te illustreren waarom blokkeerfuncties slecht zijn, wil ik dat je twee verschillende chefs in een keuken voorstelt: Henry Blocking en Eduardo NonBlocking . Beide doen hetzelfde werk, maar op totaal verschillende manieren.

Wanneer Henry ontbijt maakt, begint hij met het plaatsen van twee ronden brood in de broodrooster. Als het eindelijk begint te kloppen en het brood goudbruin wordt, legt Henry het op een bord en kraakt twee eieren in een koekenpan. Nogmaals, hij blijft staan ​​als de olie knalt en de blanken beginnen te harden. Als ze klaar zijn, legt hij ze op en begint ze twee plakjes spek te braden. Zodra ze voldoende knapperig zijn, haalt hij ze van de koekenpan, legt ze op het bord en begint te eten.

Arduino-chef

Eduardo werkt op een enigszins andere manier. Terwijl zijn brood aan het roosteren is, is hij al begonnen zijn eieren en spek te bakken. In plaats van te wachten tot een item klaar is met koken voordat het naar de volgende gaat, bereidt hij meerdere items tegelijk voor . Het eindresultaat is dat Eduardo minder tijd nodig heeft om te ontbijten dan Henry - en tegen de tijd dat Henry Blocking klaar is, zijn de toast en de eieren koud geworden.

Het is een dwaze analogie, maar het illustreert het punt.

Blokkeerfuncties voorkomen dat een programma iets anders doet totdat die specifieke taak is voltooid. Als u meerdere acties tegelijkertijd wilt laten plaatsvinden, kunt u eenvoudig geen vertraging () gebruiken .

In het bijzonder, als uw toepassing vereist dat u voortdurend gegevens verzamelt van aangesloten sensoren, moet u ervoor zorgen dat u de functie delay () niet gebruikt, omdat deze absoluut alles onderbreekt.

Gelukkig is delay () niet de enige manier om je programma te laten wachten bij het coderen voor Arduino.

Maak kennis met Millis ()

De functie millis () voert één taak uit. Wanneer dit wordt aangeroepen, wordt (als een lang gegevenstype) het aantal milliseconden geretourneerd dat is verstreken sinds het programma voor het eerst werd gestart. Dus waarom is dat nuttig?

Omdat u met een beetje eenvoudige wiskunde eenvoudig aspecten van uw programma kunt 'timen' zonder dat dit invloed heeft op hoe het werkt. Het volgende is een basale demonstratie van hoe millis () werkt. Zoals u zult zien, zal het programma het LED-licht gedurende 1000 milliseconden (één seconde) aanzetten en vervolgens uitschakelen. Maar cruciaal, het doet het op een manier die niet blokkeert.

Laten we nu kijken naar hoe het werkt met Arduino.

arduino-millis example

Dit programma - dat sterk gebaseerd is op een van de officiële documentatie van Arduino - werkt door de vorige geregistreerde tijd af te trekken van de huidige tijd. Als de rest (dwz de tijd die verstreken is sinds de tijd voor het laatst is opgenomen) groter is dan het interval (in dit geval 1000 milliseconden), werkt het programma de variabele vorigeTime bij naar de huidige tijd en schakelt de LED in of uit.

En omdat het een niet-blokkerende code is, moet elke code die zich buiten die eerste if- opdracht bevindt, normaal werken.

Eenvoudig, toch? Merk op hoe we de variabele currentTime als unsigned long hebben gemaakt. Een niet-ondertekende waarde betekent simpelweg dat deze nooit negatief kan zijn; we doen dit zodat het maximale aantal dat we kunnen opslaan groter is. Standaard worden nummervariabelen ondertekend, wat betekent dat één "bit" geheugen voor die variabele wordt gebruikt om op te slaan of de waarde positief of negatief is. Door op te geven dat het alleen maar positief is, hebben we een extra bit om mee te spelen.

interrupts

Tot nu toe hebben we geleerd over één manier om timing in ons Arduino-programma te benaderen, wat beter is dan delay () . Maar er is een andere, veel betere manier, maar complexer: onderbrekingen . Deze hebben het voordeel dat u uw Arduino-programma precies kunt timen en snel op een externe invoer kunt reageren, maar dan op een asynchrone manier.

Dat betekent dat het samen met het hoofdprogramma wordt uitgevoerd, voortdurend wachtend op een gebeurtenis, zonder de stroom van uw code te onderbreken. Dit helpt u efficiënt te reageren op gebeurtenissen, zonder de prestaties van de Arduino-processor te beïnvloeden.

Wanneer een interrupt wordt geactiveerd, stopt deze het programma of roept een functie aan, algemeen bekend als een interrupt handler of een interruptieserviceroutine . Als dit eenmaal is afgerond, gaat het programma terug naar wat het ging.

De AVR-chip die de Arduino aandrijft, ondersteunt alleen hardware-interrupts. Deze treden op wanneer een input-pin van hoog naar laag gaat of wanneer deze wordt geactiveerd door de ingebouwde timers van de Arduino.

Het klinkt cryptisch. Verwarrend, zelfs. Maar dat is het niet. Om te zien hoe ze werken en enkele voorbeelden te zien van hoe ze in de echte wereld worden gebruikt, klik je op de Arduino-documentatie.

Wordt niet geblokkeerd

Het gebruiken van millis () kost wel een beetje extra werk in vergelijking met het gebruik van delay () . Maar geloof me, je programma's zullen je er dankbaar voor zijn en je kunt zonder de multitasking op de Arduino niet doen.

Als je een voorbeeld van millis () wilt zien dat wordt gebruikt in een echt Arduino-project, bekijk dan eens het Arduino Night Light en Sunrise Alarm van James Bruce. Arduino Night Light en Sunrise Alarm Project Arduino Night Light en Sunrise Alarm Project Vandaag maken we een wekker voor zonsopkomst, die je langzaam en langzaam wakker zal maken zonder gebruik te maken van een aanstootgevend lawaai makende machine. Lees verder

Heeft u andere blokkeerfuncties gevonden waar we op onze hoede voor moeten zijn? Laat het me weten in de reacties hieronder en we zullen chatten.

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

In this article