Перейти к содержимому

Неправильная библиотека: RBDdimmer вместо rbdimmerESP32 на ESP32

Используете RBDdimmer на ESP32? Это библиотека для AVR — ESP32 нужна rbdimmerESP32. Порядок пинов в begin() тоже изменён: (DIM, ZC) → (ZC, DIM, freq). Руководство по миграции, таблица платформ и DimmerLink как универсальная альтернатива.

Кратко: Для ESP32 нужна rbdimmerESP32 — а не старая RBDdimmer. Старая библиотека написана для Arduino AVR: нет IRAM_ATTR, нет привязки к ядру, нет защиты от гонки условий. На ESP32 она вызывает Guru Meditation Error, случайные перезагрузки или непредсказуемое поведение setPower(). И наоборот — для Arduino Uno/Mega используйте RBDdimmerrbdimmerESP32 там не скомпилируется.



Описание проблемы

Вы берёте урок, в котором используется #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 cached memory region accessed)
  • error: 'xTaskCreatePinnedToCore' was not declared in this scope
  • warning: '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.md
  • RBDdimmer не привязывает задачу к конкретному ядру → на двухъядерном ESP32 конкурирует с задачей WiFi → нестабильные тайминги → нестабильная яркость
  • rbdimmerESP32 использует xTaskCreatePinnedToCore из FreeRTOS → не скомпилируется на Arduino AVR (нет FreeRTOS)



Решения



🟢 Для начинающих: DimmerLink — одна библиотека для всех платформ

Не хотите думать, какую библиотеку использовать? DimmerLink управляется по I2C — один и тот же код работает на Arduino, ESP32, ESP8266 и RPi.

DimmerLink имеет собственный контроллер перехода через ноль и тайминги TRIAC. Ваш микроконтроллер только задаёт уровень яркости по I2C. Никаких ISR, IRAM_ATTR и выбора библиотеки под платформу.

Код:

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

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


Миграция кода с RBDdimmer на rbdimmerESP32

cpp
// ─────────────── ДО (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%):

cpp
// Визуальный тест: плавная развёртка 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) vs dimmer.begin(ZC, DIM, freq) — ZC и DIM поменяны местами. Проверьте это в первую очередь.

  • «setPower() компилируется и что-то делает — но нестабильно»: RBDdimmer может работать на ESP32 без явного сбоя — но без IRAM_ATTR и привязки к ядру тайминги ненадёжны. Это не «работает» — это «иногда совпадает». Переключитесь на rbdimmerESP32.




Экспресс-проверка

  • ☐ ESP32 (orig, S3): `#include "rbdimmerESP32.h"` и класс `rbdimmer`
  • ☐ Arduino Uno/Nano/Mega: `#include ` and class `dimmerLamp`
  • ☐ ESP8266: `#include ` (no dual-core, no FreeRTOS)
  • ☐ ESP32 S2/C3/H2/C6 (одноядерный): DimmerLink по I2C
  • ☐ Порядок пинов в `begin()`: `(ZC_PIN, DIM_PIN, freq)` для ESP32
  • ☐ Установлены обе библиотеки одновременно? → удалите ненужную


  • Таблица совместимости библиотек

    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 detectedtroubleshooting/zero-cross-detection-errors.md



    Остались вопросы?

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

    Поделиться этой записью
    Войти оставить комментарий