Arduino Vertragingsfunctie en waarom u het niet zou moeten gebruiken
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 de “Hallo Wereld” programma van Arduino, en illustreert perfect hoe slechts enkele regels code iets tastbaars kunnen creëren.
Ik ben ook bereid om te wedden dat je de vertraging() functie 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 vertraging() functie werkt is vrij eenvoudig. Het accepteert een enkel integer De grondbeginselen van computerprogrammering 101 - Variabelen en gegevenstypen De basisprincipes van computerprogrammeren 101 - Variabelen en gegevenstypes Nadat ik iets over objectgeoriënteerd programmeren geïntroduceerd en besproken heb 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, de vertraging() functie is geen goede manier om je programma te laten wachten, want het is wat bekend staat als a “blokkeren” functie.
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. Wanneer het eindelijk pings, en het brood springt goudbruin uit, Henry legt 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.
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 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 geworden.
Het is een dwaze analogie, maar het illustreert het punt.
Het blokkeren functies voorkomen dat een programma iets anders doet totdat die specifieke taak is voltooid. Als je meerdere wilt acties om tegelijkertijd te gebeuren, kun je gewoon niet gebruiken vertraging().
In het bijzonder, als uw toepassing vereist dat u voortdurend gegevens van aangesloten sensoren ophaalt, moet u ervoor zorgen dat u de vertraging() functie, omdat deze absoluut pauzeert alles.
gelukkig, vertraging() is niet de enige manier om je programma te laten wachten bij het coderen voor Arduino.
Maak kennis met Millis ()
De millis () functie voert een enkele taak uit. Als het wordt opgeroepen, wordt het geretourneerd (als een lang datatype) het aantal milliseconden dat is verstreken sinds het programma voor het eerst werd gelanceerd. Dus waarom is dat nuttig??
Omdat je met een klein beetje eenvoudige wiskunde gemakkelijk kunt “tijd” aspecten van uw programma zonder invloed 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.
Dit programma - dat sterk gebaseerd is op een van de officiële documentatie van Arduino - werkt door de vorige geregistreerde tijd van de huidige tijd af te trekken. 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 vorige keer variabele naar de huidige tijd en schakelt de LED in of uit.
En omdat het een niet-blokkerende code is die zich daarbuiten bevindt als verklaring zou normaal moeten werken.
Eenvoudig, toch? Merk op hoe we de variabele hebben gemaakt huidige tijd als een ongetekend lang. Een ongetekend waarde betekent eenvoudig dat het nooit negatief kan zijn; we doen dit zodat het maximale aantal dat we kunnen opslaan groter is. Standaard worden nummervariabelen ondertekend, wat één betekent “beetje” 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 een manier om timing te benaderen in ons Arduino-programma, dat beter is dan vertraging(). Maar er is een andere, veel betere manier, maar complexer: interrupts. Deze hebben het voordeel dat je precies je Arduino-programma kunt timen en snel kunt reageren op een externe ingang, maar in 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 het programma of wordt een functie aangeroepen, beter bekend als een Onderbrekingshandler of een Onderbreking van de serviceroutine. 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
Gebruik makend van millis () Toegegeven, neemt 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 zonder de multitasking op de Arduino niet doen.
Als u een voorbeeld wilt zien van millis () gebruikt in een real-world Arduino-project, bekijk James Bruce's Arduino Night Light en Sunrise Alarm. 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)
Ontdek meer over: Arduino, programmeren.