zou moeten gebruiken de allereerste keer dat u een Arduino bord gebruikte, deed u waarschijnlijk zoiets als dit:
- een LED aangesloten op uw Arduino
- uploadde de standaard blink sketch die uw LED elke seconde
zou in-en uitschakelen dit heet het “Hello World” programma van Arduino en laat zien dat u met slechts een paar regels code iets kunt maken dat een echte wereld toepassing heeft.
in het vorige voorbeeld gebruikt u de delay() functie om de intervallen te definiëren tussen het in-en uitschakelen van de LED.
hier is de deal: hoewel delay () handig is en werkt voor basisvoorbeelden, moet je het echt niet gebruiken in de echte wereld… Lees verder om te leren waarom.
hoe de functie delay() werkt
de manier waarop de functie Arduino delay () werkt is vrij eenvoudig.
het accepteert een enkel geheel getal als argument. Dit getal staat voor de tijd in milliseconden dat het programma moet wachten tot het overgaan naar de volgende regel code.
wanneer u de vertraging(1000) doet stopt uw Arduino 1 seconde op die lijn.
delay () is een blokkeringsfunctie. Blokkerende functies voorkomen dat een programma iets anders doet totdat die specifieke taak is voltooid. Als u meerdere taken tegelijkertijd wilt uitvoeren, kunt u delay () gewoon niet gebruiken.
als uw toepassing vereist dat u voortdurend gegevens van invoer leest/bewaart, moet u het gebruik van de delay() functie vermijden. Gelukkig is er een oplossing.
millis() functie om te redden
de millis () functie wanneer aangeroepen, geeft het aantal milliseconden terug die zijn verstreken sinds het programma voor het eerst werd gestart.
Waarom is dat nuttig?
omdat u met wat wiskunde eenvoudig kunt controleren hoeveel tijd er is verstreken zonder uw code te blokkeren.
onderstaande schets laat zien hoe u de functie millis() kunt gebruiken om een blink-project te maken. Het zet het LED-licht 1000 milliseconden aan en schakelt het dan uit. Maar het doet het op een niet-blokkerende manier.
laten we een blink sketch bekijken die zonder vertraging werkt:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Raw-code
deze schets hierboven kan hier worden gevonden en het werkt door de eerder opgenomen tijd (previousMillis) af te trekken van de huidige tijd (currentMillis). Als de rest groter is dan het interval (in dit geval 1000 milliseconden), werkt het programma de vorige Millis variabele bij aan de huidige tijd, en schakelt het de LED in of uit.
en omdat het een niet-blokkerende code is, zou elke code die zich buiten dat first if statement bevindt normaal moeten werken.
u kunt nu begrijpen dat u andere taken aan uw loop() functie kunt toevoegen en dat uw code nog steeds elke seconde met de LED knippert.
welke functie moet u gebruiken?
we hebben twee verschillende manieren geleerd om met de tijd om te gaan met de Arduino. Het gebruik van de millis() functies kost een beetje extra werk in vergelijking met het gebruik van delay(). Maar uw programma ‘ s kunnen niet multitasking op de Arduino zonder het doen.