NeoPixel Ring HSV rotujúce kruhy

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.

Použité súčiastky

  • Arduino Uno - Môžete použiť ľubovoľnú verziu Arduina.
  • NeoPixel Ring 24 LED (link) - Obsahuje 24 RGB LED diód s čipom WS2812B.
  • Rezistor 1k (link) - Rezistor sa pripojí na dátový vstup NeoPixel Ringu. Slúži ako ochrana pinu.
  • Kondenzátor 220 uF (link) - Kondenzátor sa pripojí medzi VCC a GND na NeoPixel Ringu. Slúži na vyrovnávanie napäťových špičiek.

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.

Efekt rotácie

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

Rotujúci dúhový prstenec

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);
}

Rotujúci červený prstenec

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);
}

Rotujúci prstenec, ktorý mení farbu podľa HSV

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);
}

Video

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

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


21.04.2018


Menu