Hihetetlen egyszerű dolgok...

...amik mégis hihetetlenül macerásak!

Ok, csináljunk egy nagyon egyszerű progit! A 0-ás portra tegyél egy gombot, a 0-ás port és a GND közé bekötve. Annyit szeretnénk, hogy amikor a gombot megnyomják, világítson az A-star beépített sárga ledje.

void setup() {
    pinMode(13, OUTPUT);
    pinMode(0, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(0)==LOW) { // azaz a a gomb meg van nyomva
        digitalWrite(13,HIGH); // akkor a led világítson
    }
    else {
        digitalWrite(13,LOW); // egyébként meg ne világítson
    }
}

Na ez egy tipikusan vakargatjuk a fejünket program! Pedig maga a program egyáltalán:

de mégis, ha ránézel, csak a kommentekből látszik, hogy mi történik.

Az alábbi két példa közül az alsó sokkal olvashatóbb, nem?

// ez persze helyes, de a franc sem tudja elsőre, hogy most akkor 
// miért kettes port meg digital, meg LOW?? 
if (digitalRead(0)==LOW) {

// ez elsőre olvasható: ha buttonPressed (azaz gomb meg van nyomva) akkor...
if (buttonPressed()) {

Akkor most kórusban: A füüüügggvééényekkel el leeeehet reeeejteni a prooooogram mocskoooosabb réééészeit!

const int ON=1;
cosnt int OFF=0;

void setup() {
    pinMode(13, OUTPUT);
    pinMode(0, INPUT_PULLUP);
}

bool buttonPressed() {
    if (digitalRead(0)==LOW) { // azaz a a gomb meg van nyomva
        return true; // most meg van nyomva
    }
    else {
        return false; // most nincs megnyomva
    }
}

void led(byte state) {
    digitalWrite(13,state);
}

void loop() {
    if (buttonPressed()) {
        led(ON);
    }
    else {
        led(OFF);
    }
}

Szerinted segített rajta? Szerintem sokat, a loop belseje már egészen követhető!

Függvény visszatérési értékkel

Mi az a bool ott a buttonPressed-nél? Büszkén jelentem, elkészült az első függvény, ami visszaad valami értéket. Mégpedig bool típust, ami a Boolean rövidítése. Ez azt jelenti, hogy olyan logikai típus, aminek két értéke lehet: true (igaz) vagy false (hamis).

Ez nagyon jól megfelel minden olyan adathoz, aminek kétféle állapota lehet (a gomb meg van nyomva, vagy nincs megnyomva). Gondold el, melyik tűnik emberi logikával értelmesebbnek:

- Meg van nyomva a gomb?
- IGEN (true)

vagy

- Meg van nyomva a gomb?
- 1

Míg a byte típusnak az értékei számok lehetnek, a boolnak csak true meg false. Elég egyszerű. Amikor egy függvény végez, és eredményt szeretnénk szolgáltatni belőle, arra való a return utasítás. Ez azt jelenti, hogy "vissza", azaz végeztünk, és adjuk vissza az utána írt értéket.

A buttonPressedben bool típusú a visszatérési érték, tehát true vagy false amit visszaadhatunk. Ez azért jó, mert a bool értékeket közvetlenül használhatjuk bármelyik feltételben, azaz:

if (buttonPressed()==true) {

helyett egyszerűbben:

if (buttonPressed()) {

Mint minden függvény, a buttonPressed hívása is azt csinálja, hogy ahol használod, ott elindítja a függvényt, és a visszatérési értékét behelyettesíti oda, ahonnan meghívtad. Tehát az if azt hiszi, hogy if (true) vagy if (false) amit kap, attól függően, hogy a buttonPressed mit adott eredményül. A true esetén az if végrehajtja az utána írt utasításblokkot.

Összehasonlító műveletek

Bizonyára észrevetted, hogy minden összehasonlító művelet eredménye is true vagy false. Tehát ha azt írod, hogy if (x<2) akkor a < műveletet megnézi jól a mikrovezérlő, és ha iksz kisebb mint kettő, akkor az egész értéke true lesz, és az if utáni utasításblokk végrehajtódik.

Szerintem kitaláltad, hogy milyen összehasonlító műveletek vannak:

Feladat

Csinálj hűtőszekrény-lámpát. Amikor a gomb meg van nyomva, akkor kell kikapcsolni a ledet, és amikor nincs megnyomva (mert a nyitott hűtőajtó nem nyomja meg), akkor kell bekapcsolni a ledet.

Csinálj lépcsőházi automatikusan lekapcsolódó lámpát. A gomb megnyomásakor fel kell kapcsolni a ledet, várni 10 másodpercet, majd lekapcsolni.