Digitális bemenet


Az első programunkkal bemutattuk a digitális kimenet használatát, most lássuk ugyan ezt
bemenetként. Igaz már írtam egy egy cikket evvel kapcsolatban, de itt most ezt megpróbálom
bővebben kivesézni. Az előző cikk megtalálható: *Arduino digitális bemenet   140322


Mi kell a projekthez?
Arduino Uno + USB kábel
egy nyomógomb
egy 10kohmos ellenállás
próbapanel
néhány összekötő vezeték.

Ha nincs próbapanelod össze is forraszthatod az alkatrészeket légszerelésben, a lényeg az hogy
az ellenállás segítségével negatív tápfeszre húzzuk a bemenetet.

A kapcsolás szerintem senkinek nem okoz problémát:

Itt megint a beépített ledet használjuk kimeneti eszközként, koncentrálva a bemenetre.

Nézzük a programot:
Először is a setup-ba beállítjuk a be illetve kimeneteket:

void setup(){
pinMode(13, OUTPUT);//13-as láb kimenet
pinMode(4, INPUT);//4-es láb bemenetként
}

A pinMode-t már tárgyaltuk, a második érték „INPUT” konstans(állandó) tehát kimenet.
A két perjel „//” után írhatunk egysoros emlékeztetőket, megjegyzéseket evvel segítve a progi
könnyebb használatát. Ezeket sosem veszi figyelembe a fordító.


Másodszor a mag ami folyamatosan végrehajtódik:

void loop(){
}
Ezen belül helyezzük el a fő programrészt.

A bemenetek értékét a digitalRead() utasítással tudjuk olvasni, egyetlen paramétert tartalmaz
a beolvasandó láb számát vagy nevét.
pl.: digitalRead(4);


A bemeneti értéket valamilyen módon fel kell dolgozni ahhoz, hogy bármire is használhassuk,
talán az egyik legegyszerűbb az összehasonlítás.
Az összehasonlítást az if() feltételes utasítással végezzük. Nézzünk erre egy példát:
if(digitalRead(4) == HIGH){
}

Beolvassuk a 4-es láb értékét és összehasonlítjuk az egyenlőség másik oldalán lévő értékkel, ha
megegyeznek akkor végrehajtódik a kapcsos zárójelek tartalma. Ha nem egyeznek akkor jön az
if második része az „elseutasítás.
else{
}
Jelentése: „különben”, tehát ha az if összehasonlító kifejezése( itt egyenlősége) nem igaz akkor az
if kapcsos zárójeleiben lévő utasítások nem hajtódnak végre, viszont az else-é igen (ha if-é hajtódik végre akkor else-é nem).


Ha az if után nincs else akkor a program automatikusan átugorja az if utasításait (hamis érték
esetén) és az utasítás blokk után folytatja futását.


Az összehasonlítás műveleti jelei közül a legtöbbet használtak:
== az egyenlőség, a == b azt jelenti, hogy a és b értékét összehasonlítom ez által a kifejezés csak
akkor lesz igaz ha a és b egyenlő értékű. Ez azért fontos mert ha azt írjuk fel, hogy a = b evvel
értéket adunk a-nak méghozzá b értékét így ez a kifejezés mindig igaz lesz, tehát összehasonlításként nem használhatjuk.

!= jelentése nem egyenlő. pl.: a != b A kifejezés igaz ha a nem egyenlő b
< kisebb
> nagyobb
< = kisebb vagy egyenlő
>= nagyobb vagy egyenlő.


Nézzük még a HIGH konstansot, itt a digitális ki- és bemenetek értékeiként használhatók.
A digitális portok mindig csak két értéket bírnak csak felvenni:
HIGH az egyik, ez magas állapotot jelent (+5V) a porton.
LOW alacsony állapot (0V).


Áttárgyaltuk az utasításokat lássuk a teljes programot:

void setup(){
pinMode(13,OUTPUT);
pinMode(4,INPUT);
}
void loop(){
if(digitalRead(4) == HIGH){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
}

A program hatására a teszt led mindaddig világít míg a nyomógomb lenyomott állapotban van,
ha felengedjük a led kialszik.


Nézzünk most egy olyan kapcsolást ahol a led első gombnyomásra bekapcsol, másodikra ki.
Az alkatrészeken és a kapcsoláson semmit nem kell változtatni, csak a programunkat kell átírni.

Lássuk:
az első progiban megnéztük a digitális bemenet értékét, ha magas volt akkor a led kimenet is
magas szintre váltott, ha alacsony volt akkor a led kimenet is. Most azt kell elérnünk, hogyha
lenyomjuk a gombot és a digitális kimenet alacsony szinten van, akkor magasra váltson,
illetve ha lenyomjuk a gombot a és a digitális kimenet magason van akkor alacsonyra váltson.

Mint látható itt két feltételt kell megvizsgálni, ezt most két if ciklus egymásba ágyazásával fogjuk
elérni:

if(digitalRead(4) == HIGH){
if(digitalRead(13) == LOW){
utasitások1}  //2. If lezárása
utasítások2}  //1.if lezárása

Az első if megvizsgálja, hogy le van-e nyomva a gomb, ha igen akkor mehetünk a második if
ciklusra, hogy megvizsgáljuk a 13-as kimenet állapotát ha alacsony akkor végrehajtódik az
utasítások1-es blokk, ha magas akkor az utasítások2-es blokk.


A teljes program ez:
void setup(){
pinMode(13,OUTPUT);
pinMode(4,INPUT);
}
void loop(){
if(digitalRead(4) == HIGH){
delay(350);
if(digitalRead(13) == LOW){
digitalWrite(13,HIGH);
}
else {
digitalWrite(13,LOW);
}
}
}

Az else a második if-hez tartozik tehát ha az első feltétel teljesül viszont a második nem, akkor
kerül sor az else-ben kiadott utasításokra.
A két if közötti delay() a nyomógomb lenyomás és a kimeneti állapot érzékelésének lassítására
szolgál, ugyanis olyan gyorsan fut a program, hogy egy gombnyomás alatt többször megvizsgálja
a kimenet állapotát és ahhoz képest változtatja meg azt. Így teljesen véletlen szerűvé válik a
működése, ezért kell a késleltetés. Nekem a 350ms érték már jó lett de ez eltérő lehet.


Folyt. Köv.