multitasking vedl počítačů k revoluci, kde jeden nebo více programů lze spustit současně, což zvyšuje efektivitu, flexibilitu, přizpůsobivost a produktivitu. Ve vestavěných systémech mohou mikrokontroléry také zpracovávat Multitasking a provádět dvě nebo více úkolů současně, aniž by zastavily aktuální pokyny.

zde v tomto tutoriálu se dozvíme, jak Arduino provádí Multitasking s funkcí Arduino millis. Obecně se v Arduinu používá funkce delay() pro periodický úkol, jako je blikání LED, ale tato funkce delay () zastaví program na nějakou definitivní dobu a nedovolí provádět další operace. Takže tento článek vysvětluje, jak se můžeme vyhnout používání delay() funkce a nahradit ji s millis (), aby provádět více úloh současně, a aby Arduino Multitasking správce. Než se pustíme do detailů, začněme s podhodnocením multitaskingu.

co je Multitasking?

Multitasking jednoduše znamená provádění více než jednoho úkolu nebo programu současně. Téměř všechny operační systémy mají multitasking. Tento druh operačních systémů je známý jako MOS (multitasking operating system). MOS může být mobilní nebo stolní PC operační systém. Dobrý příklad multitasking u počítače, když uživatelé spustit e-mailovou aplikaci, internetový prohlížeč, přehrávač médií, hry, ve stejnou dobu, a pokud uživatelé nechtějí používat aplikace běží v pozadí, pokud není uzavřen. Koncový uživatel používá všechny tyto aplikace současně, ale OS bere tento koncept trochu jinak. Pojďme diskutovat o tom, jak OS spravuje multitasking.

Co je to Multitasking v Arduino

Jak je vidět na obrázku, CPU rozděluje čas na tři stejné části a přiřadit každé části, aby každý úkol/aplikace. Takto se multitasking provádí ve většině systémů. Koncept bude pro Arduino Multitasking téměř stejný, s výjimkou rozložení času bude trochu jiné. Protože Arduino běží na nízké frekvenci a RAM porovnat k Notebooku/Mobilu/PC, takže daný čas na každý úkol bude také jiný. Arduino má také funkci delay (), která se používá široce. Ale než začneme, pojďme diskutovat o tom, proč bychom neměli používat funkci delay () v žádném projektu.

proč přeskočit delay () v Arduinu?

Pokud je uvažována referenční dokumentace Arduina, pak existují dva typy funkcí zpoždění, první je delay () a druhá je delayMicroseconds(). Obě funkce jsou identické, pokud jde o zpoždění generování. Jediný rozdíl je v tom, že ve funkci delay () je celé číslo parametru předáno v milisekundách, tj. pokud zapíšeme zpoždění (1000), pak zpoždění bude 1000 milisekund, tj. 1 sekunda. Podobně ve funkci delayMicroseconds () je předaný parametr v mikrosekundách, tj. pokud zapíšeme delaymicrosekundy (1000), pak zpoždění bude 1000 mikrosekund, tj. 1 milisekundy.

zde přichází bod, obě funkce pozastaví program na dobu, která uplynula ve funkci zpoždění. Pokud tedy dáváme zpoždění 1 sekundy, procesor nemůže přejít na další instrukci, dokud neprošel 1 sekunda. Podobně v případě, že zpoždění je 10 sekund pak program se zastaví po dobu 10 sekund a procesor nedovolí jít na další instrukce, dokud 10 sekund uplynulo. To brání výkonu mikrokontroléru z hlediska rychlosti a provádění pokynů.

nejlepším příkladem pro vysvětlení nevýhody funkce zpoždění je použití dvou tlačítek. Zvažte, že chceme přepínat dvě LED diody pomocí dvou tlačítek. Pokud je tedy stisknuto jedno tlačítko, měla by odpovídající LED svítit po dobu 2 sekund, podobně, pokud je stisknuto druhé, pak by LED měla svítit po dobu 4 sekund. Ale když použijeme delay (), pokud uživatel stiskne první tlačítko, program se zastaví na 2 sekundy a pokud uživatel stiskne druhé tlačítko před zpožděním 2 sekund, mikrokontrolér nepřijme vstup, protože program je ve fázi zastavení.

oficiální dokumentace Arduina to jasně uvádí ve svých poznámkách a varováních o popisu funkce delay (). Můžete projít a podívat se na to, aby to bylo jasnější.

Proč používat millis() ?

Chcete-li překonat problém způsobený použitím delay, vývojář by měl použít funkci millis (), která se snadno používá, jakmile se stanete obvyklým, a použije 100% výkon procesoru bez generování jakéhokoli zpoždění při provádění pokynů. millis() je funkce, která prostě vrátí částku milisekund, které uplynuly od desky Arduino začal běží aktuální program, aniž by zmrazení programu. Toto časové číslo přeteče (tj. vrátí se na nulu) přibližně po 50 dnech.

stejně jako Arduino má delayMicroseconds (), má také micro verzi millis () jako micros (). Rozdíl mezi micros a millis spočívá v tom, že micros () přeteče přibližně po 70 minutách ve srovnání s millis (), což je 50 dní. Takže v závislosti na aplikaci můžete použít millis () nebo micros ().

Using millis() instead of delay():

Chcete-li použít millis() pro časování a zpoždění, je třeba zaznamenat a uložit čas, ve kterém akce se konala na začátku čas a pak kontrolovat v pravidelných intervalech, zda vymezený čas uplynul. Jak je uvedeno, uložte aktuální čas do proměnné.

unsigned long currentMillis = millis();

potřebujeme další dvě proměnné, abychom zjistili, zda uplynul požadovaný čas. Uložili jsme aktuální čas do proměnné currentMillis, ale také musíme vědět, kdy začalo časové období a jak dlouho je období. Takže Interval a předchozímilis je deklarován. Interval nám řekne časové zpoždění a previosMillis uloží poslední událost došlo.

unsigned long previousMillis;unsigned long period = 1000;

abychom to pochopili, Vezměme si příklad jednoduché blikající LED. Období = 1000 bude nám říkají, že LED bude blikat po dobu 1 sekundy nebo 1000ms.

const int ledPin = 4; // the LED pin number connectedint ledState = LOW; // used to set the LED stateunsigned long previousMillis = 0; //will store last time LED was blinkedconst long period = 1000; // period at which to blink in msvoid setup() { pinMode(ledPin, OUTPUT); // set ledpin as output}void loop() { unsigned long currentMillis = millis(); // store the current time if (currentMillis - previousMillis >= period) { // check if 1000ms passed previousMillis = currentMillis; // save the last time you blinked the LED if (ledState == LOW) { // if the LED is off turn it on and vice-versa ledState = HIGH; } else {ledState = LOW;} digitalWrite(ledPin, ledState);//set LED with ledState to blink again }}

prohlášení <, pokud (currentMillis – previousMillis >= perioda)> kontroluje, zda 1000ms prošel. Pokud uplynulo 1000 ms, LED bliká a znovu se dostane do stejného stavu. A tohle pokračuje. To je vše, naučili jsme se používat millis místo zpoždění. Tímto způsobem nebude zastavit program pro konkrétní interval.

přerušení v Arduinu funguje stejně jako v jiných mikrokontrolérech. Deska Arduino Uno má dva samostatné kolíky pro připojení přerušení na GPIO pin 2 a 3. Podrobně jsme to pokryli v tutoriálu Arduino přerušení, kde se můžete dozvědět více o přerušení a jak je používat.

zde ukážeme Arduino Multitasking zpracováním dvou úkolů současně. Úkoly budou zahrnovat blikání dvou LED diod v různých časových zpožděních spolu s tlačítkem, které bude použito k ovládání stavu zapnutí / vypnutí LED. Takže tři úkoly budou provedeny současně.

Schéma Obvodu pro Arduino Multitasking

Komponenty Potřebné

  • Arduino UNO
  • Tři Led diody(Jakékoliv Barvy)
  • Rezistence (470, 10k)
  • Mikiny
  • Prkénko

Schéma

obvod diagram pro prokázání použití Arduino Millis() funkce je velmi snadné a nemá moc komponent, aby se připojit, jak je uvedeno níže.

Schéma Obvodu pro Arduino Multitasking pomocí Arduino Millis() Funkce

Programování Arduino UNO pro Multitasking

Programování Arduino UNO pro multitasking bude vyžadovat pouze logika, jak millis() dílo, které je vysvětleno výše. Doporučuje se cvičit blink LED pomocí millis znovu a znovu, aby byla logika jasná a pohodlně se s millis (), než začnete programovat Arduino UNO pro multitasking. V tomto tutoriálu je přerušení také používáno s millis () současně pro multitasking. Tlačítko bude přerušení. Stisknutí tlačítka, LED se přepne do stavu zapnuto nebo Vypnuto.

programování začíná deklarováním čísel pinů, kde jsou připojeny LED diody a tlačítko.

int led1 = 6;int led2 = 7;int toggleLed = 5;int pushButton = 2;

dále zapíšeme proměnnou pro uložení stavu LED pro budoucí použití.

int ledState1 = LOW;int ledState2 = LOW;

Jen jak je vysvětleno výše v mrknutí například proměnné pro období a previousmillis je deklarována porovnávat a vytvářet zpoždění pro Led diody. První LED bliká, na každou 1 sekundu a další LED bliká v po 200ms.

unsigned long previousMillis1 = 0; const long period1 = 1000;unsigned long previousMillis2 = 0;const long period2 = 200; 

Další funkce millis bude použit pro generování zpoždění zpoždění, aby se zabránilo vícenásobné stisky tlačit na tlačítko. Bude existovat podobný přístup jako výše.

int debouncePeriod = 20; int debounceMillis = 0;

tyto tři proměnné budou použity k uložení stavu tlačítka jako přerušení, přepínání LED a stavu tlačítka.

bool buttonPushed = false;int ledChange = LOW; int lastState = HIGH;

Definujte akci pin, který pin bude fungovat jako vstup nebo výstup.

 pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(toggleLed, OUTPUT); pinMode(pushButton, INPUT);

nyní definujte PIN přerušení připojením přerušení s definicí ISR a režimu přerušení. Vědomí, že je doporučeno použít digitalPinToInterrupt(pin_number) při deklarování attachInterrupt() funkce přeložit skutečné digitální pin na konkrétní přerušit číslo.

attachInterrupt(digitalPinToInterrupt(pushButton), pushButton_ISR, CHANGE); 

podprogram přerušení je zapsán a změní pouze příznak buttonPushed. Všimněte si, že přerušení podprogramu by mělo být co nejkratší, zkuste jej napsat a minimalizovat další pokyny.

void pushButton_ISR(){ buttonPushed = true; }

smyčka začíná ukládáním hodnoty millis do proměnné currentMillis, která uloží hodnotu uplynulého času pokaždé, když smyčka iteruje.

unsigned long currentMillis = millis();

je Tu celkem tři funkce v multitasking, blikat jedna LED na 1 sekundu, Blikání druhé LED na 200ms a Pokud tlačítko není stisknuto, pak VYPNOUT/zapnout LED. Takže pro tento úkol napíšeme tři části.

první přepíná stav LED po každé 1 sekundě porovnáním uplynulých millis.

 if (currentMillis - previousMillis1 >= period1) { previousMillis1 = currentMillis; if (ledState1 == LOW) { ledState1 = HIGH; } else { ledState1 = LOW; } digitalWrite(led1, ledState1); }

podobně druhý přepíná LED po každých 200ms porovnáním uplynulých millis. Vysvětlení je již vysvětleno dříve v tomto článku.

 if (currentMillis - previousMillis2 >= period2) { previousMillis2 = currentMillis; if (ledState2 == LOW) { ledState2 = HIGH; } else { ledState2 = LOW; } digitalWrite(led2, ledState2); }

a Konečně, buttonPushed vlajka je monitorován a po generování zpoždění zpoždění 20ms to jen přepíná stav LED odpovídá tlačítko připojené jako přerušení.

 if (buttonPushed = true) // check if ISR is called { if ((currentMillis - debounceMillis) > debouncePeriod && buttonPushed) // generate 20ms debounce delay to avoid multiple presses { debounceMillis = currentMillis; // save the last debounce delay time if (digitalRead(pushButton) == LOW && lastState == HIGH) // change the led after push button is pressed { ledChange = ! ledChange; digitalWrite(toggleLed, ledChange); lastState = LOW; } else if (digitalRead(pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }

tím se dokončí výukový program Arduino millis (). Všimněte si, že s cílem získat obvyklé s millis (), jen praxe implementovat tuto logiku v některých jiných aplikacích. Můžete jej také rozšířit o použití motorů, servomotorů, senzorů a dalších periferií. V případě pochybností napište na naše fórum nebo komentář níže.

kompletní kód a Video pro demonstraci použití funkce millis v Arduinu je uveden níže.

Napsat komentář

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