Az első NeoPixel program részletei

#include <Adafruit_NeoPixel.h>

const int NEOPIXEL_PORT=0;
const int NEOPIXEL_CNT=1;

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NEOPIXEL_CNT,NEOPIXEL_PORT, NEO_GRB + NEO_KHZ800);

void setup() {
    pixels.begin(); 
}

void fade() {
  for (int b=0;b<=255;b++) {
    pixels.setPixelColor(0, pixels.Color(255-b,b,0)); 
    pixels.show(); 
    delay(40);
  }
  for (int b=0;b<=255;b++) {
    pixels.setPixelColor(0, pixels.Color(0,255-b,b)); 
    pixels.show(); 
    delay(40);
  }
  for (int b=0;b<=255;b++) {
    pixels.setPixelColor(0, pixels.Color(b,0,255-b)); 
    pixels.show(); 
    delay(40);
  }
}

void loop() {
  fade();
}

No, ebben azért van pár fura dolog! Kezdjük sorban!

A NeoPixel lib include-olása

Szép magyar szó az inklúdolás, ugye? Ez a sor azt csinálja, hogy megmondjuk a programnak, hogy az ide leírt programsorokon túl az Adafruit NeoPixel library programsorait is "gondolja ide", és tegye hozzá a programunkhoz. Úgy teszi hozzá, hogy nekünk nem kell kerülgetni azt a több száz sort, de mégis úgy használhatjuk a programunkban, mintha benne lenne.

Az include azt jelenti, benne van. Innen tudja az Arduino IDE, hogyha valamit nem talál a programodban, akkor még kukkantson bele az include-olt libekbe is, hátha ott van!
#include <Adafruit_NeoPixel.h>

Egy NeoPixel-sort kezelő objektum létrehozása

Úúúú, kezdődik a bonyi? Semmi vész, okkal van ez így!

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NEOPIXEL_CNT,NEOPIXEL_PORT, NEO_GRB + NEO_KHZ800);

Szóval, ez úgy néz ki, mint egy változó, nem? Egy kezdőértékkel. Hasonlít erre:

int pixels = 3;

Csak épp a típusa nem int, nem boolean, nem char, nem semmisem, hanem Adafruit_NeoPixel. De honnan van ez a fura típus, és mit jelent?

Ezt a fura típust a libben hozták létre, és hivatalos nevén ez egy objektum-osztály. Eddig csak primitív adattípusokat használtunk (int, bool) amik egyetlen adat tárolására voltak jók. Viszont egy objektum egyszerre több adatot is tárolhat, sőt, műveletek (azaz függvények) is lehetnek benne! Ez egy szuper-változótípus!

Hogyan lehet ezt elképzelni? Tegyük fel, hogy az ismerőseid nevét össze szeretnéd szedni. A név az eddig okés. De minden ismerősnek van ezen kívül címe, telefonszáma, email címe, és így tovább, egy csomó további adat. Sokkal jobb lenne, ha sok-sok különálló változóval nem kellene vacakolni, hanem ezt össze lehetne fogni egyetlen "dologba". A valóságban is így teszünk: ha egy fontos emberrel találkozunk, akkor kapunk EGY névjegykártyát, és nem egy csomó "változót", ugye? Nos, a névjegykártya egy olyan objektum-típus, ami magán belül tartalmazza a nevet, címet, stb.

A fura cucc kezdőértéke is fura: ott mindenféle csupa nagybetűs konstans van! Az első kettőt értjük, hiszen az a mi proginkban van, de az utolsó kettőt még csak nem is mi csináltuk.

Mivel az objektum nem csak egyetlen dolgot tartalmaz, logikus, hogy a több kezdőértéket valami más módon kell megadni, hát ennyi ez az egész! Az első érték azt mondja meg, hogy mennyi NeoPixel ledünk van egymás után kötve, ez most 1, de korábban mutattam ledcsíkokat, ledkarikákat NeoPixelből, ahol ez persze több. A második érték mondja meg, hogy az A-star melyik portján lesznek a NeoPixelek - a 0-ás portra kötötted őket. A harmadik pedig - na ezzel most ne törődjünk (itt lehetne variálni a különböző NeoPixel verziók közötti különbségekkel, de ami nekünk van ahhoz pont ez kell).

A NeoPixel-sort kezelő objektum inicializálása

Az Arduinoban minden libet úgy csináltak meg, hogy van neki egy begin() függvénye, és ezt kell legelőször hívni. Ahogy eddig a mi saját setup-unk a saját bemeneteinket, kimeneteinket állítgatta be, ugyanúgy a neopixelek begin() függvénye a neopixel kezelőt indítja el.

void setup() {
    pixels.begin(); 
}

De mi az a pont a pixels és a begin() között?

Ez a member-operátor azaz egy műveleti jel, mint a + vagy a -. De ez azt jelenti, hogy valaminek a valamije. Mármint nem kell egyből csúnya magyar szavakra gondolni - szóval a pixels nevű objektumnak a begin() metódusa.

Ok, de mi az a metódus?

A metódus az olyan függvénynek a szép neve, ami egy objektumban van létrehozva. Az objektumok nem csak arra jók, hogy sokféle összefüggő adatot tudnak egy dolog képpen tárolni, hanem ezekkel összefüggésben műveletek - azaz metódusok is megadhatók. Jelen esetben a pixels.begin() elkezdi működtetni ezt a NeoPixeles dolgot, majd a pixels.setPixel() bekapcsol egyetlen ledet a megadott színre, és a pixels.show() pedig lenyomja a teljes morze parancsot a ledekbe.

Mindhárom dolog ugyanarról a NeoPixel ledsorról szól, tehát összetartoznak, ezért ugyanabba az objektumba tették ezeket!

NeoPixelek színének beállítása

Hát, ez azért egyszerű: az első szám, hogy melyik led színét akarjuk beállítani, a második pedig egy szín, piros, zöld, és kék összetevőkkel, mindegyik összetevő 0..255 között.

Jelen esetben még csak egyetlen neopixelünk van, így az első szám a nulla.

pixels.setPixelColor(0, pixels.Color(piros,zöld,kék));

Tehát mondjuk egy maxipiros:

pixels.setPixelColor(0, pixels.Color(255,0,0));

Mondjuk egy maxisárga:

pixels.setPixelColor(0, pixels.Color(255,255,0));

Egy nem túl erős kék:

pixels.setPixelColor(0, pixels.Color(0,0,30));

Fontos! Ezek a beállítások nem hajtódnak azonnal végre, csak akkor, ha meghívod a pixels.show() metódust. Ez lesz az, ami az összes beállított színt egy pillanat alatt kimorzézza az összes lednek.

Több NeoPixel

Mi lehet jobb, mint egy NeoPixel? Több NeoPixel! Még több led, még több szín! Ehhez:

Sok NeoPixel

A progi elején írd át a ledek számát:

const int NEOPIXEL_CNT=2; // most 2 ledünk van

A progiban így már mindkét ledre külön hivatkozhatsz. Az alábbi részlet az első ledet picit pirosra, a másodikat picit kékre állítja, majd a show() hívással a ledeken megjelenik a beállított szín:

pixels.setPixelColor(0, pixels.Color(30,0,0)); 
pixels.setPixelColor(1, pixels.Color(0,0,30)); 
pixels.show();

Feladatok

No, most már semmi sem állíthat meg, hogy mindenféle villogásokat és effekteket csinálj! A setPixelColorral bármilyen színt beállíthatsz, a delay-al várakozni lehet, mint a legeslegelső programunkban, így mondjuk csinálhatsz: