NeoPixel Ring - Fázový posun

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

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.

Príklad

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

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


09.10.2021


Menu