Мониторинг потребления энергии по Modbus с MKR WiFi 1010 и RS485
Компоненты и материалы
| Arduino MKR WiFi 1010 | ×1 |
| Arduino MKR 485 Shield | ×1 |
| USB-A — Micro-USB кабель | ×1 |
| Блок питания USB | ×1 |
| Скрученный экранированный кабель (один витая пара) | ×1 |
Необходимые инструменты и станки
| Цифровой мультиметр Digilent Mastech MS8217 |
| Электромонтёрские ножницы |
| Маленькая плоская отвёртка (для клемм MKR485) |
| Средняя крестообразная отвёртка |
Приложения и онлайн-сервисы
| Home Assistant |
| Arduino Web Editor |
| MQTT |
О проекте
Если вы действительно хотите сделать свой дом умнее, начните с ежемесячных счетов (энергия, газ и т.д.). Как говорят: Хорошо для Планеты, Кошелька и Прибыли. Открытое железо — наш путь к устойчивости в домашней среде! Эта идея привела нас к созданию простого и безопасного решения, легко интегрируемого с любым ПО домашней автоматики, так как оно предоставляет данные через MQTT (покажем интеграцию с Home Assistant).
Обзор
Для измерения электроэнергии мы выбрали счётчик Finder Energy Meter, так как он предназначен для DIN-рельсы и идеально вписывается в главный щиток дома. Круто в этом приборе — интерфейс RS485 Modbus, промышленный стандарт протокола связи, который упрощает общение с Arduino. Фактически, Arduino выпустила официальный шилд MKR485 и две библиотеки для декодирования протокола. В качестве основной платы выбрали Arduino MKR WiFi 1010, так как она имеет тот же форм-фактор MKR и Wi-Fi.
Установка
Внимание! Проверьте правила вашей страны по работе с домашней электросистемой и будьте предельно осторожны — это может быть смертельно! Если вы не знаете, как — вызовите электрика.
Первый шаг — установить счётчик в электрощит. Для безопасности отключите питание на входе в вашу систему и дважды проверьте мультиметром, что между клеммами нет напряжения.
Затем установите счётчик энергии в щиток и подключите фазу и ноль от главной автоматической выключателя к входу счётчика, соблюдая цветовое соглашение (синий — ноль, коричневый/чёрный/серый — фаза в ЕС). Выход соедините с остальной системой.

Готово? Пришло время закрепить RS485-соединение! Используем скрученный однопарный кабель с заземлением, обычно применяемый для телефонных линий. С таким кабелем можно передавать данные на большие расстояния (1.2 км). Нам нужен кабель достаточной длины, чтобы выйти из щитка и разместить Arduino в доступном месте.

Интерфейс RS485 имеет клеммы A, B и COM.
Так как MKR Shield поддерживает также полный дуплекс, вы увидите ещё две клеммы Y и Z. Здесь мы закрепим другой конец кабеля, так как из даташита известно, что полудуплексная связь происходит только на Y и Z. Клемма COM должна быть соединена с ISOGND. Поскольку мы используем полудуплексное соединение и кабель типа peer-to-peer, нужно настроить переключатели на MKR485 Shield под нашу схему: устанавливаем HALF (2 на OFF) и терминацию на Y-Z (3 на ON); первый не важен. Терминация — это резистор между двумя линиями данных для гашения помех.

Всё. Теперь можно закрыть щиток и перейти к программной части!
Программное обеспечение
Запустите компьютер и откройте IDE. Можно использовать Arduino IDE или Arduino Create Editor. Код решает три задачи:
- Modbus-коммуникация
- Управление Wi-Fi
- MQTT-протокол
Modbus — открытый протокол для промышленных датчиков и машин. Для общения Arduino с Modbus используем библиотеку Arduino Modbus. Она упаковывает все обработчики и делает подключение любого Modbus-устройства очень быстрым. Поскольку мы читаем регистры, согласно даташиту счётчика, можно найти всю нужную информацию: коды функций, адреса регистров, их размер в словах. Но для ясности объясним, как работает Modbus:
Modbus-сообщения имеют простую структуру:
01 03 04 00 16 00 02 25 C7
0x01— Адрес устройства0x03— Код функции, указывающий, хотим ли мы читать или писать данные (в данном случае — чтение holding registers)0x04— Количество байтов.00 16— 4 байта адреса регистра (00 16), который говорит устройству, что читать00 02— Размер регистра (00 02) в словах (каждое слово — 2 байта)- Последние 4 байта — CRC-код. Он генерируется математической функцией над предыдущими байтами, гарантируя корректность приёма.
В Arduino всё это обрабатывается в условии if:
// Created by Alberto Perro - Officine Innesto
// Чтение целого числа из holding registers modbus-устройства
float readCurrent(){
float ampere = 0.;
// Следующая команда формирует запрос и отправляет его по RS485
if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) {
// Обработка ошибки
Serial.print("failed to read voltage! ");
Serial.println(ModbusRTUClient.lastError());
} else {
uint16_t word1 = ModbusRTUClient.read(); // чтение MSW из буфера
uint16_t word2 = ModbusRTUClient.read(); // чтение LSW из буфера
int32_t milliamp = word1 << 16 | word2; // объединение слов для получения int
ampere = milliamp/1000.0; // перевод в амперы
}
return ampere;
}
В части else — обработчик ответа.
Так как регистр длиной два слова, их нужно объединить побитовой математикой. Читаем слова из буфера в беззнаковое 16-битное целое (2 байта или слово), затем объединяем в знаковое 32-битное: сдвигаем первое слово влево и применяем OR ко второму. Так получаем измерение тока в мА, деля на 1000 — в амперах.
Этот же процесс адаптируется для всего, что мы хотим читать.
Остальной код посвящён MQTT и Wi-Fi сетям.
Интеграция с Home Assistant
Добавление счётчика в Home Assistant довольно просто. Предполагая, что MQTT-брокер настроен (вот руководство), достаточно добавить новые определения в configuration.yaml.
sensor:
- platform: mqtt
name: "Main Voltage"
state_topic: "energy/main/voltage"
unit_of_measurement: "V"
Здесь указываете имя измерения, MQTT-топик для чтения и единицу измерения. Сохраните файл, проверьте конфигурацию и перезагрузите Home Assistant — измерения появятся на главной странице.

Home Assistant сам создаст графики и автоматизирует процессы на основе показаний. Учебник завершён — теперь вы можете добавлять функции и настраивать под свои цели!
Код
Modbus RTU to MQTT bridge для Finder
Этот скетч обеспечивает полный мост между счётчиком энергии Finder и MQTT. Разработан для мониторинга затрат и потребления электроэнергии в Casa Jasmina.
Производственный процесс
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Создание потрясающей системы Ambilight для монитора на Arduino
- Создание надежного монитора энергии и логгера данных на Arduino — пошаговое руководство
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Arduino UNO + WiFi Shield: реальный график температуры в вебе через Serial
- Кинетическая и потенциальная энергия: формулы, формы и бытовые примеры