Második program: kezeljük a bemenetet!

Vajon hogyan lehetne beolvasni a dőlésérzékelő állapotát? Erre való a digitalRead, ami egy függvény, ami 0 vagy 1 értéket ad vissza. 0 ha a dőlésérzékelőben a golyó pont összezárta a két kivezetést, tehát az érzékelő lábai a padló felé néznek, és 1 máskülönben.

Most azt szeretnénk, hogy mindig az a led világítson, ami a padló felé néz.

Ezt úgy képzeld el, hogy:

A golyót vonzza a padló

Feltételek és elágazás

A programunkba tehetünk olyan részeket, amik csak egy bizonyos esetben futnak le. Ezeket az eseteket úgy nevezik, hogy feltétel. Attól függően hogy a feltétel teljesül, vagy nem teljesül, más-más programrészlet fog végrehajtódni, mintha a program kétféle módon folytatódhatna. Ezért a feltételeket úgy is nevezik, hogy elágazás.

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

void loop() {
    if (digitalRead(0)==0) { // ez itt egy feltétel
        // lábak a padló felé néznek
        digitalWrite(5, LOW); 
        digitalWrite(6, HIGH); 
    }
    else {
        // lábak a mennyezet felé néznek
        digitalWrite(5, HIGH); 
        digitalWrite(6, LOW); 
    }
}

Szóval, van az az if-es sor. Az if után zárójelben egy feltétel, ami most úgy működik, hogy kiszámolja a digitalRead(0) értékét (magyarul megnézi, hogy milyen jel érkezett a 0-ás porton), és ha ez pont nulla, akkor az if utáni bajszos zárójelekbe írt két digitalWrite fog végrehajtódni.

Ha a digitalRead(0) értéke nem nulla, akkor pedig az else utáni rész fog végrehajtódni.

Ezek után az else-t bezáró bajszos zárójel utáni rész következne - de oda nem írtunk semmit, így a loop rész elejétől folytatódik a dolog újra és újra.

Ha minden jól megy, ez a progi már megcsinálja azt, hogy mindig az a led világítson, ami a padlóhoz van közelebb. Elvégre is, a homok is lefelé esik. :)

Hogyan lehet feltételt csinálni?

A legegyszerűbb feltételek az összehasonlítások. Az == művelet azt vizsgálja, hogy két érték egyenlő-e. A != művelet akkor igaz (akkor teljesül), ha két érték nem egyenlő. Természetesen van <, >, <=, >= művelet is.

Mi az hogy utasításblokk?

Az utasításblokk egyszerűen bajszos zárójelek közé tett utasításokat jelent. Ezek az utasítások mindig egymás után hajtódnak végre. A loop belseje is egy ilyen utasításblokk, és amit oda írtunk eddig, az szépen egymás után hajtódott végre. Az if után egy új utasításblokk következik, ami csak akkor hajtódik végre, ha az if-ben lévő feltétel igaz.

Praktikus szokás az indentálás, azaz az utasítás-blokkok tartalmának beljebb kezdése. Ehhez használd a tab billentyűt! Azért szoktuk beljebb kezdeni a blokkok tartalmát, hogy első ránézésre lássuk, hogy melyik utasítások mikor fognak végrehajtódni.

// Kicsit nehéz kitalálni, hogy mi fog történni amikor a dőlésérzékelő 
// lábai a padló felé néznek... 

void loop() {
if (digitalRead(0)==0) { // ez itt egy feltétel
// lábak a padló felé néznek
digitalWrite(5, LOW); 
digitalWrite(6, HIGH); 
}
else {
// lábak a mennyezet felé néznek
digitalWrite(5, HIGH); 
digitalWrite(6, LOW); 
}
delay(100);
}

// Kicsit könnyebb kitalálni, hogy ki kivel van 

void loop() {
    if (digitalRead(0)==0) { // ez itt egy feltétel
        // lábak a padló felé néznek
        digitalWrite(5, LOW); 
        digitalWrite(6, HIGH); 
    }
    else {
        // lábak a mennyezet felé néznek
        digitalWrite(5, HIGH); 
        digitalWrite(6, LOW); 
    }
    delay(100);
}

Elsőre talán nem látszik, de egyszerű logika van ebben: leírunk valamit, és utána egy adag utasítást ami ahhoz tartozik. Ilyen például a setup() belseje.

Természetesen ezek egymásba rakhatók: amit most a loop()-ban csináltunk, ott volt if, meg else, ezekhez egy-egy új utasításblokk tartozott:

// Ennyi a logika:

valami {
    másikvalami {

    }
    harmadikvalami {

    }
}

Még a programozás őskorában az emberek képesek voltak vallásháborút indítani arról, hogy a kezdő bajszos zárójel számára mi a legjobb hely. A Wikipedia mutat pár variációt. Mi csináljuk úgy, ahogy mutatom. Nem én találtam ki, hanem a C++ nyelv megalkotójának a stílusa ez. Azért pont így csináljuk, mert a későbbi programnyelvekben ez az írásmód az elfogadott.

A gépnek mindegy!

A gépnek tényleg mindegy, hogy mit melyik sorba írunk, és mennyi bekezdéssel. Akár egyetlen sorban is lehet az egész program! Csak akkor nekünk nehéz megérteni, hogy mit fog csinálni a program, csak ezért fontos, hogy hogyan írjuk le.

A gépnek annyira mindegy, hogy elvetemült emberek versenyeket csinálnak arról, hogy ki tud a lehető legkevésbé áttekinthető, de működő programot írni. Ez például elég jól néz ki ez pedig olyan, mint egy QR kód. Elég elvetemült, nemde?