Ir al contenido

El dimmer AC no se apaga: brillo residual al 0%

Por qué una lámpara sigue brillando tenuemente cuando el dimmer está al 0% y cómo eliminarlo con comandos de software, un circuito RC snubber o un relé.

Resumen: Establecer el dimmer al 0% no garantiza que la lámpara se apague. La corriente de mantenimiento del TRIAC mantiene la conducción en cargas bajas. Solución: llame a dimmer.setState(OFF) o setMode(OFF_MODE) en lugar de setPower(0) — o añada un relé para desconexión galvánica completa. DimmerLink detiene todos los pulsos de compuerta en el nivel 0, eliminando el problema por software.




Cómo se manifiesta el problema

Usted llama a setPower(0) o establece brightness: 0 en su automatización. La carga debería estar apagada. En su lugar:

  • una lámpara incandescente o halógena sigue brillando tenuemente;
  • la lámpara puede parpadear lentamente (1–4 Hz) en el nivel «cero»;
  • el comportamiento empeora con lámparas de baja potencia (25–40 W) y desaparece con 100 W+.

Esto no es un error de código. Es una propiedad fundamental de los circuitos TRIAC al interactuar con cargas resistivas pequeñas.




Causas fundamentales


Causa 1 — Corriente de mantenimiento del TRIAC

Un TRIAC (Triode for Alternating Current) conduce en ambos semiciclos AC una vez disparado. Para dejar de conducir debe alcanzar naturalmente el cruce por cero — y la corriente a través de la carga en el momento del cruce debe caer por debajo de la corriente de mantenimiento (I_H) del dispositivo.

Corriente de mantenimiento típica para un BTA16 o BT138 TRIAC: 25–80 mA.

Con una lámpara de 25 W a 230 V:

text
I_load = 25 W / 230 V ≈ 109 mA  (pico durante la conducción)

A un ángulo de corte de fase muy pequeño (cercano al 0%, es decir, cerca del cruce por cero), el pulso de corriente es tan breve que cae por debajo de I_H antes de que el TRIAC tenga tiempo de engancharse. Resultado: en algunos semiciclos el TRIAC se abre, en otros no — produciendo un parpadeo lento e irregular o un brillo tenue constante.


Causa 2 — Corriente de fuga del optoacoplador

El optoacoplador del controlador TRIAC (MOC3041, MOC3021 o equivalente) deja pasar una pequeña corriente de fuga (típicamente 1–5 mA) incluso cuando el LED interno está apagado. Para una lámpara de 100 W esto es invisible. Para una lámpara LED de 10 W o una incandescente de 25 W, la fuga por sí sola puede ser suficiente para mantener el brillo.


Causa 3 — Pulso mínimo de la biblioteca al 0%

Tanto RBDdimmer como rbdimmerESP32 imponen un ángulo de disparo mínimo distinto de cero para evitar inestabilidad del hardware cerca de los cruces por cero. Llamar a setPower(0) puede seguir generando un pulso de compuerta muy corto en cada semiciclo. La carga, por tanto, recibe una pequeña ráfaga de potencia — insuficiente para encender una bombilla de 100 W, pero visible en una lámpara de 25 W.

La solución es cambiar el modo de la biblioteca a OFF, no solo establecer la potencia en 0.




Diagnóstico del problema

  1. Verificar la potencia — reemplace la lámpara de 25–40 W por una incandescente de 100 W. Si el brillo desaparece, la corriente de mantenimiento es la causa.
  2. Desconectar el MCU — desenchufe todas las señales de control (DIM, ZC, VCC, GND del lado MCU). Si la lámpara sigue brillando, la corriente de fuga es la causa; si se apaga, la biblioteca está enviando pulsos residuales.
  3. Verificar la llamada API — busque setPower(0) en su código. Confirme que no le falta una llamada a setState(OFF).



Soluciones


🟢 Para principiantes — Use DimmerLink o un relé

DimmerLink gestiona el disparo de la compuerta en su propio firmware (Cortex-M0+). En el nivel 0 no genera pulsos de compuerta — el TRIAC no se dispara independientemente de la fuga. Escriba 0 en el registro 0x10 (DIM0_LEVEL) y la lámpara se apaga completamente.

cpp
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10);   // registro DIM0_LEVEL
Wire.write(0);      // 0% — sin pulsos de compuerta
Wire.endTransmission();

Añada un relé si la carga debe estar completamente desenergizada (aislamiento galvánico). Conecte un relé normalmente abierto (o SSR) en serie con el AC-IN del dimmer. Abra el relé cuando la carga deba estar apagada; ciérrelo para habilitar la atenuación:

cpp
// Ejemplo Arduino
const int RELAY_PIN = 7;
void setLoad(bool on, uint8_t level) {
    if (!on) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);   // relé abierto — completamente apagado
    } else {
        digitalWrite(RELAY_PIN, HIGH);  // relé cerrado — ruta AC activa
        delay(5);                       // esperar estabilización de contactos
        dimmer.setState(ON);
        dimmer.setPower(level);
    }
}


🔵 Para usuarios avanzados — Soluciones de software y hardware


Opción A — Usar el modo OFF correcto (software)

setPower(0) establece el ángulo de disparo cerca de cero pero puede seguir generando un pulso. La forma correcta de apagar completamente la carga es cambiar el modo de operación:

rbdimmerESP32 / RBDdimmer:

cpp
#include <rbdimmerESP32.h>  // o RBDdimmer.h para AVR/ESP8266
rbdimmer::Dimmer dimmer(DIM_PIN, ZC_PIN);
void setup() {
    dimmer.begin(NORMAL_MODE, ON);
    dimmer.setPower(50);
}
void turnOff() {
    // Correcto: cambiar modo a OFF — sin pulsos de compuerta
    dimmer.setState(OFF);
    // Incorrecto: dimmer.setPower(0) — puede seguir disparando
}
void turnOn(uint8_t level) {
    dimmer.setState(ON);
    dimmer.setPower(level);
}

Si su versión de la biblioteca usa setMode():

cpp
dimmer.setMode(OFF_MODE);    // apaga
dimmer.setMode(NORMAL_MODE); // reanuda la atenuación

Componente ESPHome ac_dimmer:

El componente ac_dimmer de ESPHome establece output: false para inhibir completamente los pulsos de compuerta:

yaml
output:
  - platform: ac_dimmer
    id: triac_output
    gate_pin: GPIO4
    zero_cross_pin: GPIO5
light:
  - platform: monochromatic
    output: triac_output
    name: "Lamp"
    # Cuando HA envía un comando de apagado, el componente detiene los pulsos de compuerta.

Cuando Home Assistant envía un comando de apagado, ESPHome detiene completamente los pulsos de compuerta — el TRIAC no se dispara y la lámpara se apaga.


Opción B — Circuito RC snubber (hardware)

Un circuito RC snubber conectado en paralelo con el TRIAC reduce la velocidad de subida del voltaje (dV/dt) a través del dispositivo después de un cruce por cero. Esto ayuda al TRIAC a autoconmutar de forma fiable en ángulos de conducción pequeños.

text
Ánodo/cátodo del TRIAC
┌──────────┐
│  TRIAC   │
└──────────┘
     │     ← en paralelo: 100 Ω (0,5 W) + 100 nF clase X2
     └── R ── C ── ┘

Valores estándar del snubber: R = 100 Ω (0,5 W) y C = 100 nF, clase X2 (dimensionado para voltaje de red).

La mayoría de los módulos rbdimmer ya incluyen un snubber integrado. Verifique el esquema de su módulo antes de añadir uno externo.

Un circuito RC snubber no elimina el problema completamente — hace que el apagado del TRIAC sea más fiable, pero la fuga del optoacoplador persiste.


Opción C — Relé en serie para desconexión completa

Si la carga debe estar completamente desenergizada (requisito de seguridad o carga inductiva), añada un relé en serie:

Escenario Tipo de relé Nota
Cargas normales Relé SPST NO Abierto = sin ruta AC
Inductivas (motores) Relé SPST NO Supresión de arco recomendada
Aislamiento de red requerido SSR (relé de estado sólido) Sin partes móviles

Use el dimmer para el control de potencia y el relé para encendido/apagado:

cpp
void loop() {
    if (targetLevel == 0) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);
    } else {
        digitalWrite(RELAY_PIN, HIGH);
        delay(5);
        dimmer.setState(ON);
        dimmer.setPower(targetLevel);
    }
}



Matriz de compatibilidad de cargas

Carga Síntoma al 0% Causa Solución
Incandescente 100 W+ Sin brillo Carga suficiente setState(OFF) suficiente
Incandescente 25–40 W Brillo tenue Corriente de mantenimiento setState(OFF) o relé
Halógena 50 W Brillo o parpadeo lento Corriente de mantenimiento RC snubber + setState(OFF)
Halógena 12 V (transformador) Brillo Corriente reactiva Relé para desconexión completa
Elemento calefactor Sin brillo Carga resistiva setState(OFF) suficiente



Errores frecuentes

Error Efecto Solución
Llamar a setPower(0) en lugar de setState(OFF) Pulso residual en cada semiciclo Usar setState(OFF)
Asumir que 0% = apagado para lámparas de baja potencia Brillo o parpadeo Usar modo OFF
Añadir un snubber subdimensionado (resistencia < 0,5 W) Sobrecalentamiento del snubber Usar resistencia de 0,5 W o 1 W
Usar relé sin protección de arco en cargas inductivas Soldadura de contactos Añadir snubber en los contactos del relé



Checklist rápido

Antes de reemplazar hardware, verifique en este orden:

  • ☐ El código usa `setState(OFF)` / `setMode(OFF_MODE)`, no solo `setPower(0)`
  • ☐ La potencia de la lámpara es > 60 W (por debajo, la corriente de mantenimiento suele ser la causa)
  • ☐ La versión de la biblioteca soporta un modo OFF separado
  • ☐ El snubber integrado en el módulo está presente (verificar PCB)
  • ☐ Si DimmerLink: el registro de nivel 0x10 está establecido en 0 vía I2C



  • Artículos relacionados



    ¿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