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ét LED bekötése után jöhet a program ellenőrzése. Maradok a delay() használatánál.

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 multitasking
    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 teszt
    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-ra
    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 teszt
    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ás
    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ű…