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.
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).