In breve: Per ESP32 serve
rbdimmerESP32— non la vecchiaRBDdimmer. La vecchia libreria è stata scritta per Arduino AVR: nessunIRAM_ATTR, nessun pinning del core, nessuna protezione contro le race condition. Su ESP32 causa Guru Meditation Error, riavvii casuali o comportamento erratico disetPower(). Viceversa, per Arduino Uno/Mega usareRBDdimmer—rbdimmerESP32non compilerà lì.
Descrizione del problema
Prendi un tutorial che usa #include <RBDdimmer.h>, lo carichi su un
ESP32 — e ottieni uno dei seguenti:
- Guru Meditation Error con WiFi attivo (crash nel gestore di interrupt)
- Riavvii casuali senza causa apparente
setPower()non dà la luminosità attesa — comportamento caotico del carico- Avvisi del compilatore su
IRAM_ATTRe API obsolete
O il contrario — rbdimmerESP32 su Arduino Uno:
error: 'xTaskCreatePinnedToCore' was not declared in this scope
Messaggi tipici nei forum:
Guru Meditation Error: Core 1 panic'ed (Cache disabled but cachedmemory region accessed)error: 'xTaskCreatePinnedToCore' was not declared in this scopewarning: 'IRAM_ATTR' attribute ignored- «
setPower(50)— la lampada si spegne poi salta a luminosità massima»
Causa profonda
L'ecosistema rbdimmer ha due librerie separate per piattaforme diverse:
| Libreria | Piattaforma | Classe |
|---|---|---|
RBDdimmer |
Arduino AVR (Uno, Nano, Mega) | dimmerLamp |
rbdimmerESP32 |
ESP32 dual-core (orig, S3) | rbdimmer |
Non sono intercambiabili. Differenze tecniche principali:
RBDdimmernon usaIRAM_ATTR→ l'ISR viene eseguita dalla flash → con WiFi attivo la cache flash viene disabilitata → crash. Dettagli:troubleshooting/esp32-iram-attr.mdRBDdimmernon assegna il task a un core specifico → su ESP32 dual-core compete con il task WiFi → jitter di timing → luminosità instabilerbdimmerESP32usaxTaskCreatePinnedToCoredi FreeRTOS → non compila su Arduino AVR (nessun FreeRTOS)
Soluzioni
🟢 Per principianti: DimmerLink — una libreria per tutte le piattaforme
Non vuoi preoccuparti di quale libreria usare? DimmerLink è controllato via I2C — lo stesso codice funziona su Arduino, ESP32, ESP8266 e RPi.
DimmerLink ha il proprio controller di passaggio per lo zero e timing TRIAC. Il tuo microcontrollore imposta solo il livello di luminosità via I2C. Nessun ISR, nessun IRAM_ATTR, nessuna selezione di libreria per piattaforma.
Codice:
// DimmerLink — funziona su Arduino, ESP32, ESP8266, Raspberry Pi
// Documentazione: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
void setLevel(uint8_t level) { // level: 0–100%
Wire.beginTransmission(DIMMER_ADDR);
Wire.write(REG_LEVEL);
Wire.write(level);
Wire.endTransmission();
}
void setup() {
Wire.begin(); // SDA/SCL predefiniti per la tua scheda
setLevel(50); // luminosità 50%
}
void loop() {}Risultato: Nessun problema di scelta della libreria — codice identico su qualsiasi piattaforma.
🔵 Per utenti avanzati: la libreria corretta per la tua piattaforma
Vuoi una connessione ISR diretta? Usa la libreria corretta.
Installare rbdimmerESP32 (per ESP32)
In Arduino IDE:
- Sketch → Includi libreria → Gestione librerie
- Cercare:
rbdimmerESP32 - Installare: di RobotDyn
In PlatformIO (platformio.ini):
lib_deps =
https://github.com/robotdyn-dimmer/rbdimmerESP32Migrazione del codice da RBDdimmer a rbdimmerESP32
// ─────────────── PRIMA (RBDdimmer — non per ESP32) ───────────────────
#include <RBDdimmer.h>
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
// NORMAL_MODE, ON — costanti di RBDdimmer, non esistono in rbdimmerESP32
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(50);
}
// ──────────────── DOPO (rbdimmerESP32 — corretto per ESP32) ──────────
#include "rbdimmerESP32.h"
rbdimmer dimmer;
void setup() {
// Ordine dei pin: ZC_PIN, DIM_PIN (invertito rispetto a RBDdimmer!)
dimmer.begin(ZC_PIN, DIM_PIN, 50); // terzo parametro — frequenza di rete
dimmer.setPower(50);
}⚠️ L'ordine dei pin in
begin()è cambiato: inRBDdimmeril costruttore accettava(DIM, ZC), inrbdimmerESP32il metodobegin()accetta(ZC, DIM, freq). Se li inverti, il carico non verrà regolato.
Test rapido dopo la migrazione (sweep 10→90→10%):
// Test visivo: sweep graduale 10% → 90% → 10%
// Se il carico risponde — libreria e pin sono corretti
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // qualsiasi GPIO su ESP32
#define DIM_PIN 19 // qualsiasi GPIO su ESP32
rbdimmer dimmer;
void setup() {
Serial.begin(115200);
dimmer.begin(ZC_PIN, DIM_PIN, 50); // rete 50 Hz
delay(500);
}
void loop() {
for (int p = 10; p <= 90; p += 10) {
dimmer.setPower(p);
Serial.println(p);
delay(500);
}
for (int p = 90; p >= 10; p -= 10) {
dimmer.setPower(p);
Serial.println(p);
delay(500);
}
}⚠️ Errori comuni
-
«Ho trovato un tutorial con
RBDdimmersu ESP32 — dice che funziona»: I tutorial del 2019–2022 usano spesso la vecchia libreria su ESP32. Dopo il rilascio dirbdimmerESP32, quegli esempi sono obsoleti. Cerca esempi conrbdimmerESP32. -
«ESP8266 + RBDdimmer + WiFi — instabile»: ESP8266 è single-core; il SDK WiFi prende periodicamente il controllo della CPU. I sintomi sono simili all'ESP32 single-core: jitter di timing con WiFi attivo. Per progetti ESP8266 affidabili con WiFi — usa DimmerLink via I2C.
-
«Ho provato
rbdimmerESP32su Uno — non compila»:rbdimmerESP32richiede FreeRTOS (xTaskCreatePinnedToCore), che non esiste su AVR. Per Uno/Nano/Mega usaRBDdimmer. -
«Installate entrambe le librerie — conflitto di header»: Arduino IDE può confondere i file. Rimuovi quella non necessaria tramite Sketch → Includi libreria → Gestione librerie.
-
«L'ordine dei pin sembra lo stesso — perché non funziona?»:
dimmerLamp dimmer(DIM, ZC)vsdimmer.begin(ZC, DIM, freq)— ZC e DIM sono invertiti. Verifica questo per primo. -
«
setPower()compila e fa qualcosa — ma instabile»:RBDdimmerpuò girare su ESP32 senza un crash esplicito — ma senzaIRAM_ATTRe pinning del core, il timing non è affidabile. Quello non è «funzionare» — è «coincidere occasionalmente». Passa arbdimmerESP32.
Controllo rapido
Tabella di compatibilità delle librerie
| Piattaforma | Libreria | Classe | Nota |
|---|---|---|---|
| Arduino Uno/Nano/Mini | RBDdimmer |
dimmerLamp |
AVR, nessun FreeRTOS |
| Arduino Mega | RBDdimmer |
dimmerLamp |
AVR |
| ESP32 (orig) / S3 | rbdimmerESP32 |
rbdimmer |
Dual-core |
| ESP32-S2/C3/H2/C6 | DimmerLink (I2C) | — | Single-core |
| ESP8266 | RBDdimmer |
dimmerLamp |
Nessun dual-core; instabile con WiFi |
| Raspberry Pi | DimmerLink (I2C) | — | Nessun tempo reale |
Problemi correlati
- Passaggio per lo zero non rilevato →
troubleshooting/zero-cross-detection-errors.md - ESP32-S2/C3 single-core →
troubleshooting/esp32-single-core-dimmer.md - Zero-cross not detected →
troubleshooting/zero-cross-detection-errors.md
Hai ancora domande?
Ask on forum.rbdimmer.com or open a GitHub Issue.