Skip to main content

Animacije

Što prikazuje ovaj primjer​

Kako animirati cijelu matricu ponovnim iscrtavanjem sličica jednu za drugom. Skica u petlji izvodi dvije animacije: prolazak redova koji redom pali jedan red od vrha prema dnu, i dugu koja kroz kolo boja provodi svaki piksel, pri čemu je svaki piksel malo dalje od svog susjeda.

Spojite VCC na 5 V, GND na GND i DIN na pin 6 svojeg kontrolera, ili promijenite PIN u pin koji ste koristili.

Kôd primjera​

Ovo je Animations.ino iz fiksirane verzije biblioteke, točno onakav kakav se isporučuje.

Select Board
Animations.ino
/**
**************************************************
*
* @file Animations.ino
* @brief Demonstrates row sweep and colour-cycle animations on the
* Soldered 8x8 WS2812B LED grid.
*
* Connect the grid data line to PIN below.
*
* @authors Josip Šimun Kuči @ soldered.com
***************************************************/

#include "WS2812Grid-SOLDERED.h"

#define PIN 6

WS2812Grid grid(PIN);

// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------

// Simple HSV-to-RGB wheel: hue 0–255
static uint32_t colorWheel(uint8_t pos)
{
pos = 255 - pos;
if (pos < 85)
return WS2812Grid::Color(255 - pos * 3, 0, pos * 3);
if (pos < 170)
{
pos -= 85;
return WS2812Grid::Color(0, pos * 3, 255 - pos * 3);
}
pos -= 170;
return WS2812Grid::Color(pos * 3, 255 - pos * 3, 0);
}

// ---------------------------------------------------------------------------
// Animations
// ---------------------------------------------------------------------------

void rowSweep()
{
for (uint8_t y = 0; y < 8; y++)
{
grid.clear();
for (uint8_t x = 0; x < 8; x++)
{
grid.setPixel(x, y, 0, 180, 255);
}
grid.show();
delay(80);
}
}

void rainbowGrid(uint8_t cycles)
{
for (uint8_t c = 0; c < cycles; c++)
{
for (uint16_t hue = 0; hue < 256; hue++)
{
for (uint8_t y = 0; y < 8; y++)
{
for (uint8_t x = 0; x < 8; x++)
{
uint8_t offset = (x + y * 2) & 0xFF;
grid.setPixel(x, y, colorWheel((hue + offset) & 0xFF));
}
}
grid.show();
delay(10);
}
}
}

// ---------------------------------------------------------------------------
// Setup / loop
// ---------------------------------------------------------------------------

void setup()
{
grid.begin();
grid.setBrightness(40);
}

void loop()
{
rowSweep();
delay(200);
rainbowGrid(2);
delay(200);
}

Očekivani rezultat: skica ne ispisuje ništa u Serial Monitor. Na matrici, pri svjetlini 40 od 255, svaki red redom zasvijetli bojom (0, 180, 255) na 80 ms, od gornjeg do donjeg reda. Nakon stanke od 200 ms duga dvaput prolazi kroz 256 boja kola, 10 ms po koraku, a svaki piksel je pomaknut na kolu za svoj stupac plus dvostruki red. Još jedna stanka od 200 ms i petlja počinje ispočetka.

Korištene funkcije​

WS2812Grid(uint8_t pin, uint8_t width = 8, uint8_t height = 8)returns WS2812Grid

Stvara upravljački program matrice za width x height LED dioda na pinu spojenom na DIN. Jedna matrica je 8 x 8, što je zadano. Za više povezanih matrica navedite punu širinu i visinu cijelog panela.

ReturnsObjekt matrice.

Parametri

TipNazivOpis
uint8_tpinArduino pin spojen na DIN matrice.
uint8_twidthBroj stupaca, višekratnik broja 8. Zadano 8.
uint8_theightBroj redova, višekratnik broja 8. Zadano 8.
begin()returns void

Inicijalizira upravljački program LED dioda i postavlja podatkovni pin kao izlaz, zatim briše sve piksele i poziva show(), pa matrica počinje ugašena. Pozovite ga jednom u setup().

ReturnsNišta.

setBrightness(uint8_t b)returns void

Postavlja izlaznu svjetlinu svih LED dioda. Promjena se vidi pri sljedećem show(). Namijenjeno je da se postavi jednom u setup(): biblioteka skalira spremljene boje, pa ponovljena promjena gubi preciznost boja.

ReturnsNišta.

Parametri

TipNazivOpis
uint8_tbSvjetlina, od 0 (isključeno) do 255 (najsvjetlije).
clear()returns void

Isključuje svaki piksel u memoriji. LED diode se gase pri sljedećem show(). Prolazak redova koristi ga da obriše prethodni red prije iscrtavanja sljedećeg.

ReturnsNišta.

setPixel(uint8_t x, uint8_t y, uint8_t r, uint8_t g, uint8_t b)returns void

Postavlja jednu LED diodu prema njezinu položaju u matrici na zasebne vrijednosti crvene, zelene i plave. Položaj izvan matrice se ignorira. Nakon toga pozovite show() kako biste promjenu poslali na LED diode.

ReturnsNišta.

Parametri

TipNazivOpis
uint8_txStupac, 0 = lijevo.
uint8_tyRed, 0 = gore.
uint8_trCrvena, od 0 do 255.
uint8_tgZelena, od 0 do 255.
uint8_tbPlava, od 0 do 255.
setPixel(uint8_t x, uint8_t y, uint32_t color)returns void

Postavlja jednu LED diodu prema njezinu položaju u matrici na pakiranu boju. Duga predaje vrijednost koju colorWheel() izgradi pomoću WS2812Grid::Color(). Položaj izvan matrice se ignorira. Nakon toga pozovite show() kako biste promjenu poslali na LED diode.

ReturnsNišta.

Parametri

TipNazivOpis
uint8_txStupac, 0 = lijevo.
uint8_tyRed, 0 = gore.
uint32_tcolorPakirana boja, 0x00RRGGBB.
WS2812Grid::Color(uint8_t r, uint8_t g, uint8_t b)returns uint32_t

Statična pomoćna funkcija koja pakira crvenu, zelenu i plavu u jednu 32-bitnu vrijednost boje. Pomoćna funkcija colorWheel() iz skice koristi je za pretvaranje položaja na kolu u boju.

ReturnsPakirana boja, (r << 16) | (g << 8) | b.

Parametri

TipNazivOpis
uint8_trCrvena, od 0 do 255.
uint8_tgZelena, od 0 do 255.
uint8_tbPlava, od 0 do 255.
show()returns void

Šalje boje spremljene u memoriji na LED diode. Na većini pločica nakratko isključuje prekide kako bi održala vremenski slijed signala, pa millis() i micros() pri svakom izvođenju gube oko 30 µs po LED diodi.

ReturnsNišta.

Sve zajedno​

Svaka sličica iscrtava se na isti način: promijenite piksele u memoriji pomoću clear() i setPixel(), zatim jednom pozovite show() i pričekajte prije sljedeće sličice. delay() nakon svakog show() određuje brzinu, pa promijenite 80 i 10 da prolazak redova ili duga bude brži ili sporiji. colorWheel() i dvije funkcije animacija dio su skice, a ne biblioteke.