Arduino Tutorial: použití millis () místo zpoždění()

známá funkce Arduino je delay(), která pozastaví program na množství milisekund specifikovaných jako parametr.

millis(), na druhou stranu, je funkce, která vrací množství milisekund, které uplynuly od spuštění programu.

na první pohled můžete pochybovat o užitečnosti této funkce. Faktem je, že je to velmi užitečné v mnoha scénářích, často „nahrazující“ delay() úplně. Podívejme se nejprve na to, jak můžeme použít millis() téměř přesně jako delay().

problémy s časováním jsou často přítomny v programování.

Pomocí millis (), jako je zpoždění()

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

Pokud chcete, aby váš kód jen pauza na 1000 ms na konci každé opakování smyčky, kódu výše je trochu hloupé. Místo toho můžete použít delay(1000). Jediný rozdíl mezi výše uvedeným kódem a kódem s delay(1000) na konci je, že smyčka ve výše uvedeném kódu poběží docela přesně jednou za sekundu. Smyčka v kódu s delay(1000) bude spuštěna o něco méně často, protože spuštění Serial.println("Hello")také nějakou dobu trvá.

Proč používat millis () místo delay ()?

nyní se podíváme na dvě výhody s millis() ve srovnání s delay().

přesné načasování

první výhodou, o které budeme diskutovat, je přesné načasování. Kódově jsme se o tom zabývali v poslední kapitole. S millis() můžeme zajistit, že smyčka běží tak často, jak chceme, bez ohledu na čas provedení (samozřejmě tak dlouho, dokud doba realizace je kratší dobu požadované období). U delay() to není možné, protože nevíme, jak dlouho je doba provádění smyčky.

přesné načasování, jako je toto, je mimo jiné velmi užitečné při vzorkování na určité frekvenci nebo při běhu filtrů.

neblokování

další výhodou s millis() je, že nám nezabrání spouštět kód při „čekání“.

řekněme, že chceme tisknout „Ahoj“ přes seriál jednou za sekundu, zatímco mezitím děláme jiné věci. U delay() to není možné, protože pozastaví celý kód. Zde je jeden způsob, jak to udělat:

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}

tento kus kódu je docela podobný prvnímu bloku, kromě toho, že neblokuje zbytek programu, když není tisk přes sériový.

příklad: jednoduchý plánovač

pojďme napsat jednoduchý příklad, kde vytvoříme plánovač, který vytiskne určité kousky textu v různých intervalech.

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

zde vypadá prvních 60 sekund v sériovém monitoru:

to je pěkný a snadný způsob, jak synchronizovat popravy v kódu. Jste schopni spustit jiný kód současně stejně.

micros () a Overflowing

stejně jako delay() má mikrosekundovou verzi nazvanou delayMicroseconds(), millis()micros(). Pokud potřebujete lepší rozlišení, micros() může být způsob, jak jít.

Mějte však na paměti, že micros() přeteče přibližně po 70 minutách ve srovnání s millis()50 dny. To znamená, že návratové hodnoty funkcí budou začínat od nuly.

ještě důležitější je: Chcete-li se dozvědět, jak se můžete vyhnout problému přetečení, přečtěte si tento blogový příspěvek.

shrnutí

millis() a micros() jsou opravdu užitečné funkce pro použití při práci s časovacími úkoly. Pokud si toho nejste vědomi, můžete místo toho použít delay(), což nebude vždy fungovat tak dobře (pokud vůbec).

další tipy pro Arduino & triky, podívejte se na naši kategorii blogu Arduino Tutorials. Zůstaňte naladěni na další obsah související s Arduino i v budoucnu!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.