En bref : Pour ESP32 vous avez besoin de
rbdimmerESP32— pas de l'ancienneRBDdimmer. L'ancienne bibliothèque a été écrite pour Arduino AVR : pas d'IRAM_ATTR, pas d'épinglage de cœur, pas de protection contre les conditions de course. Sur ESP32 elle provoque un Guru Meditation Error, des redémarrages aléatoires ou un comportement erratique desetPower(). Inversement, pour Arduino Uno/Mega utilisezRBDdimmer—rbdimmerESP32ne compilera pas dessus.
Description du problème
Vous prenez un tutoriel qui utilise #include <RBDdimmer.h>, vous le
téléversez sur un ESP32 — et vous obtenez l'un des problèmes suivants :
- Guru Meditation Error avec WiFi actif (plantage dans le gestionnaire d'interruption)
- Redémarrages aléatoires sans cause apparente
setPower()ne donne pas la luminosité attendue — comportement chaotique de la charge- Avertissements du compilateur sur
IRAM_ATTRet des API obsolètes
Ou l'inverse — rbdimmerESP32 sur Arduino Uno :
error: 'xTaskCreatePinnedToCore' was not declared in this scope
Messages typiques sur les forums :
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 lampe s'éteint puis passe à pleine luminosité »
Cause profonde
L'écosystème rbdimmer possède deux bibliothèques distinctes pour différentes plateformes :
| Bibliothèque | Plateforme | Classe |
|---|---|---|
RBDdimmer |
Arduino AVR (Uno, Nano, Mega) | dimmerLamp |
rbdimmerESP32 |
ESP32 double cœur (orig, S3) | rbdimmer |
Elles ne sont pas interchangeables. Différences techniques clés :
RBDdimmern'utilise pasIRAM_ATTR→ l'ISR s'exécute depuis la flash → avec WiFi actif le cache flash est désactivé → plantage. Détails :troubleshooting/esp32-iram-attr.mdRBDdimmern'épingle pas la tâche sur un cœur spécifique → sur ESP32 double cœur elle entre en concurrence avec la tâche WiFi → instabilité du timing → luminosité instablerbdimmerESP32utilisexTaskCreatePinnedToCorede FreeRTOS → ne compile pas sur Arduino AVR (pas de FreeRTOS)
Solutions
🟢 Pour les débutants : DimmerLink — une bibliothèque pour toutes les plateformes
Vous ne voulez pas vous soucier de quelle bibliothèque utiliser ? DimmerLink est contrôlé via I2C — le même code fonctionne sur Arduino, ESP32, ESP8266 et RPi.
DimmerLink possède son propre contrôleur de passage par zéro et son timing TRIAC. Votre microcontrôleur ne fait que définir le niveau de luminosité via I2C. Pas d'ISR, pas d'IRAM_ATTR, pas de sélection de bibliothèque par plateforme.
Code :
// DimmerLink — fonctionne sur Arduino, ESP32, ESP8266, Raspberry Pi
// Documentation : 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 par défaut pour votre carte
setLevel(50); // luminosité 50%
}
void loop() {}Résultat : Aucun casse-tête de sélection de bibliothèque — code identique sur n'importe quelle plateforme.
🔵 Pour les utilisateurs avancés : la bonne bibliothèque pour votre plateforme
Vous voulez une connexion ISR directe ? Utilisez la bonne bibliothèque.
Installer rbdimmerESP32 (pour ESP32)
Dans Arduino IDE :
- Croquis → Inclure une bibliothèque → Gérer les bibliothèques
- Rechercher :
rbdimmerESP32 - Installer : par RobotDyn
Dans PlatformIO (platformio.ini) :
lib_deps =
https://github.com/robotdyn-dimmer/rbdimmerESP32Migration du code de RBDdimmer vers rbdimmerESP32
// ─────────────── AVANT (RBDdimmer — pas pour ESP32) ──────────────────
#include <RBDdimmer.h>
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
// NORMAL_MODE, ON — constantes RBDdimmer, n'existent pas dans rbdimmerESP32
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(50);
}
// ──────────────── APRÈS (rbdimmerESP32 — correct pour ESP32) ─────────
#include "rbdimmerESP32.h"
rbdimmer dimmer;
void setup() {
// Ordre des broches : ZC_PIN, DIM_PIN (inversé par rapport à RBDdimmer !)
dimmer.begin(ZC_PIN, DIM_PIN, 50); // troisième paramètre — fréquence secteur
dimmer.setPower(50);
}⚠️ L'ordre des broches dans
begin()a changé : dansRBDdimmerle constructeur prenait(DIM, ZC), dansrbdimmerESP32la méthodebegin()prend(ZC, DIM, freq). Si vous les inversez, la charge ne sera pas régulée.
Test rapide après migration (balayage 10→90→10%) :
// Test visuel : balayage progressif 10% → 90% → 10%
// Si la charge réagit — bibliothèque et broches sont correctes
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // n'importe quel GPIO sur ESP32
#define DIM_PIN 19 // n'importe quel GPIO sur ESP32
rbdimmer dimmer;
void setup() {
Serial.begin(115200);
dimmer.begin(ZC_PIN, DIM_PIN, 50); // secteur 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);
}
}⚠️ Pièges courants
-
« J'ai trouvé un tutoriel utilisant
RBDdimmersur ESP32 — il dit que ça marche » : Les tutoriels de 2019–2022 utilisent souvent l'ancienne bibliothèque sur ESP32. Depuis la sortie derbdimmerESP32, ces exemples sont obsolètes. Cherchez des exemples utilisantrbdimmerESP32. -
« ESP8266 + RBDdimmer + WiFi — instable » : L'ESP8266 est simple cœur ; le SDK WiFi prend périodiquement le contrôle du CPU. Les symptômes sont similaires à l'ESP32 simple cœur : instabilité du timing avec WiFi actif. Pour des projets ESP8266 fiables avec WiFi — utilisez DimmerLink via I2C.
-
« J'ai essayé
rbdimmerESP32sur Uno — ne compile pas » :rbdimmerESP32nécessite FreeRTOS (xTaskCreatePinnedToCore), qui n'existe pas sur AVR. Pour Uno/Nano/Mega utilisezRBDdimmer. -
« Les deux bibliothèques installées — conflit d'en-têtes » : L'Arduino IDE peut mélanger les fichiers. Supprimez celle dont vous n'avez pas besoin via Croquis → Inclure une bibliothèque → Gérer les bibliothèques.
-
« L'ordre des broches semble identique — pourquoi ça ne marche pas ? » :
dimmerLamp dimmer(DIM, ZC)vsdimmer.begin(ZC, DIM, freq)— ZC et DIM sont inversés. Vérifiez cela en premier. -
«
setPower()compile et fait quelque chose — mais instable » :RBDdimmerpeut tourner sur ESP32 sans plantage explicite — mais sansIRAM_ATTRet épinglage de cœur, le timing n'est pas fiable. Ce n'est pas « fonctionner » — c'est « coïncider occasionnellement ». Passez àrbdimmerESP32.
Vérification rapide
Tableau de compatibilité des bibliothèques
| Plateforme | Bibliothèque | Classe | Remarque |
|---|---|---|---|
| Arduino Uno/Nano/Mini | RBDdimmer |
dimmerLamp |
AVR, pas de FreeRTOS |
| Arduino Mega | RBDdimmer |
dimmerLamp |
AVR |
| ESP32 (orig) / S3 | rbdimmerESP32 |
rbdimmer |
Double cœur |
| ESP32-S2/C3/H2/C6 | DimmerLink (I2C) | — | Simple cœur |
| ESP8266 | RBDdimmer |
dimmerLamp |
Pas de double cœur ; instable avec WiFi |
| DimmerLink | DimmerLink (I2C) | — | Pas de temps réel |
Problèmes connexes
- Passage par zéro non détecté →
troubleshooting/zero-cross-detection-errors.md - ESP32-S2/C3 simple cœur →
troubleshooting/esp32-single-core-dimmer.md - Zero-cross not detected →
troubleshooting/zero-cross-detection-errors.md
Encore des questions ?
Ask on forum.rbdimmer.com or open a GitHub Issue.