Passa al contenuto

Controllo dimmer AC multicanale: guida 2CH e 4CH

Devi controllare due o quattro carichi AC in modo indipendente da una sola scheda? I moduli dimmer multicanale condividono un singolo ingresso di passaggio per lo zero ma danno a ogni carico il proprio pin DIM — ecco il cablaggio e il codice.

In breve: I moduli 2CH 8A e 4CH 10A condividono un pin ZC per tutti i canali. Ogni canale ha il proprio pin DIM. Una singola chiamata di interrupt nel codice copre tutti i canali; la luminosità si imposta indipendentemente per ogni handle di canale. Usa rbdimmerESP32 su ESP32 dual-core, RBDdimmer su Arduino/ESP8266.



Cosa offrono i moduli multicanale

Modulo Canali Max. per canale Condiviso
2CH 8A 2 8A / ~1 300W a 220V Pin ZC, AC-N
4CH 10A 4 10A / ~1 700W a 220V Pin ZC, AC-N

Ogni canale controlla un carico AC indipendentemente. Il rilevatore di passaggio per lo zero è condiviso — un singolo interrupt del MCU serve tutti i canali.



Cablaggio


2CH 8A — assegnazione pin

text
Modulo   →   MCU (esempio ESP32)
────────────────────────────────
ZC-OUT   →   GPIO 4   (interrupt, qualsiasi GPIO su ESP32)
DIM1     →   GPIO 16  (canale 1)
DIM2     →   GPIO 17  (canale 2)
VCC      →   3.3V
GND      →   GND

Lato AC: entrambi i canali condividono il neutro (AC-N). Ogni canale ha i propri AC L-IN e AC L-OUT collegati in serie con il suo carico.

Full wiring diagrams: Hardware Connection Guide


4CH 10A — assegnazione pin

text
Modulo   →   MCU (esempio 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 per tutti i canali. Collega ZC-OUT a un singolo pin di interrupt del MCU. Nel codice, registra il passaggio per lo zero una volta — si applica a tutti i canali del modulo.




Codice: ESP32 (rbdimmerESP32)

Usa rbdimmerESP32 su ESP32 dual-core e ESP32-S3. La libreria gestisce IRAM_ATTR e il pinning dei core automaticamente — la ISR gira su Core 0 mentre il WiFi gira su Core 1, prevenendo i crash.


Esempio a 2 canali

cpp
// rbdimmerESP32 — 2 canali indipendenti, passaggio per lo zero condiviso
// 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);
    // Impostare la luminosità di ogni canale indipendentemente
    rbdimmer_set_level(ch1, 80);  // Canale 1 → 80%
    rbdimmer_set_level(ch2, 40);  // Canale 2 → 40%
}
void loop() {
    // Modificare i livelli a runtime secondo necessità
    // rbdimmer_set_level(ch1, newLevel);
}


Esempio a 4 canali

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]);
    }
    // Esempio: luminosità a scalini
    rbdimmer_set_level(channels[0], 100);
    rbdimmer_set_level(channels[1], 75);
    rbdimmer_set_level(channels[2], 50);
    rbdimmer_set_level(channels[3], 25);
}


Curve di dimmerizzazione

Curva Costante Ideale per
Lineare RBDIMMER_CURVE_LINEAR Elementi riscaldanti
RMS RBDIMMER_CURVE_RMS Lampadine a incandescenza
Logaritmica RBDIMMER_CURVE_LOGARITHMIC Lampadine LED dimmerabili



Codice: Arduino / ESP8266 (RBDdimmer)

Usa RBDdimmer per schede Arduino basate su ATmega e 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 canali

cpp
// RBDdimmer — 2 canali su Arduino Uno/Nano
// Il pin ZC DEVE essere il pin 2 o 3 su Uno/Nano (INT0/INT1)
#include <RBDdimmer.h>
#define ZC_PIN    2   // Pin di interrupt hardware
#define DIM1_PIN  5
#define DIM2_PIN  6
// Il primo dimmer registra il pin di passaggio per lo zero
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);
// I dimmer successivi condividono il segnale ZC da dimmer1
dimmerLamp dimmer2(DIM2_PIN);
void setup() {
    dimmer1.begin(NORMAL_MODE, ON);
    dimmer2.begin(NORMAL_MODE, ON);
    dimmer1.setPower(80);  // Canale 1 → 80%
    dimmer2.setPower(40);  // Canale 2 → 40%
}
void loop() {
    // Nessuna chiamata speciale necessaria in NORMAL_MODE
}


Arduino Mega — opzioni pin ZC

Sul Mega, ZC può essere il pin 2, 3, 18, 19, 20 o 21. Il modulo 4CH funziona allo stesso modo — dichiara ogni canale dopo il primo:

cpp
dimmerLamp dimmer1(DIM1_PIN, ZC_PIN);  // ZC impostato qui
dimmerLamp dimmer2(DIM2_PIN);
dimmerLamp dimmer3(DIM3_PIN);
dimmerLamp dimmer4(DIM4_PIN);


ESP8266 — multicanale

ESP8266 usa RBDdimmer con lo stesso schema: il primo dimmerLamp imposta il pin ZC; i successivi lo condividono automaticamente.

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



Controllo a runtime

Entrambe le librerie consentono di modificare la luminosità a runtime:

cpp
// rbdimmerESP32
rbdimmer_set_level(ch1, 60);
// Con transizione graduale (rbdimmerESP32)
// firma: (canale, livello_obiettivo_pct, durata_ms)
rbdimmer_set_level_transition(ch1, 60, 2000); // → 60% in 2 000 ms
// RBDdimmer
dimmer1.setPower(60);



Errori frequenti

Errore Soluzione
Pin ZC separati per canale Usare un pin ZC, una sola registrazione
Usare RBDdimmer su ESP32+WiFi Usare rbdimmerESP32
ZC su pin senza interrupt (Uno) Usare pin 2 o 3 su Uno/Nano
Sovraccarico di un canale Verificare la portata del modulo: 8A o 10A per canale
Pin DIM cablati nell'ordine sbagliato I carichi scambiano canale; riassegnare i GPIO



Articoli correlati



Hai ancora domande?

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

Condividi articolo
Accedi per lasciare un commento