Zápisník experimentátora
Hierarchy: WS2812
Nudnou teorii o převodu mezi barevným prostorem HSV a RGB jsme si ukázali v předchozím článku. V tomto článku využijeme opět barevný prostor HSV. Budeme si pomocí něj vytvářet rotující animace na NeoPixel Ring. Vytvoříme si tři různé animace, které budou vycházet z jednoduchého algoritmu. Jednoduchý algoritmus neznamená, že bude výsledek ošklivý. Právě naopak. I z jednoduchých algoritmů mohou vzniknout zajímavé efekty.
Ochranné součástky jsou nutné proto, aby se NeoPixel Ring nepoškodil. Podrobnosti ochrany jsou uvedeny v článku o napájení těchto diod.
Na obrázku je Ring s 12 diodami. Ring s 24 diodami se nijak mimořádně od něj neliší a je proto možné použít i menší ring po příslušné úpravě kódu.
Protože je ve všech třech příkladech použitý stejný algoritmus, vysvětlíme si ho pouze jednou. Do zdrojového kódu jsem doplnil proměnnou position
. Každých 50 ms k proměnné připočtu hodnotu 1. Díky tomu vytvořím pohyb, který za jednu sekundu vytvoří 20 nových počátečních pozic. A protože má NeoPixel Ring pouze 24 pixelů, musím se postarat o to, abych výslednou pozici nastavil vždy jen v intervalu 0-23. To zajišťuje operátor modulo ve výrazu (i + position) % CNT
. Postupně tak rotují počáteční pozice na NeoPixel Ring. Pár hodnot jsem zapsal do tabulky, aby bylo vidět, jak se operátor modulo projevuje 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 příkladu rotuje po obvodu NeoPixel Ring duhový 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 příkladu rotuje po obvodu NeoPixel Ring postupně slábnoucí č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 příkladu rotuje po obvodu NeoPixel Ring postupně slábnoucí bod. Bod mění barvu a postupně projde přes všechny barevné odstíny.
#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);
}
Ve videu jsou všechny tři algoritmy. Z ilustračních obrázků si umíte těžší představit, co se na NeoPixel Ring děje. Ve videu to vidíte přímo v akci.
Zdrojový kód se nachází na serveru GitHub.
29.05.2019