Passa al contenuto

Libreria sbagliata: RBDdimmer invece di rbdimmerESP32 su ESP32

Usi RBDdimmer su ESP32? Quella è la libreria AVR — ESP32 richiede rbdimmerESP32. Anche l'ordine dei pin in begin() è invertito: (DIM, ZC) → (ZC, DIM, freq). Guida alla migrazione, tabella piattaforme e DimmerLink come alternativa universale.

In breve: Per ESP32 serve rbdimmerESP32 — non la vecchia RBDdimmer. La vecchia libreria è stata scritta per Arduino AVR: nessun IRAM_ATTR, nessun pinning del core, nessuna protezione contro le race condition. Su ESP32 causa Guru Meditation Error, riavvii casuali o comportamento erratico di setPower(). Viceversa, per Arduino Uno/Mega usare RBDdimmerrbdimmerESP32 non 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_ATTR e 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 cached memory region accessed)
  • error: 'xTaskCreatePinnedToCore' was not declared in this scope
  • warning: '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:

  • RBDdimmer non usa IRAM_ATTR → l'ISR viene eseguita dalla flash → con WiFi attivo la cache flash viene disabilitata → crash. Dettagli: troubleshooting/esp32-iram-attr.md
  • RBDdimmer non assegna il task a un core specifico → su ESP32 dual-core compete con il task WiFi → jitter di timing → luminosità instabile
  • rbdimmerESP32 usa xTaskCreatePinnedToCore di 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:

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

ini
lib_deps =
    https://github.com/robotdyn-dimmer/rbdimmerESP32


Migrazione del codice da RBDdimmer a rbdimmerESP32

cpp
// ─────────────── 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: in RBDdimmer il costruttore accettava (DIM, ZC), in rbdimmerESP32 il metodo begin() accetta (ZC, DIM, freq). Se li inverti, il carico non verrà regolato.

Test rapido dopo la migrazione (sweep 10→90→10%):

cpp
// 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 RBDdimmer su ESP32 — dice che funziona»: I tutorial del 2019–2022 usano spesso la vecchia libreria su ESP32. Dopo il rilascio di rbdimmerESP32, quegli esempi sono obsoleti. Cerca esempi con rbdimmerESP32.

  • «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 rbdimmerESP32 su Uno — non compila»: rbdimmerESP32 richiede FreeRTOS (xTaskCreatePinnedToCore), che non esiste su AVR. Per Uno/Nano/Mega usa RBDdimmer.

  • «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) vs dimmer.begin(ZC, DIM, freq) — ZC e DIM sono invertiti. Verifica questo per primo.

  • «setPower() compila e fa qualcosa — ma instabile»: RBDdimmer può girare su ESP32 senza un crash esplicito — ma senza IRAM_ATTR e pinning del core, il timing non è affidabile. Quello non è «funzionare» — è «coincidere occasionalmente». Passa a rbdimmerESP32.




Controllo rapido

  • ☐ ESP32 (orig, S3): `#include "rbdimmerESP32.h"` e classe `rbdimmer`
  • ☐ Arduino Uno/Nano/Mega: `#include ` and class `dimmerLamp`
  • ☐ ESP8266: `#include ` (no dual-core, no FreeRTOS)
  • ☐ ESP32 S2/C3/H2/C6 (single-core): DimmerLink via I2C
  • ☐ Ordine dei pin in `begin()`: `(ZC_PIN, DIM_PIN, freq)` per ESP32
  • ☐ Entrambe le librerie installate contemporaneamente? → rimuovi quella non necessaria


  • 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 rilevatotroubleshooting/zero-cross-detection-errors.md
    • ESP32-S2/C3 single-coretroubleshooting/esp32-single-core-dimmer.md
    • Zero-cross not detectedtroubleshooting/zero-cross-detection-errors.md



    Hai ancora domande?

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

    Condividi articolo
    Accedi per lasciare un commento