NeoPixel Ring rotátor

Zápisník experimentátora

Hierarchy: WS2812

V tomto článku si vysvetlíme, ako môžeme naprogramovať c++ triedu Rotator, ktorá nám uľahčí ovládanie NeoPixel Ring. Táto trieda má niekoľko parametrov, ktorými definujeme farbu a sýtosť na prstenci. Trieda Rotator sama doplní postupné stmavenie farieb do podoby chvosta a zabezpečí aj animaciu farieb po obvode prstenca.

Príklad

Trieda Rotator v sebe zahŕňa štyri premenné a má dve funkcie. Tie premenné nám definujú pointer na objekt Adafruit_NeoPixel, pozíciu počiatočného bodu, farebný odtieň a sýtosť. Premenné sa nastavia v konštruktore. Obvykle sa inicializácia premenných v konštruktore triedy zapisuje za dvojbodkou, tak ako to vidíte v príklade, ale môžete použiť aj operátor priradenia. Takto je to kratšie a obvykle aj prehľadnejšie. Konštruktor má v definícii zapísané aj implicitné parametre, čo nám umožňuje pri vytvorení objektu vynechať málo sa meniace parametre. Obvykle sa preto vstupné parametre do funkcie píšu tak, že ich zoraďujete od tých najvýznamnejších k menej dôležitým.

Druhá funkcia sa volá Step a stará sa o nastavenie animácie na NeoPixel Ring. Od počiatočného bodu nastaví postupne stmavujúcu sa farbu. Na záver si posunie počiatočný bod v premennej position.

Používanie triedy Rotator je jednoduché. To vidíte na posledných riadkoch programu. Vytvorili sme objekt rt a pravidelne voláme jeho funkciu Step.

#include <Adafruit_NeoPixel.h>

// data pin
#define PIN 6
// led count
#define CNT 24
// max Hue
#define MAXHUE 65535

Adafruit_NeoPixel ring(CNT, PIN, NEO_GRB + NEO_KHZ800);

class Rotator
{
    Adafruit_NeoPixel *strip;
    int position;
    uint16_t hue;
    uint8_t saturation;

  public:
    Rotator(Adafruit_NeoPixel *npx, int pos = 0, uint16_t h = 0, uint8_t sat = 255);
    void Step();
};

Rotator::Rotator(Adafruit_NeoPixel *npx, int pos, uint16_t h, uint8_t sat)
  : strip(npx), position(pos), hue(h), saturation(sat)
{
}

void Rotator::Step()
{
  // hue - 0-65535
  // saturation - 0-255
  // value - 0-255
  for (int i = 0; i < CNT; i++)
    strip->setPixelColor(
      (i + position) % CNT,
      strip->ColorHSV(hue, saturation, strip->gamma8(i * (255 / CNT))));
  strip->show();
  position++;
  position %= CNT;
}

//Rotator rt(&ring, 0, 0, 255); // red
//Rotator rt(&ring, 0, 0, 200); // pink
Rotator rt(&ring, 0, 40000L, 200); // lightblue

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

void loop() {
  rt.Step();
  delay(50);
}

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


02.10.2021


Menu