NeoPixel Ring rotátor

Zápisník experimentátora

Hierarchy: WS2812

V tomto článku si vysvětlíme, jak můžeme naprogramovat c ++ třídu Rotator, která nám usnadní ovládání NeoPixel Ring. Tato třída má několik parametrů, kterými definujeme barvu a sytost na prstenci. Třída Rotator sama doplní postupné ztmavení barev do podoby ocasu a zajistí i animaci barev po obvodu prstence.

Príklad

Třída Rotator v sobě zahrnuje čtyři proměnné a má dvě funkce. Ty proměnné nám definují pointer na objekt Adafruit_NeoPixel, pozici počátečního bodu, barevný odstín a sytost. Proměnné se nastaví v konstruktoru. Obvykle se inicializace proměnných v konstruktoru třídy zapisuje za dvojtečkou, tak jak to vidíte v příkladu, ale můžete použít i operátor přiřazení. Takto je to kratší a obvykle i přehlednější. Konstruktor má v definici zapsány i implicitní parametry, což nám umožňuje při vytvoření objektu vynechat málo se měnící parametry. Obvykle se proto vstupní parametry do funkce píší tak, že je seřadíte od těch nejvýznamnějších k méně důležitým.

Druhá funkce se jmenuje Step a stará se o nastavení animace na NeoPixel Ring. Od počátečního bodu nastaví postupně ztmavující se barvu. Na závěr si posune počáteční bod v proměnné position.

Používání třídy Rotator je jednoduché. To vidíte na posledních řádcích programu. Vytvořili jsme objekt rt a pravidelně voláme jeho funkci 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 se nachází na serveru GitHub.


02.10.2021


Menu