Arduino bemutató: a millis() használata késés helyett()

egy jól ismert Arduino függvény delay(), amely a paramétert megadott milliszekundumig szünetelteti a programot.

millis(), másrészt egy olyan függvény, amely visszaadja a program kezdete óta eltelt milliszekundumok mennyiségét.

első pillantásra kétségbe vonhatja ennek a funkciónak a hasznosságát. Az a tény, hogy rendkívül hasznos sok esetben, gyakran “helyett” delay() teljesen. Először nézzük meg, hogyan használhatjuk a millis() – ot majdnem pontosan úgy, mint a delay().

az időzítési kérdések gyakran jelen vannak a programozásban.

Millis () használata, mint a késleltetés()

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}}

ha azt szeretné, hogy a kód csak szüneteltesse az 1000 ms-ot az egyes hurok iterációk végén, a fenti kód kissé ostoba. Ehelyett csak a delay(1000) értéket használhatja. Az egyetlen különbség a fenti kód és a delay(1000) végű kód között az, hogy a fenti kód ciklusa másodpercenként elég pontosan fog futni. A delay(1000) kódban lévő hurok egy kicsit ritkábban fog futni, mivel a Serial.println("Hello")végrehajtása is eltart egy ideig.

miért használjuk a Millis() függvényt a delay () függvény helyett?

most a millis()két előnyét vizsgáljuk a delay() – hez képest.

pontos időzítés

az első előny, amelyet megvitatunk, a pontos időzítés. Kódszerűen, ezt az utolsó fejezetben tárgyaltuk. A millis() segítségével biztosíthatjuk, hogy a hurok olyan gyakran futjon, amennyit csak akarunk, függetlenül a végrehajtási időtől (nyilvánvalóan mindaddig, amíg a végrehajtási idő kevesebb, mint a kívánt időszak). delay() esetén ez nem lehetséges, mivel nem tudjuk, mennyi a ciklus végrehajtási ideje.

az ilyen pontos időzítés nagyon hasznos, ha bizonyos frekvencián mintavételt végez, vagy többek között szűrőket futtat.

nem blokkoló

a millis() másik előnye, hogy nem akadályozza meg a kód futtatását “várakozás”közben.

tegyük fel, hogy a “Hello” – t sorozatonként egyszer szeretnénk kinyomtatni, miközben közben más dolgokat csinálunk. Ez nem lehetséges delay() esetén, mivel szünetelteti a teljes kódot. Itt van egy módja annak, hogy ezt megtehessük:

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}

ez a kóddarab nagyon hasonlít az első darabra, azzal a különbséggel, hogy nem blokkolja a program többi részét, ha nem nyomtat sorozatosan.

példa: egyszerű ütemező

írjunk egy egyszerű példát, ahol létrehozunk egy ütemezőt, amely bizonyos szövegrészeket különböző időközönként nyomtat.

#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 - ");}

így néz ki az első 60 másodperc a Soros monitoron:

ez egy szép és egyszerű módja annak, hogy szinkronizálja a végrehajtásokat a kódban. Ön képes futtatni más kódot egyszerre is.

micros() és túlcsorduló

csakúgy, mint a delay() rendelkezik egy mikroszekundumos verzióval delayMicroseconds(), a millis()rendelkezik micros() -vel. Ha jobb felbontásra van szüksége, akkor a micros() lehet az út.

azonban vegye figyelembe, hogy a micros() körülbelül 70 perc elteltével túlcsordul, szemben a millis() 50 napjával. Ez azt jelenti, hogy a függvények visszatérési értékei nulláról kezdődnek.

ennél is fontosabb: hogy megtanulják, hogyan lehet elkerülni a túlcsordulás kérdés alltogether, olvassa el ezt a blogbejegyzést.

összefoglaló

millis() és micros() nagyon hasznos funkciók az időzítési feladatok kezeléséhez. Ha nem ismeri ezeket, előfordulhat, hogy a delay() – et használja helyette, ami nem mindig működik olyan jól (ha egyáltalán).

további Arduino tippek & trükkök, nézd meg a Arduino oktatóanyagok blog kategóriában. Maradjon velünk a jövőben is több Arduino-val kapcsolatos tartalomért!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.