Arduino-suli: karácsonyfa-világítás házilag
A karácsonyfád éke lehet az az égősor, amelynek működését személyesen programoztad. Ehhez minden segítséget megkapsz tőlünk.
Nem lehet elég korán kezdeni a karácsonyi készülődést, ezt talán az jelzi legjobban, hogy az üzletekben már októberben megjelennek az ünnep közeledtét jelző, megvásárolható díszítések, ajándékcsomagok és az elengedhetetlen zenei aláfestés. A fára kerülő díszek beszerzését valóban nem érdemes az utolsó pillanatra hagyni, mert így bőven lesz választék, és tényleg olyan dolgokat aggathatsz rá, amelyek tökéletesen megfelelnek az ízlésednek.
Ha kellően korán megvásároltad az égősort, még arra is lesz időd és módod, hogy egy Arduinóhoz kötve felprogramozd. Cikkünkben lerántjuk a leplet arról, hogyan alakíthatsz át egy szimplán világító, LED-es égősort úgy, hogy az az általad megadott paraméterek szerint villogjon.
Kellékek és előkészületek
Alapvetően csupán néhány dologra lesz szükséged az egyedi villogást kínáló eszköz elkészítéséhez. Az Arduino mikrovezérlő mellett érdemes vásárolnod egy külső tápot, valamint - attól függően, hogy milyen összeállításban gondolkodsz - jól jöhet egy prototípuslapka és néhány kábel is. Emellett egy nyomógomb beszerzését is javasoljuk, a módváltásokhoz nem árt (de ha egyéni utat választanál, természetesen annak sincs akadálya).
Mindezek mellett kelleni fog természetesen maga az égősor, s bár relémodulokkal az Arduino lehetővé teszi, hogy hálózatra kötött változatot is használj, ezt mégsem javasoljuk, mert komoly balesetveszélyt hordoz magában egy ilyen szétvágott és konnektorvégre kötött eszköz. Lehetőleg azokat a modelleket vedd számításba, amelyek elemtartóval jelzik, hogy alacsonyabb áramigénnyel is beérik. Ezekkel biztonságosabban dolgozhatsz, és nem áll fenn a veszélye, hogy megsütöd Arduinódat. Különösen figyelj arra, hogy kizárólag LED-es - és lehetőleg minél kedvezőbb áron kínált - égősorok közül válogass, mert a hagyományos égők programozása sokkal problémásabb lehet.
A beszerzést követően máris érzékeny búcsút vehetsz az elemtartótól, ettől ugyanis mindenképpen meg kell szabadulnod, hogy hozzáférhess a kábelekhez. Többnyire csak egy aprócska forrasztás csatlakoztatja a kábelezést az elemtartó fémtappancsaihoz, ha e forrasztás mentén sikerül ügyesen szétválasztanod a beérkező huzalokat, szépen egyben maradnak majd a vékony szálak. Ezzel a kellékeid megvannak ugyan, ám égősorod jelen formájában működésképtelen, így itt az idő, hogy egy Arduino segítségével életre keltsd. Szerencsére magához a teszteléshez nem kell extra kód sem, annyi csupán a dolgod, hogy az eredetileg az elemtartó negatív oldalához kapcsolódó huzalt az Arduino GND jelzésű portjába, a másikat pedig az 5 V feliratú áramforrásba kötöd, és ha áram alá helyezed a mikrokontrollert, akkor már világítanak is az égők.
Kóddal vezérelve
Persze az egyszerű világításra alapértelmezetten is képes lett volna az égősor, vagyis pusztán ezért felesleges lenne szétszedni. Térjünk is át gyorsan a kódolásra. Elsőként ajánlott az Arduino fedélzeti LED-jét villogtató Blink.ino szoftvert a mikrovezérlőre tölteni, ez a program tökéletesen alkalmas arra, hogy megoldjuk a ki- és bekapcsolást. A szoftvert a Fájl menü Példák /01. Basics útvonalán érheted el, az összeállítás átszerelésekor pedig pusztán annyi lesz a teendőd, hogy a 13-as csatlakozóba helyezed a pozitív oldalhoz tartozó kábelt, így a fedélzeti LED-hez hasonlóan az égősor is képes lesz a ki- és bekapcsolásra.
Persze a felvillantásokon kívül valószínűleg azt is szeretnéd, ha pulzáló fényjátékban is gyönyörködhetnél kedvedre. Ez utóbbit az áramerősség szabályozásával valósíthatod meg. Ehhez azonban nem mindegy, melyik pinre kötöd az Arduinót, mert kizárólag a PWM felirattal (vagy ~ jellel ellátott) pinek azok, amelyek ezt lehetővé teszik. A legtöbb mikrovezérlőn az 3, 5, 6, 9, 10, 11-es csatlakozók pontosan ilyenek, így ezek bármelyikét használhatod a célra. A pulzálás eléréséhez nyiss egy új kódot, majd a setup függvény előtt hozd létre a projektben használt pin címkéjét (const int ledPin = 9;), illetve egy egész számokat tartalmazó values változót is (int values;).
Ezek után a setupban mindössze annyi lesz a dolgod, hogy beállítod kimenetként ezt a csatlakozót (pinMode(ledPin, OUTPUT);), és már át is léphetsz a loop függvény belsejébe. Ide gépeld be a fade(500); sort, állíts be egy kis késleltetést az eltolódások között(delay(100);), és ezzel a szakasszal végeztél is. Így már csak annyi van hátra, hogy meghatározod, milyen feladatot hajtson végre az égősor ezzel a kifejezéssel. A loop kapcsos zárójele után üss egy entert, és a void fade(int values){ } sor segítségével hozd létre a függvényt, amely alapértelmezetten egy számváltozót vár.
Ha ezzel megvagy, egy ciklusban módosítsd a pin áramellátását (for(int i=0;i<values;i++){analogWrite(ledPin, i);delay(1); } ), miáltal a megadott értékig növekszik a világítás mértéke. Utána illessz be egy olyan sort, amelynek létrehozásakor mindent ugyanígy alakítottál, csak a ciklus leírásánál a maximális értékről csökkented a számokat. Ha szeretnéd, hogy nagyjából egyenletes legyen a felkapcsolás és lekapcsolás időtartama, akkor a kódot még egészítsd ki egy normalizáló sorral, amely a pin minimális 0 és 1023 közötti értékére vetíti a kiszemelt intervallum számait (int k=map(i,0,values,0,1023);), majd ennek az értékét add át az analogWrite esetén a ledPinnek.
Váltás gombnyomásra
Most, hogy a pulzálás már működik, ideje az eszközhöz egy gombot is csatolnod, ezzel tudod majd megváltoztatni a villogási mintákat. A kódot bővítsd annyival, hogy a setup előtt beillesztesz egy const int buttonPin = 2; címkét, amely a 2-es pinhez csatlakoztatott gombra hivatkozik, egy int buttonState=0; állapotjelzőt, valamint egy int next=0; értéket a léptetéshez. A setup belsejében a meglévő utasítás mellett adj bemeneti státuszt a gombodnak (pinMode(buttonPin, INPUT);). Mielőtt rátérnél a loopra, ugorj a kód végére, és hozz létre még egy void ledOn(){} és egy void ledOff(){} függvényt.
Az egyikkel kapcsold fel (digitalWrite(ledPin, HIGH);), a másikkal kapcsold le (digitalWrite(ledPin, LOW);) a teljes LED-sort, hiszen ez extra opciókat kínál. Ezek után irány a loop, ahol első lépésként töröld ki a benne található utasításokat, olvasd be a gomb értékét, és tárold is el a buttonState változóban (buttonState = digitalRead(buttonPin);), majd egy feltételben vizsgáld azt az eshetőséget, ha épp lenyomtad a gombot. Amennyiben ez megtörtént, növeld a next értékét, és adj hozzá némi késleltetést is (if (buttonState == HIGH) {next++; delay(200);}).
Ezt követően készíts egy többválasztós elágazást a switch segítségével, amelyben a next és az állapotok számának megfelelő mennyiségű osztási maradékokat vizsgálod (switch(next%3){ }). Belül az egyes eseteket sorolod fel a case opciók mellett, és add meg a tevékenységeket is. A 0 érték esetén kapcsold ki a LED-et (case 0: ledOff(); break;), ha 1 a maradék, kapcsold be (case 1: ledOn(); break;, 2 esetén pedig aktiváld a pulzálást (case 2: fade(1000); break;). A switch után, a függvény végére pedig biggyessz némi késleltetést (delay(100);). Ha mindent megfelelően hajtottál végre, akkor a feltöltést követően már végig is próbálhatod a különféle villogási opciókat, amelyeket nyugodtan kiegészíthetsz extra fényjátékkal is.
A kód
const int ledPin = 9; const int buttonPin = 2; int values; int buttonState=0; int next=0;
void setup(){ pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); }
void loop(){ buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) { next++; delay(200);}
switch(next%4){ case 0:ledOff(); break; case 1: ledOn(); break; case 2: fade(1000);break;} delay(100);}
void fade(int values){ for(int i=0;i<values;i++){ int k=map(i,0,values,0,1023);analogWrite(ledPin, k); delay(1); for(int i=values;i>0;i--){ int k=map(i,0,values,0,1023); analogWrite(ledPin, k); delay(1); } }
void ledOn(){ digitalWrite(ledPin, HIGH); delay(100);}
void ledOff(){ digitalWrite(ledPin, LOW);delay(100); }