Negyedik program: Tegyük össze amink van!

Tehát, már tudunk szép lassan fényt folyatni, és közben érzékelni, hogy merre kellene folynia a fénynek! Ezt a két dolgot kombináljuk: ha az egyik oldalra kell folynia, akkor a sand értékét növeljük, ha a másik oldalra, akkor meg csökkentjük.

byte sand;

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

void loop() {
    if (digitalRead(0)==0) { // ha be van kapcsolva az érzékelő
        // lábak a padló felé néznek
        sand=sand+1;
    }
    else {
        // lábak a mennyezet felé néznek
        sand=sand-1;
    }

    analogWrite(5, sand);
    analogWrite(6, 255-sand);
    delay(20);
}

Hát ez azért nem egy űrtechnika eddig! Szépen is megy, csak egy a baj: nem hajlandó megállni a fény, ha már a lenti kupac tele van, hanem hirtelen visszaugrik, és újrakezdni. De miért?

A numerikus túlcsordulás

Húúú de rémisztő kifejezés! De nem harap. Egyszerűen arról van szó, hogy amíg lefelé megy a fény, a sand értéke növekszik. De a sand egy olyan zsebben van, aminek a legnagyobb értéke 255 lehet. Ha ehhez hozzáadunk még egyet, akkor... akkor a 256 már nem fér be a zsebbe. 255+1 az bármennyire is fura, pont 0, és emiatt kezdődik újra az egész.

Természetesen használhatnánk nagyobb zsebet is, és akkor kicsit több idő múlva történne ez meg, de ugyanígy megtörténne. Ráadásul fordítva is megtörténik: ha 0-ból akarunk 1-et kivonni, akkor 0-1 az 255 lesz.

Bármennyire is fura ez, nap mint nap találkozol vele. Láttál már mutatós órát? A perc mutató ott is 59 után 0-ra ugrik - mivel a percek értéke csak 0..59 lehet.

Ha éppen beállítod a pontos időt, lehet, hogy visszafelé kell tekerned az órát. Ekkor előfordulhat, hogy 0 percről visszább tekerve az előző óra 59-ik percére érkezel.

A matematikában tetszőlegesen nagy számokkal számolunk, de a való életben és a számítógépekben is korlátozott hogy milyen nagy számokat kezelünk. Szóval nincs ezzel baj. Csak ismernünk kell, és számítani rá!

Azt kellene megoldani, hogy amikor 255-ig eljut a homok nagysága, akkor ne akarjon tovább menni, hanem ott álljon meg. Meg persze fordítva is, ha 0 homok van lenn, akkor ne akarjon abból elvenni mégegy homokszemet. Ez úgy hangzik, mint egy-egy feltétel!