Adresowalne diody LED WS2812B (znane też jako NeoPixel) umożliwiają niezależne sterowanie kolorem i jasnością każdej diody na pasku. Biblioteka FastLED sprawia, że tworzenie efektów świetlnych jest proste i wydajne nawet na mikrokontrolerach.
| Element | Specyfikacja | Cena |
|---|---|---|
| ESP32 DevKit v1 | 240 MHz, Wi-Fi + BT | ~20 zł |
| Pasek LED WS2812B | 60 diod/m, 5 V, IP30 lub IP65 | ~25–40 zł/m |
| Zasilacz 5 V / 5 A | Dla 1 m paska (max ~18 W) | ~25 zł |
| Rezystor 330–470 Ω | Na linii danych (ochrona) | ~0,50 zł |
| Kondensator 1000 µF / 10 V | Na zasilaniu paska | ~2 zł |
| WS2812B | ESP32 | Uwagi |
|---|---|---|
| VCC (5 V) | zewnętrzny zasilacz 5 V+ | Nie używaj pinu 3V3 ESP |
| GND | GND (wspólna masa z ESP) | Masy muszą być połączone! |
| DIN (data) | GPIO4 przez rezystor 330 Ω | Rezystor blisko paska |
Zainstaluj FastLED przez Library Manager. Minimalny szkic:
#include <FastLED.h>
#define LED_PIN 4
#define NUM_LEDS 60
#define BRIGHTNESS 80
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
// Efekt tęczy
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV((i * 256 / NUM_LEDS + millis()/10) % 256, 255, 255);
}
FastLED.show();
delay(20);
}
#define COOLING 55
#define SPARKING 120
void Fire2012() {
static byte heat[NUM_LEDS];
for (int i = 0; i < NUM_LEDS; i++)
heat[i] = qsub8(heat[i], random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
for (int k = NUM_LEDS - 1; k >= 2; k--)
heat[k] = (heat[k-1] + heat[k-2] + heat[k-2]) / 3;
if (random8() < SPARKING)
heat[random8(7)] = qadd8(heat[random8(7)], random8(160, 255));
for (int j = 0; j < NUM_LEDS; j++)
leds[j] = HeatColor(heat[j]);
FastLED.show();
delay(15);
}
void Meteor(byte r, byte g, byte b, byte rozmiar, byte ogon) {
for (int i = 0; i < NUM_LEDS + NUM_LEDS; i++) {
for (int j = 0; j < NUM_LEDS; j++) {
if (random8() > ogon) {
leds[j].fadeToBlackBy(64);
}
}
for (int j = 0; j < rozmiar; j++) {
if (i - j >= 0 && i - j < NUM_LEDS) {
leds[i - j] = CRGB(r, g, b);
}
}
FastLED.show();
delay(25);
}
}
#include <FastLED.h>
#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);
int efekt = 0;
void setup() {
FastLED.addLeds<WS2812B, 4, GRB>(leds, NUM_LEDS);
WiFi.begin("SSID", "HASLO");
while (WiFi.status() != WL_CONNECTED) delay(500);
server.on("/", []() {
server.send(200, "text/html",
"<a href='/rainbow'>Tecza</a> "
"<a href='/fire'>Ogien</a> "
"<a href='/off'>Wylacz</a>");
});
server.on("/rainbow", []() { efekt = 1; server.sendHeader("Location","/"); server.send(302); });
server.on("/fire", []() { efekt = 2; server.sendHeader("Location","/"); server.send(302); });
server.on("/off", []() { efekt = 0; FastLED.clear(true); server.sendHeader("Location","/"); server.send(302); });
server.begin();
}
void loop() {
server.handleClient();
if (efekt == 1) { /* rainbow */ }
if (efekt == 2) { Fire2012(); }
}