Multitasking avagy párhuzamos vezérlés. Jobb kifejezés rá a párhuzamos feladat végrehajtás. Miért is van erre szükség? Nem minden esetben, de vannak feladatok melyekhez szükséges egy kis extra programozás. Ilyenkor jön jól a feladatok közötti váltás. Ennek az egyszerű általam használt megoldását láthatod ebben az írásban. Amikor egyszerre több eszközt használok, akkor szükséges a multitasking. Persze ez feladat függő, akkor jön jól, ha egy időben több különböző idő ciklussal rendelkező feladatot kell ellátni. Van egy régebbi projektem az akvárium világítás vezérlés. Abban a leírásban inkább csak bemutató jelleggel volt a program megemlítve. Itt viszont LED-ek vezérlésén keresztül látható a működése.
Egy kis bevezetés
A leírás a következő képen van felépítve. Adott egy Arduino NANO 2db LED ellenállásokkal. És egy feladat: az eggyes számú LED 1 másodperces a kettes számú LED 250 milliszekundumos impulzusokkal villogjon. Lépésről lépésre fogom megmutatni, hogyan jutok el a párhuzamos feladat végrehajtásig. Először egy LED felkapcsolása, majd villogtatása. Utána 2 LED villogtatása. Ezeknél a megoldásoknál még a beépített delay függvényt használva. Amivel pontosan lehet időzíteni, de ez a függvény csak megállítja a program futását a beírt ideig, így el is érkeztünk oda, hogy nem fog világítani egyszerre a 2 LED. És itt kell használni a párhuzamos feladat végrehajtást. Az Arduino nyelv készletét itt érdemes tanulmányozni: nyelvi referenciák.
Szoftver környezet

Használt program: Arduino Pro IDE 0.0.6
Hardver: Arduino Nanao
Egy LED bekapcsolása
Az első példa programhoz nincs is mit tenni mint 1 LED-el vezetékezni a Nano-t. Semmi extra csak egy parancs ami felkapcsolja a kimenetet.
És a kód ami nem tesz mást mint a 2-es kimenetet magas jelre viszi, és a rá kötött LED világítani fog.
// 1xLED light
byte LED_1 = 2;
void setup() {
Serial.begin(9600);
Serial.println("run...");
pinMode(LED_1, OUTPUT);
digitalWrite(LED_1, HIGH);
Serial.println("LED_1 is ON");
}
void loop() {}
Egy LED pulzálása
Maradunk egy LED-nél, de most mér egy másodperces frekvenciával villogtatjuk. Ehhez a kódot egy kicsikét meg kell változtatni. Ezen ponton a legegyszerűbb a delay() használata, annyi időre megáll a program végrehajtása amennyit a paraméterben megadunk. Az érték milliszekundumban van.
//1xLED Pulse
byte LED_1 = 2;
void setup() {
Serial.begin(9600);
Serial.println("run...");
pinMode(LED_1, OUTPUT);
}
void loop() {
digitalWrite(LED_1, HIGH);
Serial.println("LED_1 is ON");
delay(1000);
digitalWrite(LED_1, LOW);
Serial.println("LED_1 is OFF");
delay(1000);
}
És jöhet két LED-el a villogás
A kódot feltöltve tapasztalható, hogy nem villognak együtt a LED-ek. Az első LED 1000 milliszekundumos, míg a második LED 250 milliszekundumos intervallumra van állítva. Ellenben egymás után sorban működik a dolog, pont úgy ahogy a program sorokat feldolgozza a kontroller.
//2xLED pulse
byte LED_1 = 2;
byte LED_2 = 3;
void setup() {
Serial.begin(9600);
Serial.println("run...");
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
}
void loop() {
digitalWrite(LED_1, HIGH);
Serial.println("LED_1 is ON");
delay(1000);
digitalWrite(LED_1, LOW);
Serial.println("LED_1 is OFF");
delay(1000);
digitalWrite(LED_2, HIGH);
Serial.println("LED_2 is ON");
delay(250);
digitalWrite(LED_2, LOW);
Serial.println("LED_2 is OFF");
delay(250);
}
Végre multitaszking, működik!
A kódot feltöltve látható, hogy megfelelő időben villognak a LED-ek. Persze ez már egy bonyolultabb program kód. Be lett vezetve pár változó, plusz a bekapcsolás óta eltelt időt a millis() függvénnyel folyamatosan figyelni kell. És amikor a megfelelő feltételek bekövetkeznek, vagy felkapcsolok egy LED-et, vagy le. A kapcsolandó LED-ek külön saját függvénybe vannak vezérelve. Így érhető el, hogy különböző időben villognak.
//2xLED multitasking
byte LED_1 = 2;
byte LED_2 = 3;
unsigned long LED_1_TIME = 0;
unsigned long LED_2_TIME = 0;
boolean LED_1_status = false;
boolean LED_2_status = false;
void setup() {
Serial.begin(9600);
Serial.println("run...");
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
}
void loop() {
doLED_1();
doLED_2();
}
void doLED_1() {
if (millis() > LED_1_TIME) {
LED_1_TIME = millis() + 1000;
LED_1_status = !LED_1_status;
if (LED_1_status) {
digitalWrite(LED_1, HIGH);
Serial.println("LED_1 is ON");
} else {
digitalWrite(LED_1, LOW);
Serial.println("LED_1 is OFF");
}
}
}
void doLED_2() {
if (millis() > LED_2_TIME) {
LED_2_TIME = millis() + 250;
LED_2_status = !LED_2_status;
if (LED_2_status) {
digitalWrite(LED_2, HIGH);
Serial.println("LED_2 is ON");
} else {
digitalWrite(LED_2, LOW);
Serial.println("LED_2 is OFF");
}
}
}
Végszó
Nem azt mondom, hogy ez a legjobb módszer, de egyszerű és ha csak pár dolgot akarok egy időben vezérelni akkor simán működik. Ráadásul az akvárium vezérlésnél már bevált. A lényeg, hogy a delay() funkciót kihagyva az időzítés vezérléséből, nem áll meg a programunk futása, hanem folyamatosan működik.
Arduino kategória további bejegyzései:
- Arduino multitaskingOlvasási idő: 3 perc Multitasking avagy párhuzamos vezérlés. Jobb kifejezés rá a párhuzamos feladat végrehajtás. Miért is van erre szükség? Nem minden esetben, de…
- Arduino Nano BMP180 tesztOlvasási idő: 4 perc BMP180 egy alap szenzor egy időjárás állomás elkészítéséhez. Megkapjuk tőle a légnyomást, hőmérsékletet, és még a tengerszint feletti magasságot is….
- Arduino pro IDE telepítése Linux-raOlvasási idő: 4 perc Arduino programozására eddig a sima Arduino IDE-t használtam. Viszont rátaláltam egy egy alfa kiadásra ami már 2019 októberében megjelent. Jelenleg…
- Arduino Nano fotodióda tesztOlvasási idő: 2 perc Fotodióda tesztelése Arduino Nano-val. Az általam használt dióda egy éjszakai fényt adó egységből való, így nem tudom a típusát, sem…
- Arduino DS1307-RTC dátum, idő beállításOlvasási idő: 3 perc Ezt az eszköz már elég régóta használom, de most volt vele csak gondom. És így megosztom, azt a pár egyszerű…
- Arduino – Akvárium világítás vezérlésOlvasási idő: 8 perc Arduino mikrokontrollerrel akvárium világítás vezérlés. Vezérlés szempontjából csak a világítás a lényeg, de vannak extrái is. Ilyenek LCD kijelzőn megjelentendő…
linuxStyler hozzászólásai