Időzítés



Az időre, az időzítésre több utasítás is szolgál a programozási nyelven belül. Van olyan ami késleltetést hozz létre, van ami a bekapcsolástól eltelt időt méri milli- illetve mikroszekundumban .

Először nézzük a késleltetőket:

delay() - evvel már találkoztunk párszor ;) , a zárójelben megadott ideig késlelteti a program futását. Az időt mindig ezred másodpercben számolja (1s = 1000ms, 1m = 60000ms) .

pl.: delay(2000) két másodpercig megállítja a futást. A késleltetés nagyon nagy hátránya, hogy teljesen leállítja a program futását, míg a delay fut addig semmi más nem hajtódik végre így amikor lehet általában kerülik a használatát és inkább a Millis() utasítással helyettesítik. Persze egyszerű programoknál bátran használható.


delayMicroseconds() - a zárójelben megadott ideig késlelteti a program futását, a delay-hoz képest

itt csak a megadható érték nagysága változott meg, ugyanis az itt beírt számok mikroszekundumban

adják a várakozási időt. 1ms = 1000us , 1s = 1000000us (tehát 1 milliszekundum az 1000 mikroszekundum, 1 másodperc az 1 000 000 mikroszekundum). Ezek a nagyon kis értékű várakozási idők egy csomó projektben nagyon hasznosak, például a szervó vezérlés, analóg bemenetről mintavételezés, egyes kommunikációk. Ez az utasítás csak 16383-ig képes kezelni a beírt értékeket, ennél nagyobb értéknél használjuk a delay utasítást.



Most nézzük az időmérő utasításokat:

millis() - az Arduino bekapcsolás óta eltelt idejét méri milliszekundumban. Egy idő elteltével túlcsordul és nulláról kezdi a számolást, ezt a túlcsordulási időt a hivatalos honlapon 50 nap körül adták meg, de más helyeken én kilenc órákat olvastam. Ahogy látom a számolt értéket unsigned long-ban adja meg ami

4 294 967 295 értéket vehet fel. Egy óra az 3 600 000 ms amiből adódik, hogy a túlcsordulás 1193,04 óra múlva megtörténik ami 49,71 nap. Szóval akár óraként is használható ha kicsit több mint 49 naponként újra beállítjuk rajta a pontos időt.


micros() - a bekapcsolás óta eltelt időt méri mikroszekundumban( egy millió mikroszekundum az
egy másodperc). A hivatalos adatok szerint a micros túlcsordulása kb.: 70 perc után következik be.


Egy egyszerű példaprogram időkijelzésre a millis segítségével:

unsigned long time;
int ora,perc,mperc,uperc;

void setup(){
Serial.begin(9600);
}

void loop(){
time = millis(); // time változó feltöltése a millis értékével
if (time>=1000){
mperc = time/1000;/ másodperc kiszámolása
if (time>=60000){
perc = time/60000;// perc kiszámolása
mperc = (time%60000)/1000;//mp újra számolása
if (time>=3600000){
ora = time/3600000;//óra kiszámolása és a perc mperc újraszámolása
perc= (time%3600000)/60000;
mperc=((time%3600000)%60000)/1000;
}
}
}

// idő kiíratása másodpercenként

if(mperc != uperc){
Serial.print(ora);
Serial.print(":");
Serial.print(perc);
Serial.print(":");
Serial.println(mperc);
uperc = mperc;
}
}


lehet, hogy kicsit zagyvának tűnik a program felépítése, de most csak így tudtam megoldani. A három egymásba ágyazott if ciklus ellenőrzi a az eltelt időt, az első a másodperceket, ha millis értéke eléri az 1000 (1s) akkor végrehajtódik az mperc kiszámítása. Az első ciklusból tovább lép a program futása ha a millis értéke eléri a 60000 (1perc), itt kiszámolja az eltelt percek számát, majd a maradékból a mpercek számát a következő utasítás segítségével:

mperc = (time%60000)/1000;
A % jel a maradékosztás jele. A leírt program sor annyit tesz: oszd el a time értékét 60000-rel és
amit nem tudsz már tovább osztani úgy, hogy egész számot kapjál az lesz az osztásod eredménye és
azt osztod tovább 1000-rel.
Egyszerűsített példával: 8 % 6 = 2 ha a nyolcat elosztom hattal egyet kapok egészként, kettőt maradékként.
A harmadik (legbelső) ciklusmag csak akkor hajtódik végre ha a millis eléri a 3600000 (1 óra) értéket. Újra számolja a percet és az mpercet is és felülírja az értéküket.
Kiíratás másodpercenként, ha mperc értéke megváltozik kiíratjuk az időt.