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.
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 se nachází na serveru GitHub.
02.10.2021