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

Многоканальное управление AC-диммером: руководство 2CH и 4CH

Нужно управлять двумя или четырьмя AC-нагрузками независимо с одной платы? Многоканальные модули диммеров используют один общий вход перехода через ноль, но предоставляют каждой нагрузке собственный пин DIM — вот схема подключения и код.

Коротко: Модули 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 — назначение пинов

text
Модуль   →   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 — назначение пинов

text
Модуль   →   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 канала

cpp
// 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 канала

cpp
#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 RBDdimmer on ESP32 with WiFi active — the ISR lacks IRAM_ATTR and causes crashes. Use rbdimmerESP32 instead. See: Wrong Library: RBDdimmer vs rbdimmerESP32


Arduino Uno/Nano — 2 канала

cpp
// 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 работает аналогично — объявляйте каждый канал после первого:

cpp
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);  // ZC задаётся здесь
dimmerLamp dimmer2(DIM2_PIN);
dimmerLamp dimmer3(DIM3_PIN);
dimmerLamp dimmer4(DIM4_PIN);


ESP8266 — многоканальный режим

ESP8266 использует RBDdimmer по той же схеме: первый dimmerLamp задаёт пин ZC; последующие автоматически его разделяют.

cpp
// 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() {}



Управление во время работы

Обе библиотеки позволяют изменять яркость во время работы:

cpp
// 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



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



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

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

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