Коротко: Передний фронт — это стандартный TRIAC-диммер, который подключает нагрузку во второй половине каждого полупериода AC (лучше всего для ламп накаливания и нагревателей). Задний фронт — это MOSFET-диммер, который подключает нагрузку с начала полупериода (лучше для LED-ламп, меньше мерцания). Большинство бюджетных модулей используют передний фронт.
Проблема
Ваш TRIAC-диммер отлично работает с лампой накаливания или нагревателем — но стоит подключить LED-лампу, и начинаются проблемы: мерцание, нестабильность, непредсказуемое поведение на низкой яркости.
Это классическое несовпадение метода управления и типа нагрузки. TRIAC-диммеры реализуют передний фронт — метод, оптимизированный для резистивных нагрузок, который создаёт проблемы с электронными LED-драйверами. Задний фронт (MOSFET) решает эти проблемы.
Типичные симптомы несовпадения с форумов:
- «TRIAC-диммеры с передним фронтом плохо работают с диммируемыми LED-лампами» (Arduino Forum, 2024)
- «Я использую TRIAC-платы для ламп накаливания — диммируют отлично. Но с LED-лампами работают некорректно» (Arduino Forum, 2024)
- Мерцание LED ниже 30–50% яркости, которое не исправить кодом
- Лампа нормально работает на 100%, но нестабильна при диммировании
Причина проблемы
Оба метода используют фазовое управление (управление углом включения): TRIAC или транзистор открывается в определённой точке полупериода AC и пропускает часть синусоиды на нагрузку. Разница в том, какая часть полупериода попадает на нагрузку.
Передний фронт (прямая фазовая отсечка)
Синусоида: ╭─────╮ ╭─────╮
│ │ │ │
─────────────────╯ ╰────────╯ ╰────
Передний фронт (50% мощности):
──╭───╮ ──╭───╮
│ │ │ │
───────────────────╯ ╰──────────╯ ╰────
↑ TRIAC включается здесь- TRIAC включается в середине полупериода
- Нагрузка получает вторую половину каждого полупериода
- Характерный резкий скачок напряжения в момент включения TRIAC
- Отраслевой стандарт бытовых диммеров на протяжении 50 лет
Проблема с LED: Драйвер LED видит резкий скачок напряжения от нуля до ~200–300 В. Многие LED-драйверы воспринимают это как помеху, включают защитные цепи и начинают работать нестабильно.
Задний фронт (обратная фазовая отсечка)
Синусоида: ╭─────╮ ╭─────╮
│ │ │ │
─────────────────╯ ╰────────╯ ╰────
Задний фронт (50% мощности):
╭───╮ ╭───╮
│ │ │ │
─────────────────╯ ╰──────────╯ ╰──────
↑ транзистор выключается здесь- MOSFET (транзистор) открывается в начале полупериода, закрывается в середине
- Нагрузка получает первую половину каждого полупериода
- Напряжение плавно нарастает от нуля по синусоиде — без резких скачков
- Более сложная и дорогая схема, требует более сложного управления
Преимущество для LED: Драйвер LED видит напряжение, которое плавно нарастает от нуля — как в начале обычного полупериода, только укороченного. Большинство LED-драйверов корректно обрабатывают такую форму сигнала.
Математика управления
// Передний фронт: больше задержка = меньше мощность
delay_us = firing_angle; // большая задержка = меньше мощность
// Задний фронт: больше задержка = больше мощность
// (мы закрываем транзистор раньше)
delay_us = half_period - firing_angle; // большая задержка = больше мощность
// half_period:
// 50 Гц → 10 000 мкс
// 60 Гц → 8 333 мксРешения
🟢 Начинающим: выбор правильного модуля
Не хотите разбираться с углами фазы — выберите нужный модуль и используйте DimmerLink.
Большинство доступных TRIAC-модулей (включая RBDimmer) используют передний фронт. Это стандарт — хорошо работает с резистивными нагрузками: лампы накаливания, галогенные, нагреватели, паяльники, реостаты.
Если нужен задний фронт для LED — нужен MOSFET-диммер, а не TRIAC-модуль.
Практическое правило:
- Лампы накаливания / галогенные / нагреватели → любой TRIAC-диммер (передний фронт)
- Качественные LED с маркировкой «TRIAC dimmable» → TRIAC (передний фронт) работает
- LED с нестабильностью / мерцанием → задний фронт (MOSFET-модуль)
Управление через DimmerLink:
Любой ESP32 works with standard RBDimmer TRIAC modules (leading edge) over I2C or UART. When trailing edge is needed, DimmerLink also controls MOSFET modules.
Когда выбрать DimmerLink:
// DimmerLink через I2C — работает с любым подключённым модулем
// (TRIAC передний фронт или MOSFET задний фронт — изменения кода не нужны)
// Документация: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
void setLevel(uint8_t level) {
Wire.beginTransmission(DIMMER_ADDR);
Wire.write(REG_LEVEL);
Wire.write(level);
Wire.endTransmission();
}
void setup() {
Wire.begin();
setLevel(50); // 50% яркости
}
void loop() {}🔵 Продвинутым: реализация в коде
Хотите управлять углом фазы самостоятельно — вот как это работает.
Обе реализации используют прерывание по переходу через ноль. Единственная разница — формула задержки перед включением.
Вариант A: Передний фронт на ESP32 с rbdimmerESP32 ✅ Рекомендуется
Когда: двухъядерный ESP32 + резистивные нагрузки или качественные TRIAC-совместимые LED-лампы.
Библиотека rbdimmerESP32 реализует передний фронт по умолчанию.
// Платформа: двухъядерный ESP32
// Библиотека: rbdimmerESP32 — передний фронт, автоматически
// Исходный код: github.com/robotdyn-dimmer/rbdimmerESP32
#include "rbdimmerESP32.h"
#define ZC_PIN 18
#define DIM_PIN 19
rbdimmer dimmer;
void setup() {
dimmer.begin(ZC_PIN, DIM_PIN, 50); // Сеть 50 Гц
dimmer.setPower(50); // 50% мощности
}
void loop() {
// Плавное изменение
for (int p = 10; p <= 95; p++) {
dimmer.setPower(p);
delay(30);
}
for (int p = 95; p >= 10; p--) {
dimmer.setPower(p);
delay(30);
}
}Вариант B: Задний фронт — ручная реализация на Arduino AVR
Когда: передний фронт вызывает проблемы с LED и нужно переключиться на задний фронт без замены модуля (некоторые MOSFET-модули поддерживают это аппаратно).
// Платформа: Arduino Uno / Mega (только AVR)
// Реализация: задний фронт через ручное управление ISR перехода через ноль
// ВНИМАНИЕ: работает только с MOSFET-модулями — НЕ с TRIAC!
// Для ESP32 используйте rbdimmerESP32 (передний фронт)
#define ZC_PIN 2 // переход через ноль — только пины 2 или 3 на Uno
#define DIM_PIN 11 // пин управления затвором MOSFET
volatile int brightness = 50; // 0–100%
// Прерывание по переходу через ноль
void zeroCrossISR() {
// Задний фронт: открываем в начале, закрываем через (brightness/100) * half_period
// 50 Гц: half_period = 10 000 мкс
// 60 Гц: half_period = 8 333 мкс
int on_time = (brightness * 10000L) / 100; // 50 Гц
digitalWrite(DIM_PIN, HIGH); // открываем MOSFET сразу
delayMicroseconds(on_time); // удерживаем открытым
digitalWrite(DIM_PIN, LOW); // закрываем MOSFET
}
void setup() {
pinMode(DIM_PIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ZC_PIN),
zeroCrossISR, RISING);
}
void loop() {
brightness = 50; // 50%
}Примечание: delayMicroseconds() внутри ISR блокирует другие
прерывания. Для рабочего проекта замените задержку аппаратным таймером.
Этот пример демонстрирует только принцип.
⚠️ Типичные ошибки с форумов
Реальные ошибки из 3 форумных тредов (2019–2025).
-
«Переключил на задний фронт в коде — мерцание осталось»: Если у вас TRIAC-модуль (не MOSFET), программный задний фронт ничего не даст. TRIAC физически не может работать по заднему фронту — нужен MOSFET-модуль.
-
«Переключил на задний фронт — лампа стала тусклее при том же значении»: Это ожидаемо. Задний фронт работает с инвертированной логикой по сравнению с передним фронтом. При 50% заднего фронта вы получаете другую долю полупериода, чем при 50% переднего. Перекалибруйте диапазон.
-
«Нашёл библиотеку, которая делает задний фронт на том же модуле»: Если у вас стандартный TRIAC-модуль (BTA16, BT139, BTA08) — никакая библиотека не переключит его на задний фронт. Физика не позволяет.
-
«На форуме пишут: замена кода с переднего фронта RBDimmer на ручной задний фронт с переходом через ноль РЕШИЛА проблему мерцания LED без замены железа» — это работает только если у них был MOSFET-модуль, а не TRIAC.
Краткий чек-лист
Перед публикацией на форуме проверьте:
это решает 80% случаев без замены модуля
Таблица совместимости
| Метод | Модуль | Нагрузка | Работает? | Примечания |
|---|---|---|---|---|
| Передний фронт | TRIAC RBDimmer | Лампа накаливания | ✅ | Отлично |
| Передний фронт | TRIAC RBDimmer | Галоген 230В | ✅ | Отлично |
| Передний фронт | TRIAC RBDimmer | Нагреватель | ✅ | Отлично |
| Передний фронт | TRIAC RBDimmer | Philips/Osram LED | ✅ | Качественная лампа |
| Передний фронт | TRIAC RBDimmer | Дешёвый noname LED | ⚠️ | Мерцание < 40% |
| Задний фронт | MOSFET | Любой диммируемый LED | ✅ | Лучший результат |
| Задний фронт | TRIAC | Любая | ❌ | Невозможно аппаратно |
Похожие темы
- LED Lamps with AC Dimmer: TRIAC vs MOSFET — Compatibility Guide
- LED Flickering with AC Dimmer: TRIAC or MOSFET — Causes and Fixes
Остались вопросы?
Post on rbdimmer.com forum or open a GitHub Issue.