Witam
Czy tez zauwazyliscie, ze zmiana koloru lub wlaczenie zajmuje tak duzo czasu? Mam pasek z 500 led i efekt wipe dziala tak wolno, ze nie da sie tego uzywac.
Wyglada jakby wysylanie bylo blokowane na ok 1ms miedzy ledami…z czego to wynika?
Petla prosta, for 0 do 500 zapal bez zadnych delay…
Kompilowane przez HA, wersja 2026.1.3
Standardowe paski WS2812B wykorzystują protokół jednoprzewodowy (Data), który jest wrażliwy na czas. W ESPHome domyślnie stosowana jest metoda “bit-banging”, która polega na programowym sterowaniu pinem.
Jeśli używasz ESP32:
Najlepsze rozwiązanie to jest zmiana metody zapisu na RMT (Remote Control Peripheral). Jest to dedykowany moduł sprzętowy w ESP32, który wysyła dane do LED-ów w tle, nie obciążając procesora i nie blokując pętli.
Zdradź więcej szczegółów swojej konfiguracji. Mam 81 ledów podłączonych do esp32 c3 supermini, wcześniej testowałem 180 ledów i zapala się szybciej niż mignę okiem. Ważne jest zasilanie, 500 ledów to trochę mocy trzeba.
@Allon
Jaki komponent w ESPHome obsługuje bezzegarowe piksele WS2812 z wykorzystaniem kontrolera SPI?
(generalnie ideę takiego sterownia znam, ale nie znam żadnego komponentu ESPHome, który to potrafi)
Tylko jakiś konkret proszę, najlepiej bez używania AI.
biblioteka ta stosuje technikę zwaną “bit-bangingiem przez SPI”. Polega ona na tym że kontroler SPI wysyła bajt danych, aby zasymulować jeden długi lub krótki impuls wymagany przez protokół.
Jest to emulacja:
specyficzny protokół czasowy, wysyłając odpowiednio sformatowane paczki bitów jako sygnał danych.
Czyli nie używa kontrolera SPI, bez użycia AI miało być.
W ESPHome, a nie jakiś ogólny opis jak działa, to co wiem, jak działa (teorię znam).
Dawaj konkret - który komponent dla ESP8266 używa kontrolera SPI?
Z bezzegarowymi pikselami (czyli przykładowo WS2812 z tytułu).
Bo oczywiście są też i piksele, które mają magistralę SPI, ale nie o tym tu mowa.
Może inaczej - pokaż YAML, który użyje neopixelbus w trybie SPI.
Bo niewiele z tego wynika, że biblioteka ma funkcje które nie są dostępne w komponencie dla użytkownika.
edit - chociaż szczerze mówiąc nie wiem czy ma, ale wszystkie możliwe do użycia metody to bit-bang, tylko, że niektóre używają kontrolerów sprzętowych poza specyfikacją - akurat dla ESP8266 widzę tam tylko I2S (jako “dma”) i UART
@szopen nie wiem z kąd to zabrałem, ale chyba zbyt mocno zasugerowałem się ogólnymi możliwościami biblioteki, zamiast sprawdzić, co faktycznie wystawia komponent w ESPHome(zresztą mogło by być lepiej udokumentowane). Pisząc z głowy o SPI zrobiłem skrót myślowy, który w kontekście ESP8266 i WS2812B w YAML-u po prostu nie przejdzie. Dzięki za czujność
Edytowałem wcześniejszą odpowiedź, aby nie wprowadzać w błąd.
Zasilacz mam 5V 10A, oczywiscie ze na wszystkie paski musze je zasilac w 3 miejsach i tylko do 60% jasnosci (co mi wystarcza).
Mam 2 efekty wipe ( ma to byc do oswietlenia schodow) jeden zapala od dolu srugi od gory.
Nie ma tam zadnych zmiennych czasowych.
Na kolanie zrobiona petla for z ustawieniem koloru zachowuje sie dokladnie tak samo.
Sprawdzilem wled na ttm samym pinie i wled dziala momentalnie, przeaiadka na esphome i dziala wolno.
Parametr update interval nic nie zmienia.
Esp32-c3 supermini, gpio2 (choc to malo istotne).
Dawniej bawilem sie atmegami, tam by utrzymac stale czasowe potrzebna byla wstawka asemblerowa, tutaj zegar jest 160MhZ vs 16… to cos z biblioteka, pewnie sam stos tcpip wymaga by nie blokowac go, watchdog zaraz zrobi reboot…dziwie sie ze nikt tego nie zauwazyl,ze jest taki efekt wolnego dzialania. Probowalem ustawien w modelu i parametrach ale to kompletnie nic nie wnosi.
prosty yaml:
esphome:
name: espmini-schody
friendly_name: espmini-schody
esp32:
board: nologo_esp32c3_super_mini
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
reboot_timeout:
seconds: 0
captive_portal:
web_server:
port: 80 # Optional, default is 80
css_url: "https://example.com/style.css" # Optional, for external CSS
js_url: "https://example.com/script.js" # Optional, for external JS
local: true
version: 3
sorting_groups:
- id: sorting_group_output
name: "Output"
sorting_weight: 1
- id: sorting_group_input
name: "Input"
sorting_weight: 2
- id: sorting_group_sensor
name: "Sensor"
sorting_weight: 3
ota:
- platform: web_server
- platform: esphome
password: ...
time:
- platform: sntp
id: sntp_time
timezone: Europe/Warsaw
servers:
- tempus1.gum.gov.pl
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
light:
- platform: status_led
name: "Status LED"
id: esp_status_led
icon: "mdi:alarm-light"
pin:
number: GPIO8
inverted: true
restore_mode: ALWAYS_OFF
# GPIO23 - Stair Light neopixel
- platform: neopixelbus
type: GRB
variant: ws2812x
pin: GPIO2
num_leds: 590
name: "Stair Light"
id: "stair_light"
effects:
#- !include esphome_led_effects/effects/wipe_in.yaml
#- !include esphome_led_effects/effects/wipe_out.yaml
- addressable_lambda:
name: "Falling light"
update_interval: 1ms
lambda: |-
static auto TAG = "Falling light";
static uint16_t progress = 0;
static ESPHSVColor mYellow = ESPHSVColor(100, 0, 255); //x,red,white
if (initial_run) {
progress = 0;
it.all() = Color::BLACK;
ESP_LOGD(TAG, "initial run");
ESP_LOGD(TAG, "it.size() = %d", it.size());
}
else {
//yellow led appear at start of strip and falling down
if (progress < it.size()) {
it[progress] = mYellow;
progress++;
ESP_LOGD(TAG, "increas progress : %d", progress);
}
//when all leds get yellow light, do nothing
else {
}
};
- addressable_lambda:
name: "zapal z gory "
update_interval: 0ms
lambda: |-
static int x = 0;
if (initial_run) {
x = 0;
it.all() = ESPHSVColor(0,0,0);
}
if (x < it.size()) {
it[x] = current_color;
x += 1;
}
- addressable_lambda:
name: "zapal z dolu "
update_interval: 0ms
lambda: |-
static int x = 0;
if (initial_run) {
x = it.size();
it.all() = ESPHSVColor(0,0,0);
}
if (x > 0) {
x -= 1;
it[x] = current_color;
}
- addressable_lambda:
name: "zgas z gory"
update_interval: 0ms
lambda: |-
static int x = 0;
if (initial_run) {
x = 0;
}
if (x < it.size()) {
it[x] = ESPHSVColor(0,0,0);
x += 1;
}
- addressable_lambda:
name: "zgas z dolu"
update_interval: 0ms
lambda: |-
static int x = 0;
if (initial_run) {
x = it.size();
}
if (x > 0) {
x -= 1;
it[x] = ESPHSVColor(0,0,0);
}
- addressable_color_wipe:
name: "wipe test"
reverse: True
colors:
- red: 0%
green: 40%
blue: 0%
num_leds: 2
# Use default parameters:
- random:
# Customize parameters
- random:
name: "My Slow Random Effect"
transition_length: 30s
update_interval: 30s
- random:
name: "My Fast Random Effect"
transition_length: 4s
update_interval: 5s
#bgr
- addressable_lambda:
name: "Rise light"
#update_interval: 1ms
lambda: |-
static auto TAG = "Rise light";
static uint16_t progress = 0;
static ESPHSVColor mYellow = ESPHSVColor(100, 0, 199);
if (initial_run) {
progress = 0;
it.all() = Color::BLACK;
ESP_LOGD(TAG, "initial run");
}
else {
//yellow led appear at the end of strip and rising up
if (progress < it.size()) {
progress++;
it[it.size() - progress] = mYellow;
ESP_LOGD(TAG, "increas progress : %d", progress);
}
//when all leds get yellow light, do nothing
else {
}
};
- addressable_lambda:
name: "Simple light"
update_interval: 1ms
lambda: |-
static auto TAG = "Simple light";
static uint16_t progress = 0;
static ESPHSVColor mhsv;
static ESPHSVColor mYellow = ESPHSVColor(100, 0, 199);
if (initial_run) {
progress = 0;
it.all() = mYellow.to_rgb();
mhsv = mYellow;
ESP_LOGD(TAG, "initial mhsv.hue is: %d", mhsv.hue);
}
else {
//strip change hue a litle, light blink effect when motion detected within occupied interval
if (progress < 5) {
mhsv.hue += 3;
it.all() = mhsv.to_rgb();
progress++;
//ESP_LOGD(TAG, "increas mhsv.hue : %d", mhsv.hue);
}
//set hue to initial value
else if (progress < 10) {
mhsv.hue -= 3;
it.all() = mhsv.to_rgb();
progress++;
//ESP_LOGD(TAG, "next progress : %d", progress);
}
else if (progress == 10) {
it.all() = mYellow.to_rgb();
progress++;
}
else {
}
};
Próbowałeś użyć z tą biblioteką jakiegoś kontrolera sprzętowego?
dla C3 jest wprawdzie dostępna tylko platforma kontrolera zdalnego sterowania, ale i tak powinno to być lesze niż nic
…
- platform: neopixelbus
method:
type: esp32_rmt
type: GRB
…
a tak z innej beczki WLED jest dedykowany do sterowania światłem i to w dodatku głównie adresowalnymi pikselami, więc wszyscy jego deweloperzy pracują tylko nad jednym celem - optymalizacją kodu do takiego właśnie zastosowania (może warto rozważyć)
natomiast komponent neopixelbus w ESPHome jest co najmniej wiekowy (i w ogóle jestem niemal zaskoczony, że to w ogóle działa na C3)
Możesz spróbować - platform: esp32_rmt_led_strip które jest tylko dla esp32 i podobno lepsze. Poniżej moja konfiguracja:
light:
# sterowanie ledami
- platform: esp32_rmt_led_strip
chipset: WS2812
max_refresh_rate: 15ms
rgb_order: GRB
default_transition_length: 0ms
pin: GPIO10
num_leds: 81
id: led_strip81
name: "Strip 81 Led"
icon: hass:led-strip-variant
effects:
- addressable_lambda:
Używam już tylko
esp32:
board: esp32-c3-devkitm-1
framework:
type: esp-idf
bo arduino to coś tam…
jest FastLED, Beken (dziala na spi tylko), ESP32 RMT…sprawdze ktory dziala szybciej…
Gorzej ze kazda biblioteka wymaga zmian w yaml w sterowaniu, przetestuje,
Jeśli masz C3 (konkretniej pełna nazwa ESP32-C3), to jak ma na nim działać komponent na zupełnie inne MCU (dla Beken, a nie dla Espressif)?
Alternatywa jednak jest i masz ją post wyżej (podejrzewam, że to optymalne rozwiązanie, bo jest dedykowane pod framework ESP-IDF, a nie pod arduino) mimo, że też wykorzystuje kontroler zdalnego sterowania (RMT) tak samo jak fastled_clockless, który jest tylko pod arduino i na tym MCU używa RMT i to samo jest z neopixelbus jeśli mu włączysz
method:
type: esp32_rmt
w swojej konfiguracji miałeś czysto programowy bit-bang bez wspomagania sprzętowego w żaden sposób (a C3 jest na stosunkowo słabym jednordzeniowym procku, więc jeśli programiści WLED wycisnęli z niego wszystkie soki, to tylko dla nich szacunek za stosowane triki, nie jestem na bieżąco, ale od dawna wykorzystywali kontrolery srzętowe wbudowane w MCU - już na ESP8266 używali do tego celu np. UART).
Jeśli zmienisz sobie MCU na jakiś, dla którego są komponenty ESPHome do sterownia pikseli wykorzystujące inne szybkie peryferia np. kontroler I2S czy SPI, to będziesz mógł z nich korzystać, ale na C3 są tylko takie wykorzystujące RMT lub czysto programowe.