Arduino-vertragingsfunctie en waarom u deze niet zou moeten gebruiken

Arduino-vertragingsfunctie en waarom u deze niet zou moeten gebruiken

Toen je voor het eerst begon leren ontwikkelen voor de Arduino , heb je waarschijnlijk een product gebouwd dat een beetje als volgt werkt:





Verbonden met uw Arduino zou een enkel LED-lampje zijn. Dit zou elke seconde of zo worden uitgeschakeld en doorgaan totdat de Arduino wordt uitgeschakeld. Dit is het 'Hello World' programma van Arduino , en illustreert perfect hoe slechts een paar regels code iets tastbaars kunnen creëren.





Ik durf er ook op te wedden dat je de hebt gebruikt vertraging() functie om de intervallen tussen het in- en uitschakelen van het licht te definiëren. Maar hier is het ding: hoewel vertraging handig is voor basisdemonstraties 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 Delay() werkt

De manier waarop vertraging() functie werkt is vrij eenvoudig. Het accepteert een enkel geheel getal (of getal) argument. Dit getal vertegenwoordigt de tijd (gemeten in milliseconden) dat het programma moet wachten tot het naar de volgende regel code gaat.

Maar het probleem is, de vertraging() functie is geen goede manier om je programma te laten wachten, omdat het een zogenaamde 'blokkerende' functie is.



games die geen gegevens gebruiken

Het verschil tussen blokkerende en niet-blokkerende functies

Om te illustreren waarom het blokkeren van functies slecht is, wil ik dat je je twee verschillende koks in een keuken voorstelt: Henry Blocking , en Eduardo NonBlocking . Beide doen hetzelfde werk, maar op totaal verschillende manieren.

Als Henry het ontbijt maakt, begint hij met twee sneetjes brood in de broodrooster. Wanneer het eindelijk pingt , en het brood ziet er goudbruin uit, Henry legt het op een bord en kraakt twee eieren in een koekenpan. Nogmaals, hij staat erbij terwijl de olie borrelt en het wit begint te harden. Als ze klaar zijn, zet hij ze op borden en begint hij twee plakjes spek te bakken. Als ze voldoende krokant zijn, haalt hij ze van de braadpan, legt ze op het bord en begint te eten.





Eduardo werkt op een iets andere manier. Terwijl zijn brood roostert, is hij al begonnen met het bakken van zijn eieren en spek. In plaats van te wachten tot een item klaar is met koken voordat hij naar het volgende gaat, kookt hij meerdere items gelijktijdig . 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.

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





Blokkeren functies voorkomen dat een programma iets anders doet totdat die specifieke taak is voltooid. Als je meerdere wilt acties tegelijkertijd gebeuren, kun je gewoon niet gebruiken vertraging() .

In het bijzonder, als uw toepassing vereist dat u voortdurend gegevens van aangesloten sensoren verzamelt, moet u ervoor zorgen dat u de vertraging() functie, aangezien het absoluut pauzeert alles .

Gelukkig, vertraging() is niet de enige manier om uw programma te laten wachten bij het coderen voor Arduino.

Maak kennis met Millis()

De millis() functie voert een enkele taak uit. Wanneer aangeroepen, keert het terug (als a lang datatype) het aantal milliseconden dat is verstreken sinds het programma voor het eerst werd gelanceerd. Dus waarom is dat handig?

Want door een beetje simpele wiskunde te gebruiken, kunt u aspecten van uw programma gemakkelijk 'timen' zonder de werking ervan te beïnvloeden. Het volgende is een basisdemonstratie van hoe millis() werkt. Zoals je zult zien, zal het programma het LED-lampje 1000 milliseconden (één seconde) aanzetten en vervolgens uitschakelen. Maar cruciaal is dat het het op een niet-blokkerende manier doet.

Laten we nu eens kijken hoe het werkt met Arduino.

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

hoe jpeg-bestandsgrootte vensters te verkleinen

En omdat het een niet-blokkerende code is, zal elke code die zich daarbuiten bevindt eerst if-verklaring normaal zou moeten werken.

Simpel, niet? Merk op hoe we de variabele hebben gemaakt huidige tijd als een niet ondertekend lang. Een niet ondertekend waarde betekent simpelweg dat het nooit negatief kan zijn; we doen dit zodat het maximale aantal dat we kunnen opslaan groter is. Nummervariabelen zijn standaard ondertekend, wat betekent dat één 'bit' geheugen voor die variabele wordt gebruikt om op te slaan of de waarde positief of negatief is. Door te specificeren dat het alleen positief is, hebben we een extra beetje om mee te spelen.

Onderbrekingen

Tot nu toe hebben we een manier geleerd om timing in ons Arduino-programma te benaderen, die beter is dan: vertraging() . Maar er is een andere, veel betere manier, maar ingewikkelder: onderbreekt . Deze hebben het voordeel dat u uw Arduino-programma precies kunt timen en snel kunt reageren op een externe invoer, maar in een asynchroon manier.

Dat betekent dat het samen met het hoofdprogramma draait, constant 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 het het programma of roept het een functie aan, algemeen bekend als an afhandelaar onderbreken of een Serviceroutine onderbreken . Zodra dit is afgerond, gaat het programma terug naar waar het aan toe was.

De AVR-chip die de Arduino aanstuurt, ondersteunt alleen hardware-interrupts. Deze treden op wanneer een ingangspin van hoog naar laag gaat, of wanneer 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 om enkele voorbeelden te zien van hoe ze in de echte wereld worden gebruikt, klik op de Arduino-documentatie .

Laat je niet blokkeren

Gebruik makend van millis() kost weliswaar een beetje extra werk in vergelijking met het gebruik vertraging() . Maar geloof me, je programma's zullen je er dankbaar voor zijn, en je kunt niet multitasken op de Arduino zonder.

Als u een voorbeeld wilt zien van millis() gebruikt in een echt Arduino-project, bekijk James Bruce's Arduino Night Light en Sunrise Alarm.

Nog andere blokkerende functies gevonden waar we op moeten letten? Laat het me weten in de reacties hieronder, dan praten we verder.

Fotocredits: Arduino (Daniël Spies) , chef (Ollie Svenson)

Deel Deel Tweeten E-mail Is het de moeite waard om te upgraden naar Windows 11?

Windows is opnieuw ontworpen. Maar is dat genoeg om u te overtuigen om over te stappen van Windows 10 naar Windows 11?

Lees volgende
Gerelateerde onderwerpen
  • doe-het-zelf
  • Programmeren
  • Arduino
Over de auteur Matthew Hughes(386 artikelen gepubliceerd)

Matthew Hughes is een softwareontwikkelaar en schrijver uit Liverpool, Engeland. Hij wordt zelden gevonden zonder een kop sterke zwarte koffie in zijn hand en is helemaal weg van zijn Macbook Pro en zijn camera. Je kunt zijn blog lezen op http://www.matthewhughes.co.uk en hem volgen op Twitter op @matthewhughes.

hoe stuur ik een sms door?
Meer van Matthew Hughes

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren