Измеритель мощности с WiFi, цветным дисплеем и логгером на базе PZEM-004T

601Не так давно я обозревал модуль 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ммhtb1rdmupvxxxxbfxfxxq6xxfxxxw

100

В комплекте идет сам модуль и трансформатор тока

101

Сердце модуля — микросхема SD3004 от китайской компании SDIC Microelectronics Co., Ltd предназначенная для измерения электроэнергии.

102

Кроме того на плате видна микросхема EEPROM Atmel 24C02C на 256 байт с миллионом циклов записи и две оптопары PC817, обеспечивающих гальваническую развязку последовательного интерфейса.

103

Так же на плате есть не распаянный разъем для подключения LED или LCD (судя по описанию микросхемы SD3004)

105

В интернете я нашел описание модуля PZEM-004T в котором есть схема подключения и протокола обмена с компьютером.

htb1vlkrpvxxxxcpxfxxq6xxfxxxr

Протокол обмена по UART довольно примитивный, кроме того можно найти готовые ардуиновские библиотеки, работающие как с аппаратным, так и по программным последовательным интерфейсом.

Для теста модуля использовал Arduino Mega 2560 имеющего три аппаратных последовательных шины.

Цепляю RX и TX к 18 и 19 выводам, соответствующим интерфейсу Serial1, чтобы в Serial0 выводить отладочную информацию.

202

Трансформатор тока надеваю на провод, идущий к розетке

201

Подключаю розетку к сети

203

Загрузил скетч примера к библиотеке

На экране видны показатели напряжения, тока, мощности и потребленной электроэнергии

294

Показания совпадают с моим прибором VC97 до 3-го знака. Модуль без проблем мерит зарядники с телефоном мощностью около 5Вт.

Прибор, кроме самого PZEM-004, будет состоять из
Модуля ESP826612F
Цветного TFT дисплея 240×320 на контроллере ILI9341
Миниатюрного блока питания на 5В
Ну и небольшого количества навесных деталек, корпуса и материалов, которые обычно есть в наличии у уважающего себя радиолюбителя. Общий бюджет вышел в пределах $20 (цены могли немного измениться с момента покупки)
Схема прибора

cxema

Изготавливаем это все в железе

302 309 404

Прошивка

Для работы дисплея выбирал между библиотекой 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-интерфейс

Работающий прибор выглядит так

602

600

Веб интерфейс

web-1

Страничка настроек

web-3

Файл с данными

web-2

Время записано в формате UNIX STAMP и без проблем преобразуется в EXCEL
по формуле =CELL/(60*60*24)+«1/1/1970»

%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d1%8c

Показание электроэнергии, как и в нормальных электросчетчиках, записывается в энергонезависимую память. Для сброса нужно удержать на 5 сек кнопку на плате, а затем коротко нажать еще один раз.

Подведем итог

Модуль полностью оправдал мои ожидания.
Прибор соответствует поставленным требованиям, и имеет большие возможности по доработке.

Трудности, с которыми столкнулся — малой количество информации, очень поверхностные даташиты. Этим грешат многие китайские приборы.
Например, следующая версия будет без экрана, но с возможностью передачи информации на MQTT сервер.

На этом хочу откланяться

c1

Вы можете оставить отзыв или трекбек со своего сайта.

53 комментария на «Измеритель мощности с WiFi, цветным дисплеем и логгером на базе PZEM-004T»

  1. Виктор:

    ОЧень толковая статья. Наверное, одна из лучших, что я видел по этой теме.
    Интересно было бы развитие этой темы в сторону построения трехфазного измерителя и, как второе направление, удаленный мониторинг. Хотелось бы отслеживать электропараметры по трем фазам на расстоянии из другого города, например через облачные сервера.

  2. Виктор:

    Алексей, а когда появится следующая версия. про которую вы писали?
    И для меня, начинающего, как вы прошивали ESP826612F?

  3. Виктор:

    А в страничке настроек для чего Cjntroller auth и Password?

  4. Андрей:

    Добрый день, а пароль какой ? при авторизации

  5. Rosen Vladimirov:

    #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();
    }

  6. jeffferson:

    Доброе утро, я хотел бы увидеть этот проект в MQTT

  7. Max:

    Привет!
    Наконец решил и я подключить PZEM-004T к ESPшке спустя полгода после прочтения статьи. И появился вопрос: на схеме указан блок питания 5В, но на фото видно 3.3В. Как все-таки правильно подключать ESP в данной связке? Не дает ли PZEM-004T сам 5В, которые можно использовать для питания контроллера?

  8. Может кто знает, SD3004 4х квадрантная?
    Как ведет себя модуль, если фаза тока находится в диапазоне 90 — 270 градусов к фазе напряжения?
    Выдает отрицательные значения мощности?
    Выдает положительные значения мощности?
    Выдает нулевое значение мощности?

    • Сам спросил, сам отвечу 🙂
      Она четырехквадрантная, только тщательно это скрывает.
      Мощность всегда положительна и единственным признаком «переполюсовки» является высокий уровень на 51м выводе REVP, который в PZEM-004 не распаян.

  9. Yuri:

    Здравствуйте!
    Очень понравился Ваш проект. Повторил, всё работает, но есть один неясный момент. Если в памяти записано несколько log файлов (скажем 5шт), то после выключения/включения питания ESP8266-07 не стартует запись очередного лога.
    После старта на индикаторе появляется номер нового лога (если до перезапуска был
    № 5, то появляется №6), но в скобках, после txt постоянно стоит ноль, а значение rec меняется. Запустить запись удаётся лишь после выполнения delite all.

  10. Александр:

    Как приобрести печатную плату или хотя-бы чертеж?

  11. Вадим:

    измеритель мощности — неплохая идея.
    однако этот измеритель мощности стал бы гораздо-гораздо лучше, если бы он умел не только отправлять данные на сервер, но и отключать нагрузку от питания при соблюдении заданных на сервере условий.

    например, отключать менее приоритетную нагрузку, для поддержания нагрузки с высшим приоритетом.

    для чего, соответственно понадобится несколько таких измерителей вместе с установленными реле, и серверная программа, которая принимает заданный пользователем общий критический уровень мощности, или предел мощности в заданном участке.

    а какой вообще, иначе, смысл измерять можность контроллером если ничего не.будешь делать с этими данными этим же контроллером?

    а вообще- интересно, добавил ваш сайт в закладки.

    • Alexey:

      Ну данный контроллер был сделан под конкретную задачу и активно используется до сих пор, решая ее
      Добавить управление нагрузкой, управление по MQTT и прочие функции — задача совсем не сложная

  12. Никита:

    Алексей, а какой алгоритм, когда устройство становится Аксес Поинтом?
    Ведь если вы сделаете что при запуске оно пытается соединиться с роутером, и если не получается — то встаёт как АР, тогда после любой кратковременной пропажи электричества, ваше устройство не подключится к роутеру (потому что роутеру на старт нужно около минуты) и будет всегда вставать как АР. Это же не правильно.
    Но и по таймеру (скажем каждые 10 секунд) пытаться подключиться к роутеру вы не можете, ведь если в этот момент пользователь зашёл чтобы изменить настройки — то соединение будет разорвано. Устройство ведь не может отновременно быть AP и подключаться к роутеру.

    • Alexey:

      В последних разработках ESP8266 и ESP32 я использую сейчас для соединения кнопку (обычно на GPIO0) — длинное нажатие, уходит в режим точки доступа в независимости от текущего подключения
      Дополнительно можно включать WiFi.setAutoConnect(true); что позволяет настроить WiFi через приложение на смартфоне

  13. Алексей!Залил скетч,
    #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 путём ежемесячного обхода всех участков. При необходимости ограничивать неплательщиков в потреблении.
    За работоспособную документацию для дилетанта с руками готов заплатить.

  14. Извиняюсь! Первая строка скетча выглядит так: #include

  15. 1) TX -> RX
    RX -> TX

    2) Ну и про перепаивание резистора не забывать. 3.3В логического уровня ESP-шки недостаточно для PZEM-004

    С пунктом 1) благополучно справился (юмор).
    Как согласовать уровни ESP-шки и PZEM-004 и какой резистор перепаять?

  16. Андрей:

    Здравствуйте Алексей. не подскажите с чем связана такая ошибка?

    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’)

  17. Андрей:

    // Получаем статический IP если нужно
    if( NetConfig.IP ){

    вот в этой строчке сделал так и загрузилось. убрал != 0

  18. Андрей:

    и еще на ввод пароля admin выдает bad password

  19. Андрей Спасибо за оперативный ответ!
    Мне очень хочется применить в этом проекте модуль:
    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.

  20. Егор:

    Здравствуйте, Алексей. Пытаюсь собрать этот измеритель мощности. Подскажите, что может быть не так?
    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 еще не подключал экран и плату измерителя?

  21. Никита:

    Алексей, здравствуйте, при попытке воспроизвести Ваше устройство столкнулся с проблемой. Pzem-004t v1.0 и Pzem-004t v3.0 имеют разные адреса данных. Не направите на путь истинный где взять нужные библиотеки или как исправить существующие?

  22. Получилось долго все коннектит)) но есть ещё вопрос , можно ли сделать файл excel вместо txt

    • Alexey:

      Формат книги Excel слишком сложен для микроконтроллера
      С другой стороны, Excel отлично понимает текстовые файлы с разделителями полей

  23. Сейчас просит пороль и он не подходит находится в режиме синхронизации

  24. Добрый день! Подскажите, как организовано
    Обновление показаний с ваттметра на сервере,не могу понять как перенаправить командой на корневой адрес сервера ?

  25. Игорь:

    В данной версии измерителя мощности можно не подключать дисплей, а использовать только Вэб интерфейс?

  26. Andrey:

    Алексей, собрал ваше устройство.Пока без PZEM и индикатора (едут с Али).Очень долго грузятся странички по Web.Я что-то неправильно делаю?

Ваш отзыв

Вы должны войти, чтобы оставлять комментарии.