Zápisník experimentátora
Hierarchy: WS2812
V predchádzajúcom článku sme si naprogramovali triedu Rotator a teraz si pomocou nej vytvoríme zaujímavú animáciu. Použijeme 3x NeoPixel Ring a pomocou fázového posunu vytvoríme efekt, v ktorom sa budú proti sebe zdanlivo pohybovať tri svietiace body s farebným chvostom. Je to len ilúzia, všetky tri body sa pohybujú rovnakým smerom.
![]()
Ilúzia je vytvorená pomocou troch NeoPixel Ring. Na penovej tehličke sú prstence pripevnené pomocou špendlíkov. Na obrázku sú vidieť ako dve drobné kovové hlavičky, ktoré sa nachádzajú v miestach, kde je na zvyšku prstenca miniatúrny kondenzátor. Prstence sú čo najbližšie pri sebe. Každý prstenec obsahuje 24 LED. Ak na prvom prstenci začneme animáciu na LED 1 a na druhom začneme na LED 12, budú oba body voči sebe relatívne na opačnom konci prstenca. Oba sa síce pohybujú v smere hodinových ručičiek, ale prvý sa zdanlivo pohybuje smerom doprava a druhý sa pohybuje zdanlivo smerom doľava. Po prejdení dvanástej pozície sa smer zdanlivo obráti a zase sa pohybujú proti sebe.
![]()
Ak na animáciu použijeme tri prstence, bude výsledný efekt výraznejší. Tretí prstenec sa animuje úplne rovnako, ako prvý prstenec. Na umocnenie celkového dojmu má každý prstenec odlišnú farbu.
![]()
Aby sme mohli ilúziu vytvoriť, potrebujeme tri prstence (ring1, ring2 a ring3) a každý prstenec sa nachádza na samostatnom pine (6, 7, 8). Triedu Rotator sme si popísali v predchádzajúcom článku. Potrebujeme tri objekty (rt1, rt2 a rt3) triedy Rotator. Každý objekt má nastavený fázový posun (druhý parameter), odtieň (tretí parameter) a sýtosť (štvrtý parameter).
Celá animácia sa vytvára vo funkcii loop, v ktorej pravidelne voláme funkciu Step pre každý z troch objektov. Jednoduchý kód, ktorý vytvára pôsobivú animáciu.
#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 sa nachádza na serveri GitHub.
09.10.2021