Не так давно я обозревал модуль Sonoff POW, который позволяет измерять потребление электроэнергии и выдавать данные по WiFi.
Сильно не понравилось отсутствие хоть какого то индикатора, низкий функционал, а так же отсутствие гальванической развязки от сети 220, что может приводить к плачевным результатам.
В конце концов приобрел готовую плату PZEM-004T с целью сборки измерителя мощности самостоятельно.
Требования к измерителю мощности:
- Гальваническая развязка при измерении тока сети 220В
- Информативный дисплей
- Беспроводной подключение к компьютеру
- Возможность сохранения измерения с последующим просмотром или копированием на компьютер.
- Точность не менее 5%
Выбор мой пал на модуль PZEM-004T в виде отдельной платы.
Характеристики модуля
- Измерение текущего напряжение сети переменного тока 80-260В
- Измерение тока 0 — 100А
- Измерение активной мощности 0 — 22КВт
- Измерение потребленной электроэнергии
- Точность измерения 1%
- Рабочая частота 45-65Гц
- Последовательный интерфейс UART со скоростью 9600
- Напряжение питания 5В
- Возможность подключения LCD или LED дисплеев
Размер платы 31×74мм, диаметр катушки трансформатора тока 33мм
В комплекте идет сам модуль и трансформатор тока
Сердце модуля — микросхема SD3004 от китайской компании SDIC Microelectronics Co., Ltd предназначенная для измерения электроэнергии.
Кроме того на плате видна микросхема EEPROM Atmel 24C02C на 256 байт с миллионом циклов записи и две оптопары PC817, обеспечивающих гальваническую развязку последовательного интерфейса.
Так же на плате есть не распаянный разъем для подключения LED или LCD (судя по описанию микросхемы SD3004)
В интернете я нашел описание модуля PZEM-004T в котором есть схема подключения и протокола обмена с компьютером.
Протокол обмена по UART довольно примитивный, кроме того можно найти готовые ардуиновские библиотеки, работающие как с аппаратным, так и по программным последовательным интерфейсом.
Для теста модуля использовал Arduino Mega 2560 имеющего три аппаратных последовательных шины.
Цепляю RX и TX к 18 и 19 выводам, соответствующим интерфейсу Serial1, чтобы в Serial0 выводить отладочную информацию.
Трансформатор тока надеваю на провод, идущий к розетке
Подключаю розетку к сети
Загрузил скетч примера к библиотеке
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <SoftwareSerial.h> // Arduino IDE <1.6.6 #include "PZEM004T.h" PZEM004T pzem(&Serial1); IPAddress ip(192,168,1,1); void setup() { Serial.begin(115200); pzem.setAddress(ip); } void loop() { float v = pzem.voltage(ip); if (v < 0.0) v = 0.0; Serial.print(v);Serial.print("V; "); float i = pzem.current(ip); if(i >= 0.0){ Serial.print(i);Serial.print("A; "); } float p = pzem.power(ip); if(p >= 0.0){ Serial.print(p);Serial.print("W; "); } float e = pzem.energy(ip); if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); } Serial.println(); delay(1000); } |
На экране видны показатели напряжения, тока, мощности и потребленной электроэнергии
Показания совпадают с моим прибором VC97 до 3-го знака. Модуль без проблем мерит зарядники с телефоном мощностью около 5Вт.
Прибор, кроме самого PZEM-004, будет состоять из
Модуля ESP826612F
Цветного TFT дисплея 240×320 на контроллере ILI9341
Миниатюрного блока питания на 5В
Ну и небольшого количества навесных деталек, корпуса и материалов, которые обычно есть в наличии у уважающего себя радиолюбителя. Общий бюджет вышел в пределах $20 (цены могли немного измениться с момента покупки)
Схема прибора
Изготавливаем это все в железе
Прошивка
Для работы дисплея выбирал между библиотекой UTFT и Adafruit GFX. Выбрал вторую из за больших возможностей и скорости работы.
Из библиотеки PZEM-004 выкинул поддержку SoftwareSerial, так как из за нее не хотела собираться под ESP8266
Прошивку с правлеными библиотеками выложил на GITHUB
Возможности прошивки:
- Измерение напряжения 80-260В, тока 0-100А, мощности 0-22кВт и потребленной электроэнергии
- Выдача мгновенных показателей на экран (обновление 1 сек)
- Выдача мгновенных показателей в WEB-интерфейс
- Построение графика мощности (150 значений по 2 сек)
- Сохранение всех показателей в журнал (файл) во внутренней памяти EEPROM с настраиваемой дискретностью
- Просмотр, скачивание и удаление журналов
- Синхронизация времени по NTP и привязка значения в журнале к времени
- Сохранение в файл внеочередного значения показателей с маркировкой по нажатию кнопки
- Приостановка и возобновление записи в журнал через WEB-интерфейс или по длительному нажатию кнопки
- Настройка параметров сети через WEB-интерфейс и сохранение конфигурации в EEPROM ESP8266
- Обновление прошивки через WEB-интерфейс
Работающий прибор выглядит так
Веб интерфейс
Страничка настроек
Файл с данными
Время записано в формате UNIX STAMP и без проблем преобразуется в EXCEL
по формуле =CELL/(60*60*24)+«1/1/1970»
Показание электроэнергии, как и в нормальных электросчетчиках, записывается в энергонезависимую память. Для сброса нужно удержать на 5 сек кнопку на плате, а затем коротко нажать еще один раз.
Подведем итог
Модуль полностью оправдал мои ожидания.
Прибор соответствует поставленным требованиям, и имеет большие возможности по доработке.
Трудности, с которыми столкнулся — малой количество информации, очень поверхностные даташиты. Этим грешат многие китайские приборы.
Например, следующая версия будет без экрана, но с возможностью передачи информации на MQTT сервер.
На этом хочу откланяться
ОЧень толковая статья. Наверное, одна из лучших, что я видел по этой теме.
Интересно было бы развитие этой темы в сторону построения трехфазного измерителя и, как второе направление, удаленный мониторинг. Хотелось бы отслеживать электропараметры по трем фазам на расстоянии из другого города, например через облачные сервера.
По первой теме вполне можно подключить к свободным выводам ESP три датчика через SoftSeral интерфейс
Второе без проблем решается с протоколом HTTP или MQTT, но нужен сервер
по трех фазному измерителю.
вы пишите к esp подключить три датчика — это еще pzem? или можно одним обойтись?
Да. Три PZEM к трем SoftSerial интерфейсам (или к двум Softserial и одному аппаратному)
Алексей, а когда появится следующая версия. про которую вы писали?
И для меня, начинающего, как вы прошивали ESP826612F?
Пока старая версия полностью устраивает
Программировал я ESP как в этой статье
А в страничке настроек для чего Cjntroller auth и Password?
В основном от других проектов, чтобы код не переписывать.
Настраивается только при авторизованном входе
Добрый день, а пароль какой ? при авторизации
admin
#include
#include «PZEM004T.h»
const int MEASURE_INTERVAL = 300;
unsigned long lastMeasureSent = 0;
float u1=0.0,i1=0.0,p1=0.0,e1=0.0;
float p_max = 0, p_min = 99999999;
float u_avg=0.0,i_avg=0.0,p_avg=0.0;
int u_count=0,i_count=0,p_count=0;
PZEM004T pzem(&Serial);
IPAddress ip(192,168,1,1);
HomieNode electrometerNode(«measure», «measure»);
void readMeasure(){
// Опрос показаний ЭЭ
float u2,i2,p2,e2;
for( int i=0; i= 0 ){u1 = u2; u_avg+=u1; u_count++; break; }
}
for( int i=0; i= 0 ){i1 = i2; i_avg+=i1; i_count++; break; }
}
for( int i=0; i= 0 ){p1 = p2; p_avg+=p1; p_count++; break; }
}
for( int i=0; i= 0 ){e1 = e2; break; }
}
}
void setupHandler() {
electrometerNode.setProperty(«voltage»).send(«V»);
electrometerNode.setProperty(«current»).send(«A»);
electrometerNode.setProperty(«power»).send(«W»);
electrometerNode.setProperty(«energy»).send(«W/h»);
}
void loopHandler() {
if (millis() — lastMeasureSent >= MEASURE_INTERVAL * 1000UL || lastMeasureSent == 0) {
electrometerNode.setProperty(«voltage»).send(String(u1));
electrometerNode.setProperty(«current»).send(String(i1));
electrometerNode.setProperty(«power»).send(String(p1));
electrometerNode.setProperty(«energy»).send(String(e1));
lastMeasureSent = millis();
}
}
void setup() {
Homie_setFirmware(«PZEM004T-meter», «1.0.0»);
Homie.setSetupFunction(setupHandler).setLoopFunction(loopHandler);
electrometerNode.advertise(«voltage»);
electrometerNode.advertise(«current»);
electrometerNode.advertise(«power»);
electrometerNode.advertise(«energy»);
Homie.setup();
}
void loop() {
Homie.loop();
}
Homie-esp8266-2.0.0 для mqtt
Доброе утро, я хотел бы увидеть этот проект в MQTT
Будет скоро стационарный с MQTT (а может и без него, но с интеграцией в domoticz)
https://github.com/rosenvladimirov/ESP_PZEM-004T
This is great stuff, i love it.
Default password can be changed ?
i mean «admin» can be changed?
Привет!
Наконец решил и я подключить PZEM-004T к ESPшке спустя полгода после прочтения статьи. И появился вопрос: на схеме указан блок питания 5В, но на фото видно 3.3В. Как все-таки правильно подключать ESP в данной связке? Не дает ли PZEM-004T сам 5В, которые можно использовать для питания контроллера?
Может кто знает, SD3004 4х квадрантная?
Как ведет себя модуль, если фаза тока находится в диапазоне 90 — 270 градусов к фазе напряжения?
Выдает отрицательные значения мощности?
Выдает положительные значения мощности?
Выдает нулевое значение мощности?
Сам спросил, сам отвечу 🙂
Она четырехквадрантная, только тщательно это скрывает.
Мощность всегда положительна и единственным признаком «переполюсовки» является высокий уровень на 51м выводе REVP, который в PZEM-004 не распаян.
Здравствуйте!
Очень понравился Ваш проект. Повторил, всё работает, но есть один неясный момент. Если в памяти записано несколько log файлов (скажем 5шт), то после выключения/включения питания ESP8266-07 не стартует запись очередного лога.
После старта на индикаторе появляется номер нового лога (если до перезапуска был
№ 5, то появляется №6), но в скобках, после txt постоянно стоит ноль, а значение rec меняется. Запустить запись удаётся лишь после выполнения delite all.
На ESP07 мало памяти. На SPIFS практически не остается. Возьмите ESP07S или ESP12
Как приобрести печатную плату или хотя-бы чертеж?
https://github.com/samopal-pro/PowerMeter
измеритель мощности — неплохая идея.
однако этот измеритель мощности стал бы гораздо-гораздо лучше, если бы он умел не только отправлять данные на сервер, но и отключать нагрузку от питания при соблюдении заданных на сервере условий.
например, отключать менее приоритетную нагрузку, для поддержания нагрузки с высшим приоритетом.
для чего, соответственно понадобится несколько таких измерителей вместе с установленными реле, и серверная программа, которая принимает заданный пользователем общий критический уровень мощности, или предел мощности в заданном участке.
а какой вообще, иначе, смысл измерять можность контроллером если ничего не.будешь делать с этими данными этим же контроллером?
а вообще- интересно, добавил ваш сайт в закладки.
Ну данный контроллер был сделан под конкретную задачу и активно используется до сих пор, решая ее
Добавить управление нагрузкой, управление по MQTT и прочие функции — задача совсем не сложная
Алексей, а какой алгоритм, когда устройство становится Аксес Поинтом?
Ведь если вы сделаете что при запуске оно пытается соединиться с роутером, и если не получается — то встаёт как АР, тогда после любой кратковременной пропажи электричества, ваше устройство не подключится к роутеру (потому что роутеру на старт нужно около минуты) и будет всегда вставать как АР. Это же не правильно.
Но и по таймеру (скажем каждые 10 секунд) пытаться подключиться к роутеру вы не можете, ведь если в этот момент пользователь зашёл чтобы изменить настройки — то соединение будет разорвано. Устройство ведь не может отновременно быть AP и подключаться к роутеру.
В последних разработках ESP8266 и ESP32 я использую сейчас для соединения кнопку (обычно на GPIO0) — длинное нажатие, уходит в режим точки доступа в независимости от текущего подключения
Дополнительно можно включать WiFi.setAutoConnect(true); что позволяет настроить WiFi через приложение на смартфоне
Алексей!Залил скетч,
#include // Arduino IDE <1.6.6.
#include "PZEM004T.h"
PZEM004T pzem(&Serial1);
IPAddress ip(192,168,1,1);
void setup() {
Serial.begin(115200);
pzem.setAddress(ip);
}
void loop() {
float v = pzem.voltage(ip);
if (v = 0.0){ Serial.print(i);Serial.print(«A; «); }
float p = pzem.power(ip);
if(p >= 0.0){ Serial.print(p);Serial.print(«W; «); }
float e = pzem.energy(ip);
if(e >= 0.0){ Serial.print(e);Serial.print(«Wh; «); }
Serial.println();
delay(1000);
}
работаю в среде «Arduino IDE 1.8.7 (это критично?).
Пытаюсь реализовать на:
ESP8266 ESP-12 ESP12 wemos D1 мини-модуль wemos D1 Мини Wi-Fi развитию Micro USB 3,3 В на основе ESP-8266EX 11 цифровой Pin
Соединяю контакты PZEM-004T «Tx» и «Rx» с контактами ESP-12 Tx и Rxc соответственно.
На мониторе имею бесконечное «0.00V;» НЕ ПОЙМУ В ЧЕМ ДЕЛО?
В планах сделать дистанционный мониторинг и накопление эл.данных в СНТ по WiFi путём ежемесячного обхода всех участков. При необходимости ограничивать неплательщиков в потреблении.
За работоспособную документацию для дилетанта с руками готов заплатить.
TX -> RX
RX -> TX
Ну и про перепаивание резистора не забывать. 3.3В логического уровня ESP-шки недостаточно для PZEM-004
Извиняюсь! Первая строка скетча выглядит так: #include
«#include «
1) TX -> RX
RX -> TX
2) Ну и про перепаивание резистора не забывать. 3.3В логического уровня ESP-шки недостаточно для PZEM-004
С пунктом 1) благополучно справился (юмор).
Как согласовать уровни ESP-шки и PZEM-004 и какой резистор перепаять?
https://wifi-iot.com/p/wiki/15/ru/
Здравствуйте Алексей. не подскажите с чем связана такая ошибка?
sketch\WC_HTTP.cpp: In function ‘void WiFi_begin()’:
WC_HTTP.cpp:44:24: error: ambiguous overload for ‘operator!=’ (operand types are ‘IPAddress’ and ‘int’)
if( NetConfig.IP != 0 ){
^
sketch\WC_HTTP.cpp:44:24: note: candidates are:
sketch\WC_HTTP.cpp:44:24: note: operator!=(uint32_t {aka unsigned int}, int)
sketch\WC_HTTP.cpp:44:24: note: operator!=(const ip_addr_t* {aka const ip4_addr*}, const ip_addr_t* {aka const ip4_addr*})
sketch\WC_HTTP.cpp:44:24: note: operator!=(ip_addr_t* {aka ip4_addr*}, ip_addr_t* {aka ip4_addr*})
In file included from C:\Users\Acer\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\ESP8266WiFi\src/ESP8266WiFi.h:31:0,
from sketch\WC_HTTP.h:9,
from sketch\WC_HTTP.cpp:7:
C:\Users\Acer\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/IPAddress.h:101:14: note: bool IPAddress::operator!=(const IPAddress&) const
bool operator!=(const IPAddress& addr) const {
^
C:\Users\Acer\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/IPAddress.h:110:14: note: bool IPAddress::operator!=(uint32_t) const
bool operator!=(uint32_t addr) const {
^
C:\Users\Acer\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.5.0-beta2\cores\esp8266/IPAddress.h:113:14: note: bool IPAddress::operator!=(u32_t) const
bool operator!=(u32_t addr) const {
^
exit status 1
ambiguous overload for ‘operator!=’ (operand types are ‘IPAddress’ and ‘int’)
// Получаем статический IP если нужно
if( NetConfig.IP ){
вот в этой строчке сделал так и загрузилось. убрал != 0
и еще на ввод пароля admin выдает bad password
Андрей Спасибо за оперативный ответ!
Мне очень хочется применить в этом проекте модуль:
https://ru.aliexpress.com/item/D1-mini-V2-Mini-NodeMcu-4M-bytes-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266/32688079351.html?spm=2114.13010708.0.0.3a9933ed2uguXd
т.к. в нем сосредоточены все опции которые необходимы. Один вопрос, как запитать его 3,5Вт в боевом режиме т.е. не через UART.
Извиняюсь! Конечно спасибо Алексею.
Здравствуйте, Алексей. Пытаюсь собрать этот измеритель мощности. Подскажите, что может быть не так?
1. Очень медленная загрузка страницы — около 1-2 минут.
2. Пытаюсь подключиться в ардуино 1.8.8 (прошиваю тоже через него) через монитор порта к ESP — подключение проходит только на скорости 74880. выводит такой текст
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v04c11db7
~ld
а дальше идут кракозябры. На других скоростях только кракозябры.
Это может быть из-за того, что я к ESP еще не подключал экран и плату измерителя?
Очень похоже на стоковую прошивку некоторых модулей (эта странная скорость)
Может не прошилось через Arduino IDE ?
Алексей, здравствуйте, при попытке воспроизвести Ваше устройство столкнулся с проблемой. Pzem-004t v1.0 и Pzem-004t v3.0 имеют разные адреса данных. Не направите на путь истинный где взять нужные библиотеки или как исправить существующие?
Добрый день
В отпуске был. На море. На Белом )))
Pzem v3.0 нету в наличии попробовать. Я думаю, достаточно библиотеку заменить, например на эту:
https://github.com/mandulaj/PZEM-004T-v30
Здравствуйте ,повторил ваш проект, сделал синхронизации времени,теперь не могу зайти в веб интерфейс кнопка не работает,
Получилось долго все коннектит)) но есть ещё вопрос , можно ли сделать файл excel вместо txt
Формат книги Excel слишком сложен для микроконтроллера
С другой стороны, Excel отлично понимает текстовые файлы с разделителями полей
Сейчас просит пороль и он не подходит находится в режиме синхронизации
Добрый день! Подскажите, как организовано
Обновление показаний с ваттметра на сервере,не могу понять как перенаправить командой на корневой адрес сервера ?
В данной версии измерителя мощности можно не подключать дисплей, а использовать только Вэб интерфейс?
Да. Можно. Только он график не рисует в WEB-интерфейсе, а выдает текущие значения.
Алексей, собрал ваше устройство.Пока без PZEM и индикатора (едут с Али).Очень долго грузятся странички по Web.Я что-то неправильно делаю?
Через шлюз