Ir al contenido

How to Fix ESP32 AC Dimmer Flickering. Guide

ESP32 TRIAC dimmer flickers? Learn why it happens and 2 proven solutions: software (rbdimmerESP32.h) vs hardware (DimmerLink module).
10 de febrero de 2026 por
How to Fix ESP32 AC Dimmer Flickering. Guide
Administrator
| Sin comentarios aún

Si está construyendo un dimmer AC con un TRIAC, probablemente haya notado parpadeo, brillo inestable o saltos aleatorios en la intensidad de la luz.

La mayoría de los desarrolladores DIY creen que el problema se debe a:

  • hardware del dimmer de baja calidad
  • TRIAC u optoacoplador defectuoso
  • problemas de diseño del PCB

Pero en la mayoría de los proyectos reales, el hardware del dimmer no es el problema.

El verdadero problema es la precisión del timing en el firmware, especialmente en ESP8266 y ESP32.

Esta guía explica:

  • por qué los dimmers TRIAC parpadean
  • por qué el ESP32 agrava el problema
  • cómo solucionar el parpadeo mediante software
  • por qué el control por hardware dedicado es la solución más fiable


Cómo funciona un dimmer AC con TRIAC

Un dimmer TRIAC no reduce el voltaje de forma gradual.

Controla cuándo se activa el TRIAC durante cada semiciclo AC.

Proceso:

  1. La forma de onda AC cruza por cero (evento de cruce por cero)

2. El MCU espera un retardo preciso (ángulo de fase)

3. El MCU envía un pulso corto a la puerta del TRIAC

4. El TRIAC conduce hasta el siguiente cruce por cero

El brillo depende completamente de la precisión del timing a nivel de microsegundos.

For a deep technical explanation, read:  https://www.rbdimmer.com/blog/diy-insights-1/ac-dimmer-based-on-zero-cross-detector-and-triac-operating-principles-and-applications-5


Por qué el timing es crítico (en números)

La atenuación AC es control en tiempo real. Estos son los datos concretos:

  • Frecuencia AC: 50 Hz (60 Hz) → cruce por cero cada 10 ms
  • Precisión de disparo del TRIAC requerida: ±50 µs para un brillo estable
  • Bloqueo de interrupciones Wi-Fi en ESP32: 200–500 µs
  • Resultado: parpadeo visible incluso con carga de CPU moderada

💡 Esto significa que el Wi-Fi puede alterar el timing del TRIAC 10 veces por encima del margen de error aceptable.


Por qué ocurre el parpadeo en proyectos con ESP8266 / ESP32

Los chips ESP son potentes pero no funcionan en tiempo real por defecto.

Ejecutan:

  • Pilas Wi-Fi / BLE
  • Accesos a memoria Flash (a menudo bloqueantes)
  • Planificación RTOS (ESP32)
  • Tareas del sistema en segundo plano

Si el código de timing del dimmer compite con estas tareas:

  • las interrupciones de cruce por cero se retrasan
  • los pulsos de puerta del TRIAC se desplazan
  • el brillo se vuelve inestable

La situación empeora cuando:

  • MQTT / OTA / interfaz web está activo
  • el registro de eventos está habilitado
  • se utilizan múltiples canales de atenuación

Errores comunes de principiantes

Los ejemplos populares de Arduino / ESPHome / Tasmota suelen:

  • usar delay() después del cruce por cero
  • ejecutar lógica de timing en callbacks no deterministas
  • llamar funciones bloqueantes dentro del ISR
  • acceder a la memoria Flash en código crítico en tiempo

Funcionan en demostraciones, pero fallan en productos reales.


Solution 1 — Software-Based: rbdimmerESP32.h

Para chips ESP32 de doble núcleo, el parpadeo se puede resolver por software si se hace correctamente.

What rbdimmerESP32.h Does

rbdimmerESP32.h está diseñada para el control determinista del TRIAC:

  • temporizadores de hardware (sin retardos por software)
  • código ISR almacenado en IRAM (sin bloqueos de Flash)
  • separación de núcleos: tiempo real vs Wi-Fi
  • arquitectura compatible con FreeRTOS

Repo: 👉 https://github.com/robotdyn-dimmer/rbdimmerESP32


Detalles técnicos clave — IRAM (Instruction RAM)

El ESP32 normalmente ejecuta código desde la Flash.

El acceso a la Flash puede bloquear la CPU durante cientos de microsegundos.

Solución:

Coloque el código crítico en tiempo en IRAM usando:

IRAM_ATTR void zeroCrossISR() {
  // ultra-fast ISR code
}

Temporizadores de hardware

Nunca use delay() ni millis() para el timing del TRIAC.

Use los temporizadores de hardware del ESP32 para precisión de microsegundos.


Estrategia de doble núcleo

  • Núcleo 0: timing del dimmer (tiempo real)
  • Núcleo 1: Wi-Fi, MQTT, interfaz, registro de eventos

Este aislamiento previene el parpadeo.


Cuándo tiene sentido la solución por software

✅ Solo ESP32

✅ Usted entiende las interrupciones y RTOS

✅ Necesita control total del firmware

⚠️ Requiere una arquitectura cuidadosa


HAGA ESTO ✅

  • Use temporizadores de hardware del ESP32 para el control del TRIAC
  • Mantenga el código ISR por debajo de 10 µs
  • Ejecute la atenuación en el núcleo 0, Wi-Fi en el núcleo 1
  • Almacene el código crítico en tiempo en IRAM


NO HAGA ESTO ❌

  • Nunca llame a Serial.print() desde un ISR
  • No acceda a Flash en código crítico en tiempo
  • Evite delay() cerca de la lógica de cruce por cero
  • No mezcle tareas de atenuación y de red

Solution 2 — Hardware-Based: Cualquier ESP32 (Recommended)

La forma más fiable de eliminar el parpadeo es sacar el timing del TRIAC del MCU principal.

What Is Cualquier ESP32

DimmerLink es un módulo controlador de dimmer dedicado:

  • detecta el cruce por cero
  • genera los pulsos TRIAC internamente
  • garantiza un timing estable
  • se comunica por UART / I²C

Docs: 👉 https://github.com/robotdyn-dimmer/DimmerLink


Por qué DimmerLink elimina el parpadeo

  • El Wi-Fi no puede retrasar el disparo del TRIAC
  • Los errores de timing del MCU no afectan la atenuación
  • Los bloqueos de Flash son irrelevantes
  • La escalabilidad a múltiples canales es trivial

Su MCU simplemente envía comandos serie (UART) como:

Example: 02 53 00 32  → Set dimmer 0 to 50%
Response: 00          → OK
NIVELBrillo
0x00 (0)0% — apagado
0x32 (50)50%
0x64 (100)100% — brillo máximo

Comparación software vs hardware

CriteriorbdimmerESP32.hDimmerLink
Costo (BOM)$0$1.5
Consumo energéticoIgual que el MCU+10 mA
Espacio en PCB0 (software)~1×2 cm
Certificación (CE/UL)Solo DIYSolo DIY
Soporte ESP8266✔️
Soporte ESP32✔️✔️

Raspberry Pi/Orange Pi..

✔️

Múltiples dimmers⚠️ complejo✔️ fácil
Apto para principiantes✔️
Listo para producción⚠️✔️

Árbol de decisión: ¿qué solución es la adecuada para mí?


¿Está usando ESP8266?

  • Use DimmerLink

¿Está usando ESP32 y quiere control total?

  • Use rbdimmerESP32

¿Necesita múltiples dimmers y estabilidad absoluta?

  • Use DimmerLink

¿Está desarrollando un producto comercial?

  • Use DimmerLink

¿Está experimentando y aprendiendo programación en tiempo real?

  • Use rbdimmerESP32
 


Conclusión

La atenuación por TRIAC no se trata de voltaje — se trata de timing en microsegundos.

El Wi-Fi no es tiempo real.

Los retardos son peligrosos.

La Flash es impredecible.

If you want stable light and zero flicker, isolate timing or move it to dedicated hardware - Cualquier ESP32.




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