0р.
Оформить заказДистанционный мониторинг и визуализация данных солнечных контроллеров EPSolar A, LS-B Series
Что получим в итоге
Данная статья в первую очередь будет полезна обладателям популярных солнечных контроллеров EPSolar (Epever) с наличием порта RS485, какие это модели - смотрите фото выше.Выполнив все действия, описанные в этой статье и потратив примерно 150-350 руб. (дешевле всего покупать на Aliexpress по приведенным в статье ссылкам) вы получите достаточно функциональную систему мониторинга своей солнечной электростанции
Из любого браузера вам будут доступны текущие параметры работы, исторические графики, выгрузка в Exel и оповещения на почту при срабатывании настраиваемых триггеров.
Ниже немного фото дефолтной сцены (далее можно настроить под себя)
1. С какими моделями контроллеров EPSolar тестировался мониторинг
Схема успешно используется на нескольких объектах с контроллерами Tracer MPPT 3210A-3240A, в том числе на учебной солнечной станции Новосибирской ГЭС, посмотреть данные в реальном времени: http://open-monitoring.online/public/scene/279Так же есть действующие системы на базе контроллеров Epsolar LS 2024B-3024B, например мониторинг моего солнечного коллектора, ссылка на сцену: http://open-monitoring.online/public/scene/240
С другими моделями система не тестировалась, но в теории работать должна со всеми, поддерживающими выносную панель MT-50 (не путать с MT-5 - там другой интерфейс!!!!)
2. Что понадобится для сборки, аппаратная часть
Для сборки мониторинга нам понадобится всего три детали:1. Контроллер Wemos D1 Mini Купить на Aliexpress (130 руб. на момент написания)
Вы можете применить и другие платы на основе ESP8266, но я рекомендую именно эту, за ее компактность, цену, возможность прошивки по microUSB и наличие двойного питания (5В и 3,3В) - это все что нам нужно и ничего лишнего
2. Модуль преобразователя интерфейсов UART TTL – RS-485 (на MAX485) Купить на Aliexpress (30 руб. на момент написания)
3. Патч-корд любой длины либо кусок витой пары обжатый с одной стороны коннектором RJ-45
После перехода на WiFi, я думаю у каждого дома такой можно найти в кладовке ну либо обратится к знакомому сисадмину. Совсем на крайний случай зайти в ближайший компьютерный магазин.
3. Схема
Схема очень простая, но я бы посоветовал пропаять все соединения, иначе потом можно промучиться с отладкой, а проблема банально в контакте...Обратите внимание, что выводы преобразователя интерфейсов RE и DE - объединены, распиновка rj-45 ниже
Соединив выводы по схеме, Wemos D1 Mini подключаем к компьютеру а коннектор rJ-45 к солнечному контроллеру.
На этом с аппаратной частью закончили, ниже немного поговорим о протоколе обмена и какие данные можно получить из контроллера
4. Протокол обмена данными с контроллером EPSolar
Связь с внешним миром контроллеры осуществляют при помощи распространенного промышленного протокола Modbus, именно по нему контроллер обменивается данными с выносной панелью МТ-50. Стоит заметить, что встроенный ЖК экран контроллера, показывает только малую долю доступной для считывания по протоколу информации, подстегивая тем самым к покупке дополнительных аксессуаровОписание протокола с картой регистров привожу по ссылке: Протокол EPSolar Modbus
Желтым отмечены те параметры, которые как мне кажется являются самыми ценными и именно их мы будим отправлять в облако. Если кому-то понадобятся еще какие-то, немного разобравшись со скетчем, добавить другие параметры не составит особого труда, тем более, что резерв по переменным будет заложен.
Благодаря тому, что в автоматизации Modbus очень распространен, для платформ Arduino и ESP8266 давно написаны готовые библиотеки, поэтому мы не будем особо вдаваться в специфику протокола, а просто воспользуемся одной из таких библиотек
Как установить библиотеку в Arduino IDE - читайте здесь
5. Сцена
О том как регистрироваться в сервисе open-monitoring.online и импортировать в него готовую сцену, я уже подробно описывал в предыдущей статьеУ кого еще нет аккаунта в сервисе, воспользовавшись ссылкой выше, вы с легкостью это сделаете (на сегодняшний день наблюдаются проблемы с отправкой писем активации на ящики Gmail.com, поэтому лучше использовать почту mail.ru или Яндекс)
Ссылка на скачивание конфигурации сцены: open_monitoring_epsolar_V1.controller
6. Скетч
Ссылка на скачивание архива: OpenMonitoring_EPSolar_RS485_Ver_2 (Обновлено 01.12.2023) - исправлена ошибка отображения отрицательной температуры контроллера.Скетч для удобства разбит на 4 файла:
1. Monitoring_EPSolar_RS485_Ver_X.ino - основной, объявление переменных, настройки облака, инициализация и главный цикл;
2. Histogram.ino - функция для построения гистограммы по выработке энергии;
3. data_send.ino - функция сборки и отправки строки GET-запроса;
4. request_param.ino - функция опроса солнечного контроллера.
Код основной части
// Строки требующие редактирования в комментариях отмечены (!) #include <ESP8266WiFi.h> // Стандартная библиотека в пакете #include <SoftwareSerial.h> // Стандартная библиотека в пакете #include <ModbusMaster.h> // Скачать библиотеку https://github.com/4-20ma/ModbusMaster #define FIRMWARE_VER 1 // Версия //*-- Настройки точки доступа const char* ssid = "XXXX"; // Название точки доступа (!) const char* password = "XXXX"; // Пароль (!) //*-- Параметры полученные при регистрации на http://open-monitoring.online const char* host = "open-monitoring.online"; // Адрес сервера (не менять) const char* streamId = "XXX"; // ID (!) const char* privateKey = "XXXXXX"; // Код доступа (!) unsigned long send_interval = 61000; // Периодичность отправки пакетов на сервер (не менее 60 сек) unsigned long request_interval = 15000; // Периодичность опроса контроллера, желат. 3-4 опроса между отправками unsigned long previousMillis = 0; unsigned long requestMillis = 0; float previousEnergy; #define MAX485_DE 4 // Пины для подключения RE и DE (4 - для платы ОМ) #define MAX485_RE_NEG 4 #define RX_PIN 0 // Rx - программного порта #define TX_PIN 5 // Tx - программного порта SoftwareSerial softSerial; // instantiate ModbusMaster object ModbusMaster node; // Переменные физ. величин контроллера // 1 2 3 4 5 6 7 9 10 11 12-15 - резерв float pv_V, pv_I, batt_V, batt_I, load_U, load_I, batt_T, EnergyToday, EnergyTotal, deltaEnergy; // 8 int batt_SOC; // 16 17 19-20 резерв String batt_Status, ch_Status; uint8_t result; uint16_t data[6]; boolean flag_1Send = true; // Флаг первой посылки boolean flag_TotEn = false; // Флаг получения значения полной энергии boolean flag_startEn = true; // Флаг начального значения энергии boolean LedStatus = false; // флаг светодиода boolean dataTrade = false; // флаг состояния обмена данными //*---------------- INICIALIZATION ------------------*// void setup() { pinMode(MAX485_RE_NEG, OUTPUT); pinMode(MAX485_DE, OUTPUT); pinMode(2, OUTPUT); // Init in receive mode digitalWrite(MAX485_RE_NEG, 0); digitalWrite(MAX485_DE, 0); Serial.begin(115200); softSerial.begin(115200, SWSERIAL_8N1, RX_PIN, TX_PIN, false, 32, 192); softSerial.enableIntTx(false); delay(10); Serial.println(""); Serial.println(""); Serial.print("Версия ПО: "); Serial.println(FIRMWARE_VER); // Адрес контроллера в сети ModBus (по-умолчанию - 1) node.begin(1, softSerial); // Callbacks allow us to configure the RS485 transceiver correctly node.preTransmission(preTransmission); node.postTransmission(postTransmission); // Подключение к сети WiFi Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); digitalWrite(2, LedStatus); LedStatus = !LedStatus; // Мигаем каждые 0,5 сек пока идет подключение к сети WiFi Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } //*------------------ MAIN CYCLE --------------------*// void loop() { if ( millis() - requestMillis >= request_interval || flag_1Send == true) { requestMillis = millis(); if ( dataTrade == true ) { digitalWrite(2, false); // Если связь есть - зажигаем светодиод на время запроса в солн. контроллер } else { digitalWrite(2, true); // Если связи нет - не мигаем } tracer_data_request(); // Запрос текущих параметров контроллера digitalWrite(2, true); } if ( millis() - previousMillis >= send_interval || flag_1Send == true ) { previousMillis = millis(); if (flag_1Send) { flag_1Send = false; // Снимаем флаг первой отправки } data_send(); // Отправка данных на сервер } yield(); }
Заключение
До новых встреч, всем спасибо за внимание!
24.07.2020 08:14:33
Комментарии: 6
Просмотры: 4539
Комментарии