Harmadik program: Indulhat a fény!

Azt szeretnénk, hogy ne csak világítson, hanem szépen egyenletesen növekedjen az alsó leden a fény, miközben a felső ledről elfogy a fény. Meg persze ha megfordítod a panelt, akkor fordítva, tehát mindig fentről lefelé essen a fény.

Ehhez valahol meg kell jegyezni, hogy épp most mennyi "homok" azaz fény van mondjuk a "lenti" oldalon. Ahogy múlik az idő, változni kell a "homok" nagyságának.

Mi az hogy változó?

A változó arra való, hogy egy számot jól megjegyezzünk. Képzeld el, hogy van egy nagy zsebes mellénykéje a mikrovezérlőnek, és egy jó adag üres jegyzetpapírja. Először odalenn 0 szem homok van, így felírja egy papírra, hogy 0, és beteszi a bal felső zsebébe.

Utána eltelik pár utasítás, és azt mondjuk neki, hogy vedd elő hogy mennyi homok van odalenn, és tegyél hozzá még egy homokszemet. Erre kiveszi a bal felső zsebéből a számot, hozzáad egyet, és a régi értéket kiradírozza, leírja helyette az újat, és visszarakja a zsebébe. A papíron most tehát 1 van.

Később újra hozzáad 1-et, és így tovább. Bármikor, ha tudnunk kell, hogy hogy áll a homok, csak elő kell venni a zsebünkből a számot.

Nos, valójában a zsebek a memória részei, és jó sok papírkára jó sok számot felírhatunk. Hogy tudjuk, melyik mit jelent, a zsebeket is ellátjuk egy-egy névvel, pont úgy, ahogy a konstansokat neveztük el.

byte sand; // a homok nagysága "lent"

void setup() {
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(0, INPUT_PULLUP);
    sand=0; // kezdjük nulla szem homokkal 
}

void loop() {
    sand=sand+1; // növeljük a homok számát egy szem homokkal
    analogWrite(5, sand); // ez a led mutatja hogy mennyi homok van lenn
    analogWrite(6, 255-sand); // ez a led mutatja hogy mennyi homok maradt fenn
    delay(20);
}

Már megint csaltam? Á dehogy. Csináltam egy zsebecskét, amit elneveztem sand-nak, ez a legelső sor. Ott van a sand előtt egy olyan szó, hogy byte - ezzel azt jelzem, hogy mégis mekkora zsebre van szükségem. A byte egy olyan zseb, amiben 0 és 255 közti egész számok lehetnek. Vannak másfajta zsebek nagyobb számokra, negatív számokra, törtszámokra, stb, de nekünk ez most pont elég, hiszen az analogWrite csak 0..255 között tudja változtatni a led fényerejét.

A setup rész végén azt mondtam, hogy legyen a sand nevű zsebünkben egy jó nagy 0. Csak hogy tudjuk, honnan indulunk: nincs lenn homok.

A loop részben a sand értékét megnöveltem 1-el. Ez egy fura kifejezés: először kiszámoljuk a sand+1 értékét, amihez kivesszük a zsebünkből a sand mostani értékét, és hozzáadunk 1-et. Aztán pedig az egyenlőségjel művelettel visszatesszük a zsebünkbe. Ez kicsit hasonlít a matekórához, ahol azt mondják, hogy iksz-legyen-egyenlő-kettővel.

Az analogWrite már megvolt, az első az 5-ös porton lévő ledre kiteszi a sand értékét. Bárhol ahol a programban számokat használtunk eddig, használhatunk függvényeket, konstansokat, változókat, sőt, ezeket még matek kifejezésbe is foglalhatjuk. A mikrovezérlő szépen kiveszi a zsebekből a változók értékét, kiszámolja a függvények értékét, előveszi a konstansokat, szoroz-oszt, meg se kottyan neki.

A második analogWrite érdekesebb, a 6-os porton lévő ledre azt írjuk, hogy 255-sand. Szóval ez számolni fog, de miért pont 255-sand? Azért, mert a sand értéke 0 és 255 között fog növekedni, ezért az 5-ös porton a led fénye folyamatosan nő. A 255-sand értéke ha sand 0, akkor 255-0 az 255. Ha meg sand 255, akkor 255-255 az 0. Miközben a sand nő, a 255-sand kifejezés értéke csökken, tehát az 5-os porton a led fénye nő (ahogy alul nő a fénykupac), és a 6-os led fénye csökken (ahogy felül csökken a fénykupac).