Arduino Tutorial: millis() gebruiken in plaats van delay()

een bekende Arduino-functie is delay() die het programma pauzeert voor een hoeveelheid milliseconden die als parameter wordt gespecificeerd.

millis(), aan de andere kant, is een functie die de hoeveelheid milliseconden die zijn verstreken sinds het programma start retourneert.

op het eerste gezicht kunt u twijfelen aan het nut van deze functie. Feit is dat het zeer nuttig is in veel scenario ‘ s, vaak “vervangen” delay() volledig. Laten we eerst eens kijken hoe we millis() bijna precies zoals delay()kunnen gebruiken.

bij de programmering zijn vaak problemen met de Timing aan de orde.

met millis () – achtige vertraging()

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {time_now = millis(); Serial.println("Hello"); while(millis() < time_now + period){//wait approx. ms}}

Als u wilt dat uw code om gewoon te pauzeren voor 1000 ms aan het einde van elke lus iteratie, de code hierboven is een beetje dom. U kunt in plaats daarvan gewoon delay(1000) gebruiken. Het enige verschil tussen de bovenstaande code en een code met delay(1000) aan het einde is dat de lus in de bovenstaande code één keer per seconde vrij nauwkeurig zal lopen. De lus in een code met delay(1000) zal iets minder vaak draaien omdat het ook wat tijd kost om Serial.println("Hello")uit te voeren.

waarom millis() gebruiken in plaats van delay ()?

we zullen nu twee voordelen bekijken met millis() vergeleken met delay().

nauwkeurige Timing

het eerste voordeel dat we zullen bespreken is nauwkeurige timing. Code-wise, hebben we dit behandeld in het laatste hoofdstuk. Met millis() kunnen we ervoor zorgen dat de lus zo vaak loopt als we willen, ongeacht de uitvoeringstijd (uiteraard zolang de uitvoeringstijd minder tijd is dan de gewenste periode). Met delay() is dit niet mogelijk omdat we niet weten hoe lang de lus uitvoertijd is.

nauwkeurige timing zoals deze is zeer nuttig bij het bemonsteren met een bepaalde frequentie of het uitvoeren van filters, onder andere.

niet-blokkerend

het andere voordeel met millis() is dat het ons niet zal verhinderen om code te draaien tijdens het “wachten”.

laten we zeggen dat we “Hello” eenmaal per seconde over serieel willen afdrukken terwijl we ondertussen andere dingen doen. Dit is niet mogelijk met delay() omdat de volledige code wordt onderbroken. Hier is een manier waarop we dit kunnen doen.:

int period = 1000;unsigned long time_now = 0;void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_now + period){time_now += period;Serial.println("Hello");} //Run other code}

dit stuk code is vrijwel gelijk aan het eerste stuk, behalve dat het de rest van het programma niet blokkeert wanneer het niet over serieel wordt afgedrukt.

voorbeeld: een eenvoudige Scheduler

laten we een eenvoudig voorbeeld schrijven waarin we een scheduler maken die bepaalde stukjes tekst met verschillende intervallen afdrukt.

#define INTERVAL_MESSAGE1 5000#define INTERVAL_MESSAGE2 7000#define INTERVAL_MESSAGE3 11000#define INTERVAL_MESSAGE4 13000unsigned long time_1 = 0;unsigned long time_2 = 0;unsigned long time_3 = 0;unsigned long time_4 = 0;void print_time(unsigned long time_millis);void setup() {Serial.begin(115200);}void loop() {if(millis() >= time_1 + INTERVAL_MESSAGE1){time_1 +=INTERVAL_MESSAGE1;print_time(time_1);Serial.println("I'm message number one!");} if(millis() >= time_2 + INTERVAL_MESSAGE2){time_2 +=INTERVAL_MESSAGE2;print_time(time_2);Serial.println("Hello, I'm the second message.");} if(millis() >= time_3 + INTERVAL_MESSAGE3){time_3 +=INTERVAL_MESSAGE3;print_time(time_3);Serial.println("My name is Message the third.");} if(millis() >= time_4 + INTERVAL_MESSAGE4){time_4 += INTERVAL_MESSAGE4;print_time(time_4);Serial.println("Message four is in the house!");}}void print_time(unsigned long time_millis){Serial.print("Time: ");Serial.print(time_millis/1000);Serial.print("s - ");}

zo ziet de eerste 60 seconden in de seriële monitor eruit:

dit is een leuke en gemakkelijke manier om executies in uw code te synchroniseren. Je bent in staat om andere code tegelijkertijd uit te voeren.

micros () en overvol

net zoals delay() een microseconde-versie heeft met de naam delayMicroseconds(), heeft millis() micros(). Als u een betere resolutie nodig heeft, kan micros() de juiste oplossing zijn.

houd er echter rekening mee dat micros() na ongeveer 70 minuten overloopt, vergeleken met millis()50 dagen. Dit betekent dat de retourwaarden van de functies helemaal opnieuw beginnen vanaf nul.

belangrijker: lees deze blogpost om te leren hoe u het probleem van overflow kunt voorkomen.

samenvatting

millis() en micros() zijn echt handige functies om te gebruiken bij het omgaan met timing taken. Als u zich hiervan niet bewust bent, kunt u in plaats daarvan delay() gebruiken, wat niet altijd zo goed zal werken (of helemaal niet).

voor meer Arduino tips & trucs, Bekijk onze Arduino Tutorials blog categorie. Stay tuned voor meer Arduino-gerelateerde content in de toekomst ook!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.