Коротко: Модули 2CH 8A и 4CH 10A используют один пин ZC для всех каналов. Каждый канал имеет собственный пин DIM. Одно прерывание в коде обслуживает все каналы; яркость задаётся независимо для каждого дескриптора канала. Используйте
rbdimmerESP32на двухъядерном ESP32,RBDdimmerна Arduino/ESP8266.
Что обеспечивают многоканальные модули
| Модуль | Каналы | Макс. на канал | Общее |
|---|---|---|---|
| 2CH 8A | 2 | 8A / ~1 300 Вт при 220V | Пин ZC, AC-N |
| 4CH 10A | 4 | 10A / ~1 700 Вт при 220V | Пин ZC, AC-N |
Каждый канал управляет одной AC-нагрузкой независимо. Детектор перехода через ноль общий — одно прерывание MCU обслуживает все каналы.
Схема подключения
2CH 8A — назначение пинов
Модуль → MCU (пример ESP32)
────────────────────────────────
ZC-OUT → GPIO 4 (прерывание, любой GPIO на ESP32)
DIM1 → GPIO 16 (канал 1)
DIM2 → GPIO 17 (канал 2)
VCC → 3.3V
GND → GNDСторона AC: оба канала разделяют нейтраль (AC-N). Каждый канал имеет собственные AC L-IN и AC L-OUT, подключённые последовательно с нагрузкой.
Full wiring diagrams: Hardware Connection Guide
4CH 10A — назначение пинов
Модуль → MCU (пример ESP32)
────────────────────────────────
ZC-OUT → GPIO 4
DIM1 → GPIO 16
DIM2 → GPIO 17
DIM3 → GPIO 18
DIM4 → GPIO 19
VCC → 3.3V
GND → GND⚠️ Один пин ZC для всех каналов. Подключите ZC-OUT к одному пину прерывания MCU. В коде регистрируйте переход через ноль один раз — он распространяется на все каналы модуля.
Код: ESP32 (rbdimmerESP32)
Используйте rbdimmerESP32 на двухъядерных ESP32 и ESP32-S3.
Библиотека автоматически обрабатывает IRAM_ATTR и привязку к ядрам —
ISR выполняется на Core 0, WiFi — на Core 1, что предотвращает сбои.
Пример на 2 канала
// rbdimmerESP32 — 2 независимых канала, общий переход через ноль
// Документация: rbdimmer.com/docs/universal-library-for-esp32
#include "rbdimmerESP32.h"
#define ZC_PIN 4
#define DIM1_PIN 16
#define DIM2_PIN 17
rbdimmer_channel_t ch1, ch2;
void setup() {
rbdimmer_init();
rbdimmer_register_zero_cross(ZC_PIN, RBDIMMER_PHASE_DEFAULT);
rbdimmer_config_t cfg1 = {
.gpio_pin = DIM1_PIN,
.phase = RBDIMMER_PHASE_DEFAULT,
.initial_level = 0,
.curve_type = RBDIMMER_CURVE_RMS
};
rbdimmer_config_t cfg2 = {
.gpio_pin = DIM2_PIN,
.phase = RBDIMMER_PHASE_DEFAULT,
.initial_level = 0,
.curve_type = RBDIMMER_CURVE_RMS
};
rbdimmer_create_channel(&cfg1, &ch1);
rbdimmer_create_channel(&cfg2, &ch2);
// Установка яркости каждого канала независимо
rbdimmer_set_level(ch1, 80); // Канал 1 → 80%
rbdimmer_set_level(ch2, 40); // Канал 2 → 40%
}
void loop() {
// Изменяйте уровни во время работы по необходимости
// rbdimmer_set_level(ch1, newLevel);
}Пример на 4 канала
#include "rbdimmerESP32.h"
#define ZC_PIN 4
const uint8_t DIM_PINS[4] = {16, 17, 18, 19};
rbdimmer_channel_t channels[4];
void setup() {
rbdimmer_init();
rbdimmer_register_zero_cross(ZC_PIN, RBDIMMER_PHASE_DEFAULT);
for (int i = 0; i < 4; i++) {
rbdimmer_config_t cfg = {
.gpio_pin = DIM_PINS[i],
.phase = RBDIMMER_PHASE_DEFAULT,
.initial_level = 0,
.curve_type = RBDIMMER_CURVE_RMS
};
rbdimmer_create_channel(&cfg, &channels[i]);
}
// Пример: ступенчатая яркость
rbdimmer_set_level(channels[0], 100);
rbdimmer_set_level(channels[1], 75);
rbdimmer_set_level(channels[2], 50);
rbdimmer_set_level(channels[3], 25);
}Кривые диммирования
| Кривая | Константа | Лучше для |
|---|---|---|
| Линейная | RBDIMMER_CURVE_LINEAR |
Нагревательные элементы |
| RMS | RBDIMMER_CURVE_RMS |
Лампы накаливания |
| Логарифмическая | RBDIMMER_CURVE_LOGARITHMIC |
Диммируемые LED-лампы |
Код: Arduino / ESP8266 (RBDdimmer)
Используйте RBDdimmer для плат Arduino на базе ATmega и ESP8266.
⚠️ Do not use
RBDdimmeron ESP32 with WiFi active — the ISR lacksIRAM_ATTRand causes crashes. UserbdimmerESP32instead. See: Wrong Library: RBDdimmer vs rbdimmerESP32
Arduino Uno/Nano — 2 канала
// RBDdimmer — 2 канала на Arduino Uno/Nano
// Пин ZC ОБЯЗАТЕЛЬНО должен быть пин 2 или 3 на Uno/Nano (INT0/INT1)
#include <RBDdimmer.h>
#define ZC_PIN 2 // Пин аппаратного прерывания
#define DIM1_PIN 5
#define DIM2_PIN 6
// Первый диммер регистрирует пин перехода через ноль
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);
// Последующие диммеры используют сигнал ZC от dimmer1
dimmerLamp dimmer2(DIM2_PIN);
void setup() {
dimmer1.begin(NORMAL_MODE, ON);
dimmer2.begin(NORMAL_MODE, ON);
dimmer1.setPower(80); // Канал 1 → 80%
dimmer2.setPower(40); // Канал 2 → 40%
}
void loop() {
// В NORMAL_MODE специальный вызов не требуется
}Arduino Mega — варианты пинов ZC
На Mega пин ZC может быть 2, 3, 18, 19, 20 или 21. Модуль 4CH работает аналогично — объявляйте каждый канал после первого:
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN); // ZC задаётся здесь
dimmerLamp dimmer2(DIM2_PIN);
dimmerLamp dimmer3(DIM3_PIN);
dimmerLamp dimmer4(DIM4_PIN);ESP8266 — многоканальный режим
ESP8266 использует RBDdimmer по той же схеме: первый dimmerLamp
задаёт пин ZC; последующие автоматически его разделяют.
// RBDdimmer — 2 канала на ESP8266 (NodeMCU)
#include <RBDdimmer.h>
#define ZC_PIN 5 // D1
#define DIM1_PIN 4 // D2
#define DIM2_PIN 14 // D5
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);
dimmerLamp dimmer2(DIM2_PIN); // разделяет ZC от dimmer1
void setup() {
dimmer1.begin(NORMAL_MODE, ON);
dimmer2.begin(NORMAL_MODE, ON);
dimmer1.setPower(80);
dimmer2.setPower(40);
}
void loop() {}Управление во время работы
Обе библиотеки позволяют изменять яркость во время работы:
// rbdimmerESP32
rbdimmer_set_level(ch1, 60);
// С плавным переходом (rbdimmerESP32)
// сигнатура: (канал, целевой_уровень_процент, длительность_мс)
rbdimmer_set_level_transition(ch1, 60, 2000); // → 60% за 2 000 мс
// RBDdimmer
dimmer1.setPower(60);Частые ошибки
| Ошибка | Решение |
|---|---|
| Отдельные пины ZC для каждого канала | Используйте один пин ZC, одну регистрацию |
Использование RBDdimmer на ESP32+WiFi |
Используйте rbdimmerESP32 |
| ZC на пине без прерывания (Uno) | Используйте пин 2 или 3 на Uno/Nano |
| Перегрузка канала | Проверьте номинал модуля: 8A или 10A на канал |
| DIM-пины подключены в неправильном порядке | Нагрузки меняются каналами; переназначьте GPIO |
Связанные статьи
- Which dimmer to buy → Complete Buyer's Guide
- Wrong library on ESP32 → RBDdimmer vs rbdimmerESP32
- ESP32 crashes with WiFi → IRAM_ATTR Causes and Fix
- TRIAC overheating → AC Dimmer Runs Hot or Burns Out
Остались вопросы?
Ask on forum.rbdimmer.com or open a GitHub Issue.