Измеритель мощности с 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

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

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

  1. Виктор:

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

    • Alexey Alexey:

      По первой теме вполне можно подключить к свободным выводам ESP три датчика через SoftSeral интерфейс

      Второе без проблем решается с протоколом HTTP или MQTT, но нужен сервер

      • Александр:

        по трех фазному измерителю.
        вы пишите к esp подключить три датчика — это еще pzem? или можно одним обойтись?

        • Alexey Alexey:

          Да. Три PZEM к трем SoftSerial интерфейсам (или к двум Softserial и одному аппаратному)

  2. Виктор:

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

  3. Виктор:

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

    • Alexey Alexey:

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

  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

    • Alexey Alexey:

      Будет скоро стационарный с MQTT (а может и без него, но с интеграцией в domoticz)

  7. This is great stuff, i love it.

  8. Default password can be changed ?

  9. i mean «admin» can be changed?

  10. Max:

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

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

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

  12. Yuri:

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

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

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

  14. Вадим:

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

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

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

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

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

    • Alexey Alexey:

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

  15. Никита:

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

    • Alexey Alexey:

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

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

    • Alexey Alexey:

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

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

Ваш отзыв