Zápisník experimentátora
Hierarchy: WS2812
V předchozím článku jsme si naprogramovali třídu Rotator a nyní si pomocí ní vytvoříme zajímavou animaci. Použijeme 3x NeoPixel Ring a pomocí fázového posunu vytvoříme efekt, ve kterém se budou proti sobě zdánlivě pohybovat tři svítící body s barevným ocasem. Je to jen iluze, všechny tři body se pohybují stejným směrem.
![]()
Iluze je vytvořena pomocí tří NeoPixel Ring. Na pěnové cihličce jsou prstence připevněny pomocí špendlíků. Na obrázku jsou vidět jako dvě drobné kovové hlavičky, které se nacházejí v místech, kde je na zbytku prstence miniaturní kondenzátor. Prstence jsou co nejblíže u sebe. Každý prstenec obsahuje 24 LED. Pokud na prvním prstenci začneme animaci na LED 1 a na druhém začneme na LED 12, budou oba body vůči sobě relativně na opačném konci prstence. Oba se sice pohybují ve směru hodinových ručiček, ale první se zdánlivě pohybuje směrem doprava a druhý se pohybuje zdánlivě směrem doleva. Po přejetí dvanácté pozice se směr zdánlivě obrátí a zase se pohybují proti sobě.
![]()
Pokud na animaci použijeme tři prstence, bude výsledný efekt výraznější. Třetí prstenec se animuje úplně stejně, jako první prstenec. Na umocnění celkového dojmu má každý prstenec odlišnou barvu.
![]()
Abychom mohli iluzi vytvořit, potřebujeme tři prstence (ring1, ring2 a ring3) a každý prstenec se nachází na samostatném pinu (6, 7, 8). Třídu Rotator jsme si popsali v předchozím článku. Potřebujeme tři objekty (rt1, rt2 a rt3) třídy Rotator. Každý objekt má nastaven fázový posun (druhý parametr), odstín (třetí parametr) a sytost (čtvrtý parametr).
Celá animace se vytváří ve funkci loop, ve které pravidelně voláme funkci Step pro každý ze tří objektů. Jednoduchý kód, který vytváří působivou animaci.
#include <Adafruit_NeoPixel.h>
// led count
#define CNT 24
// max Hue
#define MAXHUE 65535
Adafruit_NeoPixel ring1(CNT, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ring2(CNT, 7, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ring3(CNT, 8, 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 rt1(&ring1, 0, 0, 255); // red
Rotator rt2(&ring2, 12, 0, 200); // pink
Rotator rt3(&ring3, 0, 40000L, 200); // lightblue
void setup() {
ring1.begin();
ring2.begin();
ring3.begin();
}
void loop() {
rt1.Step();
rt2.Step();
rt3.Step();
delay(50);
}
Zdrojový kód se nachází na serveru GitHub.
09.10.2021