Ir al contenido

Control de dimmer AC multicanal: guía 2CH y 4CH

¿Necesitas controlar dos o cuatro cargas AC de forma independiente desde una sola placa? Los módulos dimmer multicanal comparten una sola entrada de cruce por cero pero dan a cada carga su propio pin DIM — aquí está el cableado y el código.

Resumen: Los módulos 2CH 8A y 4CH 10A comparten un pin ZC para todos los canales. Cada canal tiene su propio pin DIM. Una sola llamada de interrupción en el código cubre todos los canales; el brillo se establece de forma independiente por descriptor de canal. Usa rbdimmerESP32 en ESP32 de doble núcleo, RBDdimmer en Arduino/ESP8266.



Qué ofrecen los módulos multicanal

Módulo Canales Máx. por canal Compartido
2CH 8A 2 8A / ~1 300W a 220V Pin ZC, AC-N
4CH 10A 4 10A / ~1 700W a 220V Pin ZC, AC-N

Cada canal controla una carga AC de forma independiente. El detector de cruce por cero es compartido — una sola interrupción del MCU atiende todos los canales.



Cableado


2CH 8A — asignación de pines

text
Módulo   →   MCU (ejemplo ESP32)
────────────────────────────────
ZC-OUT   →   GPIO 4   (interrupción, cualquier GPIO en ESP32)
DIM1     →   GPIO 16  (canal 1)
DIM2     →   GPIO 17  (canal 2)
VCC      →   3.3V
GND      →   GND

Lado AC: ambos canales comparten el neutro (AC-N). Cada canal tiene sus propios AC L-IN y AC L-OUT conectados en serie con su carga.

Full wiring diagrams: Hardware Connection Guide


4CH 10A — asignación de pines

text
Módulo   →   MCU (ejemplo ESP32)
────────────────────────────────
ZC-OUT   →   GPIO 4
DIM1     →   GPIO 16
DIM2     →   GPIO 17
DIM3     →   GPIO 18
DIM4     →   GPIO 19
VCC      →   3.3V
GND      →   GND

⚠️ Un pin ZC para todos los canales. Conecta ZC-OUT a un solo pin de interrupción del MCU. En el código, registra el cruce por cero una vez — se aplica a todos los canales del módulo.




Código: ESP32 (rbdimmerESP32)

Usa rbdimmerESP32 en ESP32 de doble núcleo y ESP32-S3. La biblioteca maneja IRAM_ATTR y la asignación de núcleos automáticamente — la ISR se ejecuta en Core 0 mientras WiFi corre en Core 1, evitando fallos.


Ejemplo de 2 canales

cpp
// rbdimmerESP32 — 2 canales independientes, cruce por cero compartido
// Docs: 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);
    // Establecer brillo de cada canal de forma independiente
    rbdimmer_set_level(ch1, 80);  // Canal 1 → 80%
    rbdimmer_set_level(ch2, 40);  // Canal 2 → 40%
}
void loop() {
    // Cambiar niveles en tiempo de ejecución según necesidad
    // rbdimmer_set_level(ch1, newLevel);
}


Ejemplo de 4 canales

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]);
    }
    // Ejemplo: brillo escalonado
    rbdimmer_set_level(channels[0], 100);
    rbdimmer_set_level(channels[1], 75);
    rbdimmer_set_level(channels[2], 50);
    rbdimmer_set_level(channels[3], 25);
}


Curvas de atenuación

Curva Constante Ideal para
Lineal RBDIMMER_CURVE_LINEAR Elementos calefactores
RMS RBDIMMER_CURVE_RMS Bombillas incandescentes
Logarítmica RBDIMMER_CURVE_LOGARITHMIC Bombillas LED dimmables



Código: Arduino / ESP8266 (RBDdimmer)

Usa RBDdimmer para placas Arduino basadas en ATmega y 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 canales

cpp
// RBDdimmer — 2 canales en Arduino Uno/Nano
// El pin ZC DEBE ser el pin 2 o 3 en Uno/Nano (INT0/INT1)
#include <RBDdimmer.h>
#define ZC_PIN    2   // Pin de interrupción hardware
#define DIM1_PIN  5
#define DIM2_PIN  6
// El primer dimmer registra el pin de cruce por cero
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);
// Los dimmers siguientes comparten la señal ZC de dimmer1
dimmerLamp dimmer2(DIM2_PIN);
void setup() {
    dimmer1.begin(NORMAL_MODE, ON);
    dimmer2.begin(NORMAL_MODE, ON);
    dimmer1.setPower(80);  // Canal 1 → 80%
    dimmer2.setPower(40);  // Canal 2 → 40%
}
void loop() {
    // No se necesita llamada especial en NORMAL_MODE
}


Arduino Mega — opciones de pin ZC

En el Mega, ZC puede ser el pin 2, 3, 18, 19, 20 o 21. El módulo 4CH funciona de la misma manera — declara cada canal después del primero:

cpp
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);  // ZC se establece aquí
dimmerLamp dimmer2(DIM2_PIN);
dimmerLamp dimmer3(DIM3_PIN);
dimmerLamp dimmer4(DIM4_PIN);


ESP8266 — multicanal

ESP8266 usa RBDdimmer con el mismo patrón: el primer dimmerLamp establece el pin ZC; los siguientes lo comparten automáticamente.

cpp
// RBDdimmer — 2 canales en 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);  // comparte ZC de dimmer1
void setup() {
    dimmer1.begin(NORMAL_MODE, ON);
    dimmer2.begin(NORMAL_MODE, ON);
    dimmer1.setPower(80);
    dimmer2.setPower(40);
}
void loop() {}



Control en tiempo de ejecución

Ambas bibliotecas permiten cambiar el brillo en tiempo de ejecución:

cpp
// rbdimmerESP32
rbdimmer_set_level(ch1, 60);
// Con transición suave (rbdimmerESP32)
// firma: (canal, nivel_objetivo_pct, duración_ms)
rbdimmer_set_level_transition(ch1, 60, 2000); // → 60% en 2 000 ms
// RBDdimmer
dimmer1.setPower(60);



Errores frecuentes

Error Solución
Pines ZC separados por canal Usar un pin ZC, un solo registro
Usar RBDdimmer en ESP32+WiFi Usar rbdimmerESP32
ZC en pin sin interrupción (Uno) Usar pin 2 o 3 en Uno/Nano
Sobrecarga de un canal Verificar la capacidad del módulo: 8A o 10A por canal
Pines DIM cableados en orden incorrecto Las cargas intercambian canales; reasignar GPIO



Artículos relacionados



¿Todavía tienes preguntas?

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

Compartir esta publicación
Iniciar sesión para dejar un comentario