Ir al contenido

Biblioteca incorrecta: RBDdimmer en lugar de rbdimmerESP32 en ESP32

¿Usas RBDdimmer en ESP32? Esa es la biblioteca AVR — ESP32 necesita rbdimmerESP32. El orden de pines en begin() también está invertido: (DIM, ZC) → (ZC, DIM, freq). Guía de migración, tabla de plataformas y DimmerLink como alternativa universal.

Resumen: Para ESP32 necesitas rbdimmerESP32 — no la antigua RBDdimmer. La biblioteca antigua fue escrita para Arduino AVR: sin IRAM_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 de setPower(). Y a la inversa — para Arduino Uno/Mega usa RBDdimmerrbdimmerESP32 no 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_ATTR y 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 cached memory region accessed)
  • error: 'xTaskCreatePinnedToCore' was not declared in this scope
  • warning: '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:

  • RBDdimmer no usa IRAM_ATTR → la ISR se ejecuta desde flash → con WiFi activo la caché flash se desactiva → fallo. Detalles: troubleshooting/esp32-iram-attr.md
  • RBDdimmer no fija la tarea a un núcleo específico → en ESP32 doble núcleo compite con la tarea WiFi → inestabilidad de timing → brillo inestable
  • rbdimmerESP32 usa xTaskCreatePinnedToCore de 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:

cpp
// 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):

ini
lib_deps =
    https://github.com/robotdyn-dimmer/rbdimmerESP32


Migración de código de RBDdimmer a rbdimmerESP32

cpp
// ─────────────── 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ó: en RBDdimmer el constructor tomaba (DIM, ZC), en rbdimmerESP32 el método begin() 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%):

cpp
// 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 RBDdimmer en 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 con rbdimmerESP32.

  • «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é rbdimmerESP32 en Uno — no compila»: rbdimmerESP32 requiere FreeRTOS (xTaskCreatePinnedToCore), que no existe en AVR. Para Uno/Nano/Mega usa RBDdimmer.

  • «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) vs dimmer.begin(ZC, DIM, freq) — ZC y DIM están intercambiados. Verifica esto primero.

  • «setPower() compila y hace algo — pero inestable»: RBDdimmer puede ejecutarse en ESP32 sin un fallo explícito — pero sin IRAM_ATTR y fijación de núcleo, el timing no es fiable. Eso no es «funcionar» — es «coincidir ocasionalmente». Cambia a rbdimmerESP32.




Verificación rápida

  • ☐ ESP32 (orig, S3): `#include "rbdimmerESP32.h"` y clase `rbdimmer`
  • ☐ Arduino Uno/Nano/Mega: `#include ` and class `dimmerLamp`
  • ☐ ESP8266: `#include ` (no dual-core, no FreeRTOS)
  • ☐ ESP32 S2/C3/H2/C6 (núcleo único): DimmerLink por I2C
  • ☐ Orden de pines en `begin()`: `(ZC_PIN, DIM_PIN, freq)` para ESP32
  • ☐ ¿Ambas bibliotecas instaladas al mismo tiempo? → elimina la que no necesites


  • 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 detectadotroubleshooting/zero-cross-detection-errors.md
    • ESP32-S2/C3 núcleo únicotroubleshooting/esp32-single-core-dimmer.md
    • Zero-cross not detectedtroubleshooting/zero-cross-detection-errors.md



    ¿Todavía tienes preguntas?

    Ask on forum.rbdimmer.com or open a GitHub Issue.

    Compartir esta publicación
    Iniciar sesión para dejar un comentario