Zápisník experimentátora
Hierarchy: WS2812
Nudnú teóriu o prevode medzi farebným priestorom HSV a RGB sme si ukázali v predchádzajúcom článku. V tomto článku využijeme opäť farebný priestor HSV. Budeme si pomocou neho vytvárať rotujúce animácie na NeoPixel Ring. Vytvoríme si tri rôzne animácie, ktoré budú vychádzať z jednoduchého algoritmu. Jednoduchý algoritmus neznamená, že bude výsledok škaredý. Práve naopak. Aj z jednoduchých algoritmov môžu vzniknúť zaujímavé efekty.
Ochranné súčiastky sú nutné preto, aby sa NeoPixel Ring nepoškodil. Podrobnosti ochrany sú uvedené v článku o napájaní týchto diód.
Na obrázku je Ring s 12 diódami. Ring s 24 diódami sa nijako mimoriadne od neho nelíši a je preto možné použiť aj menší ring po príslušnej úprave kódu.
Pretože je vo všetkých troch príkladoch použitý rovnaký algoritmus, vysvetlíme si ho iba raz. Do zdrojového kódu som doplnil premennú position
. Každých 50 ms k premennej pripočítam hodnotu 1. Vďaka tomu vytvorím pohyb, ktorý za jednu sekundu vytvorí 20 nových počiatočných pozícií. A pretože má NeoPixel Ring iba 24 pixelov, musím sa postarať o to, aby som výslednú pozíci nastavil vždy iba v intervale 0-23. To zabezpečuje operátor modulo vo výraze (i + position) % CNT
. Postupne tak rotujú počiatočné pozície na NeoPixel Ring. Pár hodnôt som zápisal do tabuľky, aby bolo vidno, ako sa operátor modulo prejavuje na výsledku.
idx | 0 | 1 | ... | 22 | 23 |
---|---|---|---|---|---|
position=0 | 0 | 1 | ... | 22 | 23 |
position=1 | 1 | 2 | ... | 23 | 0 |
position=2 | 2 | 3 | ... | 0 | 1 |
V tomto príklade rotuje po obvode NeoPixel Ring dúhový prstenec.
#include <Adafruit_NeoPixel.h>
#include "hsv.h"
// data pin
#define PIN 6
// led count
#define CNT 24
// max Hue
#define MAXHUE 256*6
int position = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
}
void loop() {
// hue - whole circle
// saturation - maximum
// value - very low
for (int i = 0; i < CNT; i++)
strip.setPixelColor((i + position) % CNT, getPixelColorHsv(i, i * (MAXHUE / CNT), 255, 10));
strip.show();
position++;
position %= CNT;
delay(50);
}
V tomto príklade rotuje po obvode NeoPixel Ring postupne slabnúci červený bod.
#include <Adafruit_NeoPixel.h>
#include "hsv.h"
// data pin
#define PIN 6
// led count
#define CNT 24
// max Hue
#define MAXHUE 256*6
int position = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
}
void loop() {
// hue - red
// saturation - max
// value - 0-255
for (int i = 0; i < CNT; i++)
strip.setPixelColor((i + position) % CNT, getPixelColorHsv(i, 0, 255, strip.gamma8(i * (255 / CNT))));
strip.show();
position++;
position %= CNT;
delay(50);
}
V tomto príklade rotuje po obvode NeoPixel Ring postupne slabnúci bod. Bod mení farbu a postupne prejde cez všetky farebné odtiene.
#include <Adafruit_NeoPixel.h>
#include "hsv.h"
// data pin
#define PIN 6
// led count
#define CNT 24
// max Hue
#define MAXHUE 256*6
int position = 0;
int hue = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
}
void loop() {
// hue - red
// saturation - max
// value - 0-255
for (int i = 0; i < CNT; i++)
strip.setPixelColor((i + position) % CNT, getPixelColorHsv(i, hue, 255, strip.gamma8(i * (255 / CNT))));
strip.show();
position++;
position %= CNT;
hue += 2;
hue %= MAXHUE;
delay(50);
}
Vo videu sú všetky tri algoritmy. Z ilustračných obrázkov si viete ťažšie predstaviť, čo sa na NeoPixel Ring deje. Vo videu to vidíte priamo v akcii.
Zdrojový kód sa nachádza na serveri GitHub.
21.04.2018