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!