
ЕНЕРГЕТИЧНИЙ ВАМПІР-ПОСІБНИК РОЗРОБНИКА ТА АДМІНІСТРАТОРА
Документація для радіолюбителів-аматорів. Програмні коди створено з використанням Gemini, великої мовної моделі (LLM), яка була розроблена компанією Google
Автор: Магазин електронних модулів https://arduinka.biz.ua
ESP32 SOLAR DIVERTER (ДІМЕР) V5.5 ВАМПІР
В якості обладнання використана плата ESP32-C3 SuperMini PRO/PLUShttps://arduinka.biz.ua/esp32-c3-supermini-plata-razrabotki-wifi-ble-usb
В якості дімера використано Димер 220В для Arduino та ESP8266
https://arduino.ua/prod2958-dimmer-220v-dlya-arduino
-
ВСТУП ТА ПРИНЦИП РОБОТИ
Система реалізує принцип Пріоритету Надлишку сонячної генерації з динамічним урахуванням фонового споживання домогосподарства.
- Логіка обчислення: Home Assistant отримує дані про поточну сонячну генерацію та віднімає від неї фіксоване значення споживання серверів та мережевого обладнання що стаорюють фонове навантаження
- Формула: Цільова Потужність = MAX(0, Сонячна Генерація - Фон).
- Автономність: Оскільки MQTT-брокер працює локально на сервері Home Assistant, система зберігає повну працездатність у межах локальної мережі Wi-Fi навіть за умови відсутності зовнішнього інтернет-з'єднання.
- Автоматичний (PV): Потужність на ТЕН подається лише при виникненні надлишку сонячної енергії (понад фонове споживання, яке можна налаштувати і таке що дорівнює нулю).
- Ручний режим: Користувач власноруч встановлює бажану потужність (у прикладі налаштовано 0-800W) через інтерфейс Home Assistant, що має пріорітет над вимірами сонячної генерації.

-
КОНФІГУРАЦІЯ АПАРАТНОЇ ЧАСТИНИ (GPIO)
Для управління димером дистанційно може бути використаний любий контролер в якому є WiFi. Для цього треба переписати код скетча і врахувати управляючі піни так, щоб один використовувався для детекції нуля синусоїди, а інший подавав сигнал для відкриття симістора.
3. СЛОВНИК КОНСТАНТ ТА МАКРОСІВ (КОНФІГУРАЦІЯ)
Ці параметри знаходяться у розділі МАКРОСИ ТА КОНФІГУРАЦІЯ (КОНСТАНТИ) і вимагають оновлення при зміні мережі або пристроїв.Дані з таблиці включено в код програми для ESP32
| Константа Скетчу |
GPIO Пін | Функція |
|---|---|---|
| ZERO_CROSS_PIN | 5 | Вхід від модуля Zero-Cross (детектор перетину нуля для синхронізації). Ловить перетин синусоїди потужності через ноль |
| TRIAC_GATE_PIN | 4 | Вихід на керування симістором (TRIAC Gate) за методом Burst Control. Обрізає пакети синусоїди рівними порціями щоб її не спотворити і не створювати гармоніки |
| LED_PIN | 8 | Пін керування вбудованим адресним RGB LED (WS2812B) для діагностики. Забезпечує індикацію режимів роботи та аварій системи |
4. ОПИС MQTT-ТОПІКІВ HOME ASSISTANT
| Топік (Константа) | MQTT-шлях (Приклад) | Тип | Опис |
|---|---|---|---|
| TOPIC_TARGET_POWER | solar/sensor/calculated_surplus | Вхід | Отримує обчислений "чистий" надлишок (W) від HA (Сонце - 35W). 13 |
| TOPIC_MANUAL_POWER | homeassistant/input_number/boiler_power_manual/state | Вхід | Отримує цільову потужність (W) при роботі в Ручному режимі. 14 |
| TOPIC_MANUAL_MODE | homeassistant/input_boolean/boiler_manual_mode/state | Вхід | Отримує статус Ручного режиму (ON / OFF). 15 |
| TOPIC_BOILER_STATUS | homeassistant/sensor/boiler_power/state | Вихід | Публікує фактичну потужність (W), яку контролер подає на ТЕН. 16 |
5. СЛОВНИК ЗМІННИХ СИСТЕМИ
Ці змінні визначають поточний стан контролера esp32-c3| Змінна (Тип) | Призначення | Опис |
| volatile int gridFlow | Вхід (W) | Останнє отримане значення Надлишку або Цільової Потужності. |
| volatile int manualPower | Вхід (W) | Значення потужності, задане користувачем у Ручному режимі. |
| volatile bool isManualMode | Вхід (bool) | true — Ручний режим, false — Автоматичний режим. |
| volatile int currentOutputPower | Вихід (W) | Фактична потужність на бойлері (з урахуванням роботи рампи). |
| volatile int dimmerValue | Керування | Значення для розрахунку затримки або кількості імпульсів (0-255). |
| long lastMqttReceived | Watchdog (мс) | Час останнього успішного отримання будь-якого MQTT-пакету. |
6. ВІЗУАЛЬНА ДІАГНОСТИКА (RGB LED WS2812B)
Світлодіод використовує динамічний блінк (0.5 с ON / 2.0 с OFF) для індикації робочих режимів та швидкий блінк для аварії.Використовується вбудований піксельний адресний світлодіод ws2812
| Колір | Поведінка | Статус | Умова Спрацьовування |
| Червоний | Швидке блимання | Аварія Зв'язку / Watchdog | MQTT відключено АБО дані не надходили понад 30 секунд. |
| Зелений | Повільне блимання | Активна Робота | Потужність на бойлер подається (currentOutputPower > 0). |
| Синій | Повільне блимання | Очікування | Потужність бойлера дорівнює 0 W |
6.1. Діагностика через Serial Monitor (Arduino IDE)
Для поглибленого моніторингу та налагодження системи передбачено вивід технічних даних у серійний порт (Serial Port) зі швидкістю 115200 бод. Через інтерфейс Arduino IDE користувач може спостерігати за логікою прийняття рішень контролером у реальному часі: у вікно монітора виводяться поточні значення отриманої через MQTT «Цілі» (Target), стан режиму (Автоматичний/Ручний), а також фактичне значення потужності на виході з урахуванням роботи програмної рампи. Протоколом виводу також передбачено службові повідомлення про статус Wi-Fi з’єднання, IP-адресу пристрою, підтвердження отримання MQTT-пакетів та критичні попередження системи захисту (Watchdog), що дозволяє адміністратору оперативно виявляти причини можливих затримок або збоїв зв'язку без демонтажу пристрою.
В таблиці- приклади повідомлення від ESP32 через порт серыйний в Arduino IDE
| Повідомлення в Serial Monitor | Опис / Значення | Коли з'являється |
| WiFi connected. IP: 192.168.0.XX | Успішне підключення до роутера. Показує локальну адресу ESP32. | При старті або перепідключенні. |
| Attempting MQTT connection... | Контролер намагається авторизуватися на вашому сервері Home Assistant. | При старті або після збою мережі. |
| MQTT connected | Зв’язок з брокером встановлено. ESP32 готова отримувати дані. | Одразу після успішної авторизації. |
| Target Power received: 450W | Відображає значення, яке прийшло з HA (чистий надлишок). | Щоразу, коли змінюється генерація сонця. |
| Manual Mode: ON. Target: 500W | Повідомляє, що активувався ручний режим і встановлено конкретну потужність. | При перемиканні тумблера в HA. |
| Ramp: 320W -> 340W | Крок програмної рампи. Показує плавне підтягування реальної потужності до цілі. | Кожні 100 мс під час зміни навантаження. |
| !!! WARNING: MQTT TIMEOUT! Power -> 0W | Повідомлення захисту Watchdog. Дані не надходили понад 30 сек. | При збої зв'язку (світиться червоний LED). |
| New Dimmer Value: 128 | Технічне значення (0-255), яке передається на симістор для пакетного керування. | При кожній зміні вихідної потужності. |
7. ФУНКЦІОНАЛЬНІСТЬ ЗАХИСТУ
7.1. Захист Watchdog (MQTT Timeout)
Система реалізує функцію безперервного контролю зв'язку. Якщо увімкнений Автоматичний режим (isManualMode = false) і з моменту останнього отримання даних з MQTT минуло більше ніж 30 секунд (MQTT_TIMEOUT_MS):- Система негайно встановлює currentOutputPower = 0 W для безпеки.
- Світлодіод переходить у режим Червоної Аварії за відсутністю звязку.
- У Serial Monitor виводиться повідомлення: !!! WARNING: MQTT TIMEOUT! Power set to 0 W for safety. !!!.
8. ОСОБЛИВОСТІ ТА ЛОГІКА КЕРУВАННЯ (v10.1)
Цей розділ описує фізичні принципи роботи дімера, оптимізовані для безпеки мікроінвертора та точності використання надлишку.8.1. Принцип Керування: Пакетне Керування (Burst Control)
Ми використовуємо метод Burst Control замість фазового дімування для зпобігання спотворень синусоїди в мережі. ТЕН вмикається та вимикається лише в моменти перетину синусоїдою нуля (Zero-Crossing).
Перевага: Нульове генерування високочастотних перешкод. Це забезпечує стабільну роботу мікроінвертора без ризику помилок синхронізації.
8.2. Точність Керування
Завдяки встановленню TOTAL_CYCLES = 160, ми досягаємо високої роздільної здатності:
- Максимальна потужність: 800 W (прогрмується).
- Крок регулювання: 5 W. Кожен крок відповідає вмиканню симістора на одну півхвилю зі 160 (загальний час циклу 1.6 с).
Для захисту мережі від різких стрибків потужності використовується механізм плавного змінення навантаження. Це захищає мікроівертор від зайвих збуджень
- Швидкість: 20 W кожні 100 мс (або 200 W/сек).
- Результат: Різкий стрибок цілі (наприклад, на 600 W) буде "розтягнутий" у часі до 3 секунд, що гарантує стабільність роботи інвертора.
- Система спроектована з пріоритетом на максимальну відмовостійкість. Незважаючи на те, що фізична потужність ТЕНа становить 2000 Вт, програмне обмеження в коді ESP32 (SOLAR_MAX_POWER 800) та налаштуваннях Home Assistant встановлено на позначці 800 Вт, що суворо відповідає номіналу мікроінвертора.
- Використання силового симістора BTA16-600 (розрахованого на 16А) у такому режимі забезпечує роботу навантаження лише на 22-25% від його фізичної спроможності. Це гарантує мінімальне теплове виділення, запобігає деградації напівпровідників та виключає ризик аварійного перевантаження інвертора. Таким чином, досягається високий коефіцієнт надійності, де кожен компонент системи працює з великим запасом міцності
9. НАЛАШТУВАННЯ СЕРВЕРА ХА ЧЕРЕЗ ПАКАДЖ
Переглянути конфігурацію бойлера
10. ВІЗУАЛІЗАЦІЯ ТА МОНІТОРИНГ (APEXCHARTS)
Для контролю роботи системи в реальному часі використовується спеціалізована картка ApexCharts, яка відображає баланс енергії та швидкість реакції ТЕНа.10.1. Налаштування Графіка
Для забезпечення точності відображення та уникнення викривлення історії (особливо при миттєвих перемиканнях потужності) застосовуються такі параметри:- Curve: stepline (для лінії "Ціль"): Використовується для сенсора boiler_target_effective. Це дозволяє бачити чіткі сходинки при зміні команд (наприклад, 800W -> 100W) без діагональних спотворень.
- Curve: smooth (для лінії "Факт"): Відображає реальну роботу програмної рампи на ESP32, демонструючи плавне наростання або спадання потужності ТЕНа.
10.2. Колірна Індикація та Легенда
- Фіолетовий (Area): Загальна сонячна генерація з мікроінвертора.
- Червоний (Line): Ефективна ціль для бойлера. На графіку чітко видно "зазор" у 35W між Сонцем та Ціллю — це енергія, що зарезервована для роботи серверів та будинку.
- Зелений (Line): Фактичне споживання, отримане з розетки бойлера (sensor.bojler_power). В ідеальних умовах ця лінія має максимально наближатися до червоної лінії Цілі.
10.3. Динамічний статус
Заголовок картки автоматично змінює колір та назву залежно від активного режиму:
Заголовок картки автоматично змінює колір та назву залежно від активного режиму:
- РУЧНИЙ РЕЖИМ: Пріоритет налаштувань користувача.
- АВТОМАТИКА (PV): Система працює в режимі Zero Export, підлаштовуючись під сонце.
YAML-код картки візуалізації призначений для створення інтерактивного графічного інтерфейсу в Home Assistant, який дозволяє в реальному часі моніторити баланс енергії між сонцем та бойлером. Реалізація базується на використанні кастомного елемента apexcharts-card , де за допомогою математичних моделей stepline та smooth забезпечується коректне відображення миттєвих команд цілі та плавної роботи фізичної рампи ТЕНа. Для впровадження цієї картки на сервер необхідно перейти в режим редагування дашборду Lovelace, обрати пункт «Додати картку», знайти в списку «Manual» (Ручна картка) та просто вставити нижченаведений код у текстове поле, замінивши стандартний вміст.

Вигляд картки управління потужністю дімера
На малюнку сонце генерує 41 Ват, розрахована потужність це різниця між сонячною генерацією і фоновим сподживанням енергії будинком що подана на дімер бойлера (ціль) 6Ват, факт 0Ват – нульове споживання оскільки бойлер вже нагрітий і спрацювала внутрішня автоматика відключення.
Фонове споживання (інтернет, роутер, комутатори, серверХА, індикація на прилладах що не вимкнені і інші). В прграмі фонове споживання = константа=35Ват, тому ціль=сонце-фон= 41-35=6 Ват
Завантажити конфігурацію картки управління ESP32
Переглянути конфігурацію картки управління ESP32
11. СКЕТЧ УПРАВЛІННЯ ESP32-C3 Supermini solar_dimmer_v10.2.ino
Завантажити sketch-esp32-dimer-ha
Переглянути sketch-esp32-dimer-ha
12. ТЕОРІЯ ВИКОРИСТАННЯ ДЕТЕКТОРА НУЛЯ (ZERO CROSS) ЗА АЛГОРИТМОМ БРЕЗЕНХЕМА
ESP32 використовує зовнішні переривання (External Interrupts) для синхронізації з мережею, і це критично важливо для вашого методу керування.Ось як саме це працює у коді:
1. Детектор нуля (Zero Cross)
Модуль дімера має спеціальний вихід (Zero-Cross), який підключений до одного з пінів ESP32. У скетчі налаштоване переривання на цей пін (через функцію attachInterrupt з параметром RISING).- Кожні 10 мілісекунд (при 50 Гц це півперіод), коли напруга в розетці проходить через нуль, спрацьовує це переривання.
- Це «серцебиття» системи. ESP32 не просто «рахує час», вона чекає фізичного сигналу від мережі, щоб знати, коли починається нова синусоїда.
2. Алгоритм Брезенхема (Пакетне керування)
Саме всередині цього переривання виконується розрахунок: відкривати симістор зараз чи ні?- ESP32 не розраховує час затримки (як у фазовому димері), вона працює з цілими пакетами (циклами).
- Якщо ваша «Ціль» — 400 Вт із 2000 (20%), то алгоритм Брезенхема всередині переривання каже: «Так, зараз пропускаємо 1 повний цикл (2 переривання), а потім 4 цикли (8 переривань) відпочиваємо».
Чому це краще, ніж просто «рахувати час»?
- Точність: Якби ми просто використовували delay() або millis(), час ESP32 міг би трохи «пливти» відносно частоти мережі 50 Гц. Переривання змушує код працювати в ідеальному такті з електромережею.
- Відсутність завад: Оскільки переривання відбувається саме в «нулі», симістор вмикається без іскри і без радіоперешкод (що дуже важливо для вашого мікроінвертора).
- Стабільність: Навіть якщо ESP32 на мить відволікається на обробку MQTT або Wi-Fi, апаратне переривання має найвищий пріоритет і спрацює вчасно.
До речі, саме завдяки цьому ви бачите ті «спалахи щосекунди» на осцилографі — це результат пропуску певної кількості періодів, відрахованих через переривання.
13. Відмова від відповідальності (Disclaimer)
⚠️ УВАГА: Важливе застереження щодо безпеки!Цей посібник носить виключно інформаційний характер і є описом приватного практичного досвіду автора. Весь наведений матеріал, включаючи схеми підключення, програмний код та методику налаштування, надається за принципом «як є» (as is), без будь-яких гарантій щодо працездатності в інших конфігураціях мережі чи безпеки для обладнання третіх осіб.
Оскільки реалізація проєкту передбачає роботу з небезпечною для життя напругою, силовими приладами та втручання в енергосистему будинку, автор не несе жодної відповідальності за будь-які прямі чи опосередковані наслідки, матеріальні збитки, вихід обладнання з ладу або травми, спричинені використанням цієї інформації. Користувач бере на себе всі ризики та повну відповідальність за результати власної діяльності.
Відгуків: 0 / Написати відгук
