Resumen: Para ESP32 necesitas
rbdimmerESP32— no la antiguaRBDdimmer. La biblioteca antigua fue escrita para Arduino AVR: sinIRAM_ATTR, sin fijación de núcleo, sin protección contra condiciones de carrera. En ESP32 causa Guru Meditation Error, reinicios aleatorios o comportamiento errático desetPower(). Y a la inversa — para Arduino Uno/Mega usaRBDdimmer—rbdimmerESP32no compilará allí.
Descripción del problema
Tomas un tutorial que usa #include <RBDdimmer.h>, lo subes a un
ESP32 — y obtienes uno de los siguientes:
- Guru Meditation Error cuando WiFi está activo (fallo en el manejador de interrupción)
- Reinicios aleatorios sin causa aparente
setPower()no da el brillo esperado — comportamiento caótico de la carga- Advertencias del compilador sobre
IRAM_ATTRy APIs obsoletas
O lo contrario — rbdimmerESP32 en Arduino Uno:
error: 'xTaskCreatePinnedToCore' was not declared in this scope
Mensajes típicos en foros:
Guru Meditation Error: Core 1 panic'ed (Cache disabled but cachedmemory region accessed)error: 'xTaskCreatePinnedToCore' was not declared in this scopewarning: 'IRAM_ATTR' attribute ignored- «
setPower(50)— la lámpara se apaga y luego salta a brillo máximo»
Causa raíz
El ecosistema rbdimmer tiene dos bibliotecas separadas para diferentes plataformas:
| Biblioteca | Plataforma | Clase |
|---|---|---|
RBDdimmer |
Arduino AVR (Uno, Nano, Mega) | dimmerLamp |
rbdimmerESP32 |
ESP32 doble núcleo (orig, S3) | rbdimmer |
No son intercambiables. Diferencias técnicas clave:
RBDdimmerno usaIRAM_ATTR→ la ISR se ejecuta desde flash → con WiFi activo la caché flash se desactiva → fallo. Detalles:troubleshooting/esp32-iram-attr.mdRBDdimmerno fija la tarea a un núcleo específico → en ESP32 doble núcleo compite con la tarea WiFi → inestabilidad de timing → brillo inestablerbdimmerESP32usaxTaskCreatePinnedToCorede FreeRTOS → no compila en Arduino AVR (no hay FreeRTOS)
Soluciones
🟢 Para principiantes: DimmerLink — una biblioteca para todas las plataformas
¿No quieres preocuparte por qué biblioteca usar? DimmerLink se controla por I2C — el mismo código funciona en Arduino, ESP32, ESP8266 y RPi.
DimmerLink tiene su propio controlador de cruce por cero y temporización de TRIAC. Tu microcontrolador solo establece el nivel de brillo por I2C. Sin ISR, sin IRAM_ATTR, sin selección de biblioteca por plataforma.
Código:
// DimmerLink — funciona en Arduino, ESP32, ESP8266, Raspberry Pi
// Documentación: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
void setLevel(uint8_t level) { // level: 0–100%
Wire.beginTransmission(DIMMER_ADDR);
Wire.write(REG_LEVEL);
Wire.write(level);
Wire.endTransmission();
}
void setup() {
Wire.begin(); // SDA/SCL por defecto para tu placa
setLevel(50); // brillo 50%
}
void loop() {}Resultado: Sin dolores de cabeza por selección de biblioteca — código idéntico en cualquier plataforma.
🔵 Para usuarios avanzados: la biblioteca correcta para tu plataforma
¿Quieres conexión ISR directa? Usa la biblioteca correcta.
Instalar rbdimmerESP32 (para ESP32)
En Arduino IDE:
- Programa → Incluir Biblioteca → Administrar Bibliotecas
- Buscar:
rbdimmerESP32 - Instalar: por RobotDyn
En PlatformIO (platformio.ini):
lib_deps =
https://github.com/robotdyn-dimmer/rbdimmerESP32Migración de código de RBDdimmer a rbdimmerESP32
// ─────────────── ANTES (RBDdimmer — no es para ESP32) ────────────────
#include <RBDdimmer.h>
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
// NORMAL_MODE, ON — constantes de RBDdimmer, no existen en rbdimmerESP32
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(50);
}
// ──────────────── DESPUÉS (rbdimmerESP32 — correcto para ESP32) ──────
#include "rbdimmerESP32.h"
rbdimmer dimmer;
void setup() {
// Orden de pines: ZC_PIN, DIM_PIN (invertido respecto a RBDdimmer!)
dimmer.begin(ZC_PIN, DIM_PIN, 50); // tercer parámetro — frecuencia de red
dimmer.setPower(50);
}⚠️ El orden de pines en
begin()cambió: enRBDdimmerel constructor tomaba(DIM, ZC), enrbdimmerESP32el métodobegin()toma(ZC, DIM, freq). Si los inviertes, la carga no se regulará.
Test rápido después de la migración (barrido 10→90→10%):
// Test visual: barrido suave 10% → 90% → 10%
// Si la carga responde — biblioteca y pines son correctos
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // cualquier GPIO en ESP32
#define DIM_PIN 19 // cualquier GPIO en ESP32
rbdimmer dimmer;
void setup() {
Serial.begin(115200);
dimmer.begin(ZC_PIN, DIM_PIN, 50); // red de 50 Hz
delay(500);
}
void loop() {
for (int p = 10; p <= 90; p += 10) {
dimmer.setPower(p);
Serial.println(p);
delay(500);
}
for (int p = 90; p >= 10; p -= 10) {
dimmer.setPower(p);
Serial.println(p);
delay(500);
}
}⚠️ Errores comunes
-
«Encontré un tutorial con
RBDdimmeren ESP32 — dice que funciona»: Los tutoriales de 2019–2022 a menudo usan la biblioteca antigua en ESP32. Desde que se lanzórbdimmerESP32, esos ejemplos quedaron obsoletos. Busca ejemplos conrbdimmerESP32. -
«ESP8266 + RBDdimmer + WiFi — inestable»: ESP8266 es de núcleo único; el SDK WiFi toma periódicamente el control de la CPU. Los síntomas son similares al ESP32 de núcleo único: inestabilidad de timing con WiFi activo. Para proyectos fiables en ESP8266 con WiFi — usa DimmerLink por I2C.
-
«Probé
rbdimmerESP32en Uno — no compila»:rbdimmerESP32requiere FreeRTOS (xTaskCreatePinnedToCore), que no existe en AVR. Para Uno/Nano/Mega usaRBDdimmer. -
«Instalé ambas bibliotecas — conflicto de cabeceras»: Arduino IDE puede mezclar archivos. Elimina la que no necesites mediante Programa → Incluir Biblioteca → Administrar Bibliotecas.
-
«El orden de pines parece el mismo — ¿por qué no funciona?»:
dimmerLamp dimmer(DIM, ZC)vsdimmer.begin(ZC, DIM, freq)— ZC y DIM están intercambiados. Verifica esto primero. -
«
setPower()compila y hace algo — pero inestable»:RBDdimmerpuede ejecutarse en ESP32 sin un fallo explícito — pero sinIRAM_ATTRy fijación de núcleo, el timing no es fiable. Eso no es «funcionar» — es «coincidir ocasionalmente». Cambia arbdimmerESP32.
Verificación rápida
Tabla de compatibilidad de bibliotecas
| Plataforma | Biblioteca | Clase | Nota |
|---|---|---|---|
| Arduino Uno/Nano/Mini | RBDdimmer |
dimmerLamp |
AVR, sin FreeRTOS |
| Arduino Mega | RBDdimmer |
dimmerLamp |
AVR |
| ESP32 (orig) / S3 | rbdimmerESP32 |
rbdimmer |
Doble núcleo |
| ESP32-S2/C3/H2/C6 | DimmerLink (I2C) | — | Núcleo único |
| ESP8266 | RBDdimmer |
dimmerLamp |
Sin doble núcleo; inestable con WiFi |
| — (sin ISR) | DimmerLink (I2C) | — | Sin tiempo real |
Problemas relacionados
- Cruce por cero no detectado →
troubleshooting/zero-cross-detection-errors.md - ESP32-S2/C3 núcleo único →
troubleshooting/esp32-single-core-dimmer.md - Zero-cross not detected →
troubleshooting/zero-cross-detection-errors.md
¿Todavía tienes preguntas?
Ask on forum.rbdimmer.com or open a GitHub Issue.