Кратко: Для ESP32 нужна
rbdimmerESP32— а не стараяRBDdimmer. Старая библиотека написана для Arduino AVR: нетIRAM_ATTR, нет привязки к ядру, нет защиты от гонки условий. На ESP32 она вызывает Guru Meditation Error, случайные перезагрузки или непредсказуемое поведениеsetPower(). И наоборот — для Arduino Uno/Mega используйтеRBDdimmer—rbdimmerESP32там не скомпилируется.
Описание проблемы
Вы берёте урок, в котором используется #include <RBDdimmer.h>, загружаете
его на ESP32 — и получаете одно из следующего:
- Guru Meditation Error при активном WiFi (сбой в обработчике прерывания)
- Случайные перезагрузки без видимой причины
setPower()не даёт ожидаемую яркость — хаотичное поведение нагрузки- Предупреждения компилятора о
IRAM_ATTRи устаревших API
Или обратная ситуация — rbdimmerESP32 на Arduino Uno:
error: 'xTaskCreatePinnedToCore' was not declared in this scope
Типичные сообщения на форумах:
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)— лампа гаснет, потом выходит на полную яркость»
Причина проблемы
В экосистеме rbdimmer есть две отдельные библиотеки для разных платформ:
| Библиотека | IRAM_ATTR | Класс |
|---|---|---|
RBDdimmer |
Arduino AVR (Uno, Nano, Mega) | dimmerLamp |
rbdimmerESP32 |
ESP32 двухъядерный (orig, S3) | rbdimmer |
Они не взаимозаменяемы. Ключевые технические различия:
RBDdimmerне используетIRAM_ATTR→ ISR выполняется из flash → при активном WiFi кэш flash отключается → сбой. Подробности:troubleshooting/esp32-iram-attr.mdRBDdimmerне привязывает задачу к конкретному ядру → на двухъядерном ESP32 конкурирует с задачей WiFi → нестабильные тайминги → нестабильная яркостьrbdimmerESP32используетxTaskCreatePinnedToCoreиз FreeRTOS → не скомпилируется на Arduino AVR (нет FreeRTOS)
Решения
🟢 Для начинающих: DimmerLink — одна библиотека для всех платформ
Не хотите думать, какую библиотеку использовать? DimmerLink управляется по I2C — один и тот же код работает на Arduino, ESP32, ESP8266 и RPi.
DimmerLink имеет собственный контроллер перехода через ноль и тайминги TRIAC. Ваш микроконтроллер только задаёт уровень яркости по I2C. Никаких ISR, IRAM_ATTR и выбора библиотеки под платформу.
Код:
// DimmerLink — работает на Arduino, ESP32, ESP8266, Raspberry Pi
// Документация: 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 по умолчанию для вашей платы
setLevel(50); // яркость 50%
}
void loop() {}Результат: Никаких проблем с выбором библиотеки — идентичный код на любой платформе.
🔵 Для продвинутых: правильная библиотека для вашей платформы
Хотите прямое подключение через ISR? Используйте правильную библиотеку.
Установка rbdimmerESP32 (для ESP32)
В Arduino IDE:
- Скетч → Подключить библиотеку → Управлять библиотеками
- Поиск:
rbdimmerESP32 - Установить: от RobotDyn
В PlatformIO (platformio.ini):
lib_deps =
https://github.com/robotdyn-dimmer/rbdimmerESP32Миграция кода с RBDdimmer на rbdimmerESP32
// ─────────────── ДО (RBDdimmer — не для ESP32) ───────────────────────
#include <RBDdimmer.h>
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
// NORMAL_MODE, ON — константы RBDdimmer, отсутствуют в rbdimmerESP32
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(50);
}
// ──────────────── ПОСЛЕ (rbdimmerESP32 — правильно для ESP32) ────────
#include "rbdimmerESP32.h"
rbdimmer dimmer;
void setup() {
// Порядок пинов: ZC_PIN, DIM_PIN (обратный по сравнению с RBDdimmer!)
dimmer.begin(ZC_PIN, DIM_PIN, 50); // третий параметр — частота сети
dimmer.setPower(50);
}⚠️ Порядок пинов в
begin()изменился: вRBDdimmerконструктор принимал(DIM, ZC), вrbdimmerESP32методbegin()принимает(ZC, DIM, freq). Если перепутать — нагрузка не будет регулироваться.
Быстрый тест после миграции (плавная развёртка 10→90→10%):
// Визуальный тест: плавная развёртка 10% → 90% → 10%
// Если нагрузка реагирует — библиотека и пины настроены правильно
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // любой GPIO на ESP32
#define DIM_PIN 19 // любой GPIO на ESP32
rbdimmer dimmer;
void setup() {
Serial.begin(115200);
dimmer.begin(ZC_PIN, DIM_PIN, 50); // сеть 50 Гц
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);
}
}⚠️ Частые ошибки
-
«Нашёл урок с
RBDdimmerна ESP32 — там написано, что работает»: Уроки 2019–2022 годов часто используют старую библиотеку на ESP32. После выходаrbdimmerESP32эти примеры устарели. Ищите примеры сrbdimmerESP32. -
«ESP8266 + RBDdimmer + WiFi — нестабильно»: ESP8266 — одноядерный; WiFi SDK периодически захватывает процессор. Симптомы аналогичны одноядерному ESP32: нестабильные тайминги при активном WiFi. Для надёжных проектов на ESP8266 с WiFi — используйте DimmerLink по I2C.
-
«Попробовал
rbdimmerESP32на Uno — не компилируется»:rbdimmerESP32требует FreeRTOS (xTaskCreatePinnedToCore), которого нет на AVR. Для Uno/Nano/Mega используйтеRBDdimmer. -
«Установил обе библиотеки — конфликт заголовков»: Arduino IDE может перепутать файлы. Удалите ненужную через Скетч → Подключить библиотеку → Управлять библиотеками.
-
«Порядок пинов вроде тот же — почему не работает?»:
dimmerLamp dimmer(DIM, ZC)vsdimmer.begin(ZC, DIM, freq)— ZC и DIM поменяны местами. Проверьте это в первую очередь. -
«
setPower()компилируется и что-то делает — но нестабильно»:RBDdimmerможет работать на ESP32 без явного сбоя — но безIRAM_ATTRи привязки к ядру тайминги ненадёжны. Это не «работает» — это «иногда совпадает». Переключитесь наrbdimmerESP32.
Экспресс-проверка
Таблица совместимости библиотек
| IRAM_ATTR | Библиотека | Класс | Примечание |
|---|---|---|---|
| Arduino Uno/Nano/Mini | RBDdimmer |
dimmerLamp |
AVR, нет FreeRTOS |
| Arduino Mega | RBDdimmer |
dimmerLamp |
AVR |
| ESP32 (orig) / S3 | rbdimmerESP32 |
rbdimmer |
Двухъядерный |
| ESP32-S2/C3/H2/C6 | DimmerLink (I2C) | — | Одноядерный |
| ESP8266 | RBDdimmer |
dimmerLamp |
Нет двух ядер; нестабильно с WiFi |
| — (без ISR) | DimmerLink (I2C) | — | Нет реального времени |
Связанные проблемы
- Переход через ноль не обнаружен →
troubleshooting/zero-cross-detection-errors.md - ESP32-S2/C3 одноядерный →
troubleshooting/esp32-single-core-dimmer.md - Zero-cross not detected →
troubleshooting/zero-cross-detection-errors.md
Остались вопросы?
Ask on forum.rbdimmer.com or open a GitHub Issue.