2. Digitális portkezelés, feltételes elágazás, változók - Arduino és programozása

Keresés a weboldalon

Programozási alapismeretek
Tartalomhoz ugrás

Főmenü:

2. Digitális portkezelés, feltételes elágazás, változók

Haladás
5. témakör: digitális portkezelés, feltételes elágazás, funkcióhívás, változók kezelése
Az Arduino Mega 54 (0-53) digitális port kezelésére alkalmas (ide kattintva megtekinthető a lábkiosztás). Alapértelmezésben, minden digitális port induláskor bemenetként definiálódik. Ennek ellenére az áttekinthető program érdekében, mindig adjuk meg a pinMode utasítással a void setup() területen, a portok működési irányát! A digitális port alapvetően két irányt vehet fel, kimenetként [pinMode (pin, OUTPUT);], vagy bemenetként [pinMode (pin, INTPUT);] üzemelhet. Létezik egy harmadik, bemeneti utasításforma is, [pinMode (pin, INTPUT_PULLUP);], mely a portra kötött eszköznek (pl. nyomógomb) HIGH logikai szintre felhúzó ellenállást biztosít.
Digitális kimenet
A digitális kimeneti funkció a digitálisan vezérelhető eszközök (pl. LED, relé, léptető motor...stb.) vezérlésére szolgál. Utasítása digitalWrite (pin, LOW vagy HIGH);, aszerint hogy az eszközre logikai 0-t vagy 1-t akarunk kapcsolni.
Értelmezési példák:
/* kapcsoljuk be a fejlesztő panel 30-s portján található LED-t!*/
void setup() {
pinMode(30, OUTPUT);
}
void loop() {
digitalWrite (30, HIGH);
/*a LED bekapcsol és amíg az arduino működik, bekapcsolva marad*/
}
/* villogtassuk a fejlesztő panel 30-s portján található LED-t! A be- és kikapcsolás olyan gyorsan történik, hogy a szemünk nem veszi észre, ezért a bekapcsolt állapotot, de a kilapcsoltat is késlleltetnünk kell.*/
void setup() {
pinMode(30, OUTPUT);
}
void loop() {
digitalWrite (30, HIGH); //LED bekapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, LOW); //LED kikapcsol
delay (1000); //késleltet 1000 ms-t
/* a LED 1 másodpercre bekapcsol, és 1 másodpercig kikapcsolva van, a void loop() területen való elhelyezése miatt, ezt kikapcsolásig végzi.*/
}
/* Háromszor villantsduk fel a fejlesztő panel 30-s portján található LED-t! */
void setup() {
pinMode(30, OUTPUT);
digitalWrite (30, HIGH); //LED bekapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, LOW); //LED kikapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, HIGH); //LED bekapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, LOW); //LED kikapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, HIGH); //LED bekapcsol
delay (1000); //késleltet 1000 ms-t
digitalWrite (30, LOW); //LED kikapcsol
delay (1000); //késleltet 1000 ms-t
/* Mivel csak háromszor akarjuk felvillantani a LED-t a programot  a void setup() területre kell elhelyezni, ami a futás során csak egyszer fut le.*/
}
void loop() {
}
Gyakorló feladatok
A feladatok a fejlesztó panel 30-37-s portján található LED-k vezérlésére vonatkoznak!

  1. Készíts programot, mely a 30-s porton található LED-t felvillantja 200ms időre, majd kikapcsolja, egyben bekapcsolja a következő (31) LEDE-t szintén 200ms időre, és így tovább a 37-s porton található LED-ig. A folyamat lefutása után a LED-k visszafelé haladva villannak fel! Oda-vissza futó fénypont! A program, kikapcsolásig fut!
  2. Készíts programot, mely a 30-s porton található LED-t bekapcsolja, majd 200ms után bekapcsolja a következő (31) LEDE-t, és így tovább a 37-s porton található LED-ig. A folyamat lefutása után a LED-k visszafelé haladva kapcsolnak le! Oda-vissza haladó fénysáv! A program, kikapcsolásig fut!
  3. Készíts programot, mely haladó fénysáv hatását kelti! Az optikai jelenség a páros és páratlan számú LED-k egymás utáni, együttes felvillantásával érhető el, bizonyos váltási sebesség esetén. Az elkészült programhoz keresd meg azt a váltási időt, ahol a jelenség a leginkább érvényesül.
    A program, kikapcsolásig fut!
Feltételes elágazó utasítás (digitális bemenet téma)
Nyomógomb használatakor csak a megnyomás ideje alatt világít a LED. Szoftveresen viszont lehet kapcsolót "varázsolni" a nyomógombból. Ehhez meg kell ismerni a feltételes elágazóutasítást. Részletek ide kattintva érhetők el!
Értelmezési példa:
// A nyomógomb megnyomására a LED ellentétes állapotot vesz fel.
int swichstat = LOW; // kapcsoló állapot, kezdeti érték 0
int lastswichstat = LOW; // utolsó kapcsoló állapot
void setup() {
pinMode(31, OUTPUT); // 31-s LED beállítása
pinMode(45, INPUT_PULLUP); // 45-s porton lévő kapcsoló olvasásra állítása belső felhúzó ellenállással
}
void loop() {
swichstat = !digitalRead (45); // kapcsoló állapot negált értékének változóba való beolvasása
if (swichstat == HIGH && lastswichstat == HIGH) /*Ha a kapcsoló aktuális értéke 1 és az előző állapot is 1 volt, akkor váltsa át a LED állapotát*/
  {
    digitalWrite (31, !digitalRead(31));// LED állapot beolvasása és negálása
}
lastswichstat = swichstat;//utolsó állapot beállítása az aktuális kapcsoló állapotra
}
digitális bemenet
A digitális bemeneti funkció a digitális jelet szolgálatató eszközök (pl. nyomógomb, kapcsoló...stb.) állapotának beolvasására szolgál.
Utasítása digitalRead (pin);, amely porton található eszköz logikai értéke az utasítás válasza. A fejlesztő panelon található nyomógomboknak nincs felhúzó ellenállásuk, ezért a mikrovezérlő belső felhúzó ellenállását kell használni! A beolvasó porthoz pinMode (pin, INPUT_PULLUP) utasítást kell használni!
Értelmezési példák:
// a 45-s porton található nyomógomb megnyomására kapcsoljon be a 33 porton lévő LED.
void setup() {
pinMode (33, OUTPUT);//LED port beállítás kimenetre
pinMode (45, INPUT_PULLUP);// kapcsolóport beállítása olvasásra
}
void loop() {
digitalWrite (33, !digitalRead(45)); /* a kiíró utasításba beágyazásra került a kapcsoló beolvasó utasítása, és kapott egy felkiáltó jelet, ami a negálás jele. Erre azért van szükség, mert a kapcsoló aktív állapota logikai 0-a, a LED bekapcsolásához 1-re van szükség*/
}
Funkcióhívás (digitális kimenet téma)
A funkcióhívás egy gyakran ismétlődő programrész(rutin, vagy szubrutin) külön kezelését, és adott pillanatban való, névvel történő hívását jelenti. A programrészt a void loop() művelet után kell elhelyezni,  és void név () {....} formában kell elkészíteni! Hivatkozni rá a futó programágban  név(); formában lehet. A létrehozható rutinok száma nincs korlátozva.
Értelmezési példa:
// A 30-s porton lévő LED-del az SOS morze jelét (. . . - - - . . .) villogtatjuk folyamatosan
void setup() {
 pinMode(30, OUTPUT); // 30-s port beállítása kimenetként
}
void loop() {
 dot(); dot(); dot(); // dot() nevű funkciót hívjuk háromszor
  delay(300);  //késleltetés a betük között 300 ms
 dash(); dash(); dash();  // dash() nevű funkciót hívjuk háromszor
 delay(300); //késleltetés a betük között 300 ms
 dot(); dot(); dot(); // dot() nevű funkciót hívjuk háromszor
 delay(2000); // ismétlés 2 sec után
}
void dot() {    // a "dot" nevű funkció definiálása
 digitalWrite(pin, HIGH); // LED bekapcsolása
 delay(100);  // 100 ms bekapcsolva tartás
 digitalWrite(pin, LOW); // LED kikapcsolása
 delay100);  // 100 ms késleltetés
// visszalépés a meghívó programrész utáni utasításra
}
void dash() {   // a "dash" nevű funkció definiálása
 digitalWrite(pin, HIGH);   // LED bekapcsolása
 delay(250);  // 250 ms bekapcsolva tartás
 digitalWrite(pin, LOW); // LED kikapcsolása
 delay(250); // 250 ms késleltetés
// visszalépés a meghívó programrész utáni utasításra
}
Változók kezelése (digitális kimenet téma)
A változók a programozási feladatok adattároló eszközei. Feladatigénytől függően különfélet változó típusok léteznek. Részletek itt olvashatók! A változókat, használat előtt a program számára létre kell hozni (deklarálni), nevesíteni kell! Egy változó feladatától föggően lehet helyi vagy globális. Helyi változókat egy programrészen belül (pl. ciklus) deklarálunk, de csak azon belül hivatkozhatunk rá hiba nélkül. A globális változót a void setup() előtt kell létrehozni, viszont  a programon belül bárhol hivatkozhatunk rá!
Értelmezési példák:
/* példa a helyi változók használatára, melyben felvillantjuk
a 30-s porton lévő LED-t háromszor*/
void setup() {
pinMode(30, OUTPUT); //port beállítása kimenetre
for ( int i= 0, i < 3, i++) {  
/*a ciklus utasítás, melyen belül hoztunk létre egy egész típusú változót
és a cikluson belül hajtunk végre rajta műveleteket*/
digitalWrite (30, HIGH); // LED bekapcsolása
delay (500); // késleltetés 500 ms
digitalWrite (30, LOW); // LED kikapcsolása
delay (500); // késleltetés 500 ms
} // ez a for utasítás bezáró kapcsos zárójele
} // ez a void setup () utasítás bezáró kapcsos zárójele
void loop() {
//egyszer lefutó a program, így a void loop() üres maradhat
}
/* példa a globális változók használatára, melyben 3 LED-t (30, 31, 32) egymás után villantunk fel a kikapcsolásig ismételve*/
int t= 500;
void setup() {
pinMode(30, OUTPUT); //portok beállítása kimenetként
pinMode(31, OUTPUT);
pinMode(32, OUTPUT);
} // ez a void setup () utasítás bezáró kapcsos zárójele
void loop() {
t=t-10; // minden ciklusban a t értéke 10-l kevesebb, gyorsuló kiírás
digitalWrite (30, HIGH); // 30-s porton lévő LED bekapcsolása
delay (t); // késleltetés t változó értéke szerint
digitalWrite (30, LOW); // 30-s porton lévő LED kikapcsolása
digitalWrite (31, HIGH); // 31-s porton lévő LED bekapcsolása
delay (t); // késleltetés t változó értéke szerint
digitalWrite (31, LOW); // 31-s porton lévő LED kikapcsolása
digitalWrite (32, HIGH); // 32-s porton lévő LED bekapcsolása
delay (t); // késleltetés t változó értéke szerint
digitalWrite (32, LOW); // 32-s porton lévő LED kikapcsolása
} //a folyamat annyira felgyorsul, csak a 30-s LED fénye lesz látható
Vissza a tartalomhoz | Vissza a főmenühöz