Кратко: Установка диммера на 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 В:
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.
Диагностика проблемы
- Проверьте мощность — замените лампу 25–40 Вт на лампу накаливания 100 Вт. Если свечение исчезло, причина — ток удержания.
- Отключите MCU — отсоедините все управляющие сигналы (DIM, ZC, VCC, GND на стороне MCU). Если лампа всё ещё светится — причина в токе утечки; если погасла — библиотека отправляет остаточные импульсы.
- Проверьте вызов 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-IN диммера. Размыкайте реле, когда нагрузка должна быть выключена; замыкайте для работы диммера:
// Пример для 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:
Компонент 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: "Lamp"
# Когда 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 Вт |
| Реле без дугозащиты на индуктивных нагрузках | Сваривание контактов | Добавьте снаббер на контакты реле |
Краткий чек-лист
Прежде чем менять оборудование, проверьте по порядку:
Связанные статьи
- Flickering at low brightness → AC Dimmer Flickering at Low Brightness
- Safety and wiring → AC Dimmer Safety: Mains Voltage, Isolation, and Wiring
- Choosing a dimmer → AC Dimmer Buyer's Guide
- LED-specific flicker → LED Flickering with AC Dimmer
Остались вопросы?
Ask on forum.rbdimmer.com or open a GitHub Issue.