TL;DR: Установка диммера на 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 (Триод для переменного тока) проводит ток в обоих полупериодах после открытия. Чтобы прекратить проводимость, он должен естественным образом достигнуть перехода через нулевой ток — и ток через нагрузку в момент перехода должен упасть ниже тока удержания (I_H) прибора.
Типичный ток удержания для TRIAC BTA16 или BT138: 25–80 мА.
Для лампы 25 Вт при 230 В:
I_нагр = 25 Вт / 230 В ≈ 109 мА (пик во время проводимости)При очень малом угле фазовой отсечки (вблизи 0%, то есть вблизи перехода через ноль) импульс тока настолько короткий, что ток падает ниже I_H до того, как TRIAC успел зафиксироваться. Результат: в одних полупериодах TRIAC открывается, в других нет — возникает медленное нерегулярное мерцание или постоянное слабое свечение.
Причина 2 — Ток утечки оптрона
Оптрон-драйвер TRIAC (MOC3041, MOC3021 или аналог) пропускает небольшой ток утечки (обычно 1–5 мА) даже при отключённом светодиоде внутри. Для лампы 100 Вт это незаметно. Для светодиодной лампы 10 Вт или лампы накаливания 25 Вт одного тока утечки может быть достаточно для поддержания свечения.
Причина 3 — Минимальный импульс библиотеки при 0%
Библиотеки RBDdimmer и rbdimmerESP32 задают минимальный ненулевой
угол включения во избежание аппаратной нестабильности вблизи переходов.
Вызов setPower(0) может всё равно генерировать очень короткий импульс
затвора в каждом полупериоде. Нагрузка получает крошечный импульс
мощности — недостаточный для лампы 100 Вт, но заметный для лампы 25 Вт.
Решение: переключить режим библиотеки в OFF, а не просто установить мощность на 0.
Диагностика
- Проверьте мощность лампы — замените лампу 25–40 Вт лампой 100 Вт. Если свечение исчезнет, причина — ток удержания.
- Отключите МК — отключите все управляющие сигналы (DIM, ZC, VCC, GND на стороне МК). Если лампа продолжает светиться — причина ток утечки; если гаснет — библиотека отправляет остаточные импульсы.
- Проверьте вызов API — найдите в коде
setPower(0). Убедитесь, что не пропущен вызовsetState(OFF).
Решения
🟢 Для начинающих — Используйте DimmerLink или реле
DimmerLink управляет включением затвора в собственной прошивке
(Cortex-M0+). При уровне 0 он не генерирует импульсы затвора — TRIAC
не открывается независимо от тока утечки. Запишите 0 в регистр
0x10 (DIM0_LEVEL) и лампа полностью выключится.
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10); // регистр DIM0_LEVEL
Wire.write(0); // 0% — нет импульсов затвора
Wire.endTransmission();Добавьте реле, если нагрузка должна быть полностью обесточена (гальваническая изоляция). Подключите нормально разомкнутое реле (или SSR) последовательно с входом AC диммера. Разомкните реле, когда нагрузка должна быть выключена; замкните для включения диммирования:
// Пример 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:
#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():
dimmer.setMode(OFF_MODE); // выключить
dimmer.setMode(NORMAL_MODE); // возобновить диммированиеКомпонент ESPHome ac_dimmer:
ESPHome устанавливает output: false для полного запрета импульсов
затвора:
output:
- platform: ac_dimmer
id: triac_output
gate_pin: GPIO4
zero_cross_pin: GPIO5
light:
- platform: monochromatic
output: triac_output
name: "Лампа"
# Когда HA отправляет "выключить", компонент прекращает импульсы затвора.Когда Home Assistant отправляет команду выключения, ESPHome прекращает импульсы затвора полностью — TRIAC не открывается и лампа гаснет.
Вариант B — RC снаббер (аппаратно)
RC снаббер, подключённый параллельно TRIAC, уменьшает скорость нарастания напряжения (dV/dt) после перехода через ноль. Это помогает TRIAC надёжнее самовыключаться при малых углах проводимости.
Анод/катод 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 (твердотельное реле) | Нет движущихся частей |
Используйте диммер для управления мощностью и реле для вкл/выкл:
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 Вт |
| Реле без защиты от дуги на индуктивных нагрузках | Сваривание контактов | Добавьте снаббер параллельно контактам реле |
Краткий чеклист
Перед заменой оборудования проверьте по порядку:
Связанные статьи
- Мерцание при малой яркости → AC диммер мерцает при малой яркости
- Безопасность и подключение → Безопасность AC диммера: сетевое напряжение, изоляция и подключение
- Выбор диммера → Руководство покупателя AC диммера
- Мерцание LED → Мерцание LED с AC диммером
Остались вопросы?
Задайте на forum.rbdimmer.com или откройте GitHub Issue.