Перейти к содержимому

AC-диммер не выключается: остаточное свечение при 0%

Почему лампа продолжает тускло светиться при установке диммера на 0% и как устранить это программными командами, RC-снаббером или реле.

Кратко: Установка диммера на 0% не гарантирует выключение лампы. Ток удержания TRIAC поддерживает проводимость при малых нагрузках. Решение: вызывайте dimmer.setState(OFF) или setMode(OFF_MODE) вместо setPower(0) — либо добавьте реле для полной гальванической развязки. DimmerLink прекращает все импульсы управления при уровне 0, устраняя проблему программно.




Как выглядит проблема

Вы вызываете setPower(0) или устанавливаете brightness: 0 в автоматизации. Нагрузка должна быть выключена. Вместо этого:

  • лампа накаливания или галогенная лампа продолжает тускло светиться;
  • лампа может медленно мерцать (1–4 Гц) на «нулевом» уровне;
  • проблема усиливается с лампами малой мощности (25–40 Вт) и исчезает при 100 Вт и выше.

Это не ошибка кода. Это фундаментальное свойство цепей TRIAC при взаимодействии с малыми резистивными нагрузками.




Причины мерцания


Причина 1 — Ток удержания TRIAC

TRIAC (симистор) проводит ток в обоих полупериодах AC после срабатывания. Чтобы прекратить проводимость, он должен естественным образом достичь перехода через ноль — и ток через нагрузку в момент перехода должен упасть ниже тока удержания (I_H) прибора.

Типичный ток удержания для BTA16 или BT138 TRIAC: 25–80 мА.

Для лампы 25 Вт при 230 В:

text
I_load = 25 Вт / 230 В ≈ 109 мА  (пиковое значение при проводимости)

При очень малом угле фазовой отсечки (около 0%, т.е. вблизи перехода через ноль) импульс тока настолько короткий, что он падает ниже I_H до того, как TRIAC успевает зафиксироваться. Результат: в одних полупериодах TRIAC открывается, в других нет — возникает медленное нерегулярное мерцание или постоянное тусклое свечение.


Причина 2 — Ток утечки оптрона

Оптрон драйвера TRIAC (MOC3041, MOC3021 или аналогичный) пропускает небольшой ток утечки (типично 1–5 мА) даже при выключенном внутреннем светодиоде. Для лампы 100 Вт это незаметно. Для LED-лампы 10 Вт или лампы накаливания 25 Вт утечки одной может быть достаточно для поддержания свечения.


Причина 3 — Минимальный импульс библиотеки при 0%

Обе библиотеки RBDdimmer и rbdimmerESP32 устанавливают минимальный ненулевой угол поджига для предотвращения аппаратной нестабильности вблизи переходов через ноль. Вызов setPower(0) всё ещё может генерировать очень короткий импульс управления в каждом полупериоде. Нагрузка, таким образом, получает крошечный всплеск мощности — недостаточный для свечения лампы 100 Вт, но заметный на лампе 25 Вт.

Решение — переключить режим библиотеки в OFF, а не просто установить мощность в 0.




Диагностика проблемы

  1. Проверьте мощность — замените лампу 25–40 Вт на лампу накаливания 100 Вт. Если свечение исчезло, причина — ток удержания.
  2. Отключите MCU — отсоедините все управляющие сигналы (DIM, ZC, VCC, GND на стороне MCU). Если лампа всё ещё светится — причина в токе утечки; если погасла — библиотека отправляет остаточные импульсы.
  3. Проверьте вызов API — найдите в коде setPower(0). Убедитесь, что вы не пропустили вызов setState(OFF).



Решения


🟢 Для начинающих — используйте DimmerLink или реле

DimmerLink управляет импульсами поджига в собственной прошивке (Cortex-M0+). На уровне 0 он не генерирует импульсов управления — TRIAC не активируется вне зависимости от утечки. Запишите 0 в регистр 0x10 (DIM0_LEVEL), и лампа полностью выключится.

cpp
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10);   // регистр DIM0_LEVEL
Wire.write(0);      // 0% — импульсы управления отсутствуют
Wire.endTransmission();

Добавьте реле, если нагрузка должна быть полностью обесточена (гальваническая развязка). Подключите нормально разомкнутое реле (или SSR) последовательно с AC-IN диммера. Размыкайте реле, когда нагрузка должна быть выключена; замыкайте для работы диммера:

cpp
// Пример для Arduino
const int RELAY_PIN = 7;
void setLoad(bool on, uint8_t level) {
    if (!on) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);   // реле разомкнуто — полностью выключено
    } else {
        digitalWrite(RELAY_PIN, HIGH);  // реле замкнуто — цепь AC активна
        delay(5);                       // ожидание стабилизации контактов
        dimmer.setState(ON);
        dimmer.setPower(level);
    }
}


🔵 Для продвинутых пользователей — программные и аппаратные решения


Вариант A — Используйте правильный режим OFF (программный)

setPower(0) устанавливает угол поджига, близкий к нулю, но всё ещё может генерировать импульс. Правильный способ полностью выключить нагрузку — изменить режим работы:

rbdimmerESP32 / RBDdimmer:

cpp
#include <rbdimmerESP32.h>  // или RBDdimmer.h для AVR/ESP8266
rbdimmer::Dimmer dimmer(DIM_PIN, ZC_PIN);
void setup() {
    dimmer.begin(NORMAL_MODE, ON);
    dimmer.setPower(50);
}
void turnOff() {
    // Правильно: переключение режима в OFF — импульсы управления отсутствуют
    dimmer.setState(OFF);
    // Неправильно: dimmer.setPower(0) — может по-прежнему поджигать
}
void turnOn(uint8_t level) {
    dimmer.setState(ON);
    dimmer.setPower(level);
}

Если ваша версия библиотеки использует setMode():

cpp
dimmer.setMode(OFF_MODE);    // выключение
dimmer.setMode(NORMAL_MODE); // возобновление диммирования

Компонент ESPHome ac_dimmer:

Компонент ac_dimmer в ESPHome устанавливает output: false для полного прекращения импульсов управления:

yaml
output:
  - platform: ac_dimmer
    id: triac_output
    gate_pin: GPIO4
    zero_cross_pin: GPIO5
light:
  - platform: monochromatic
    output: triac_output
    name: "Lamp"
    # Когда HA отправляет команду выключения, компонент прекращает импульсы управления.

Когда Home Assistant отправляет команду выключения, ESPHome полностью прекращает импульсы управления — TRIAC не активируется и лампа гаснет.


Вариант B — RC-снаббер (аппаратный)

RC-снаббер, подключённый параллельно TRIAC, снижает скорость нарастания напряжения (dV/dt) на приборе после перехода через ноль. Это помогает TRIAC надёжно самокоммутироваться при малых углах проводимости.

text
Анод/катод TRIAC
┌──────────┐
│  TRIAC   │
└──────────┘
     │     ← параллельно: 100 Ом (0,5 Вт) + 100 нФ класса X2
     └── R ── C ── ┘

Стандартные номиналы снаббера: R = 100 Ом (0,5 Вт) и C = 100 нФ, класс X2 (рассчитан на сетевое напряжение).

Большинство модулей rbdimmer уже содержат встроенный снаббер. Проверьте схему вашего модуля перед добавлением внешнего.

RC-снаббер не устраняет проблему полностью — он делает выключение TRIAC более надёжным, но утечка оптрона сохраняется.


Вариант C — Последовательное реле для полного отключения

Если нагрузка должна быть полностью обесточена (требование безопасности или индуктивная нагрузка), добавьте реле последовательно:

Сценарий Тип реле Примечание
Обычные нагрузки Реле SPST NO Разомкнуто = нет пути AC
Индуктивные (двигатели) Реле SPST NO Рекомендуется дугогашение
Требуется изоляция от сети SSR (твердотельное реле) Без подвижных частей

Используйте диммер для регулировки мощности и реле для вкл/выкл:

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);
    }
}



Матрица совместимости нагрузок

Нагрузка Симптом при 0% Причина Решение
Лампа накаливания 100 Вт+ Нет свечения Достаточная нагрузка setState(OFF) достаточно
Лампа накаливания 25–40 Вт Тусклое свечение Ток удержания setState(OFF) или реле
Галогенная 50 Вт Свечение или медленное мерцание Ток удержания RC-снаббер + setState(OFF)
Галогенная 12 В (с трансформатором) Свечение Реактивный ток Реле для полного отключения
Нагревательный элемент Нет свечения Резистивная нагрузка setState(OFF) достаточно



Частые ошибки

Ошибка Результат Решение
Вызов setPower(0) вместо setState(OFF) Остаточный импульс в каждом полупериоде Используйте setState(OFF)
Предположение, что 0% = выключено для ламп малой мощности Свечение или мерцание Используйте режим OFF
Установка снаббера с заниженной мощностью (резистор < 0,5 Вт) Перегрев снаббера Используйте резистор 0,5 Вт или 1 Вт
Реле без дугозащиты на индуктивных нагрузках Сваривание контактов Добавьте снаббер на контакты реле



Краткий чек-лист

Прежде чем менять оборудование, проверьте по порядку:

  • ☐ В коде используется `setState(OFF)` / `setMode(OFF_MODE)`, а не только `setPower(0)`
  • ☐ Мощность лампы > 60 Вт (ниже этого ток удержания часто является причиной)
  • ☐ Версия библиотеки поддерживает отдельный режим OFF
  • ☐ Встроенный снаббер на модуле присутствует (проверьте PCB)
  • ☐ Если DimmerLink: регистр уровня 0x10 установлен в 0 через I2C



  • Связанные статьи



    Остались вопросы?

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

    Поделиться этой записью
    Войти оставить комментарий