PZEM-004t и Ардуино

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

Коллеги, а подскажите плиз - 

использовал опрос примерно как выше в теме - каждые 15 секунд запрашивал один параметр, и все было хорошо. 

Но прошло обновление либы, теперь она поддерживает hardwareserial (что для меня актуально), но теперь появилась задержка в секунду при опросе....

https://github.com/olehs/PZEM004T

менее, чем в 950 мсек - плата стабильно выдает ошибку (-1).

При выставлении #define PZEM_DEFAULT_READ_TIMEOUT 1000

менее, чем в 950 мсек - плата стабильно выдает ошибку (-1).

Подскажите, куда смотреть?

Спасибо заранее!

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ProstoAlex пишет:

Подскажите, куда смотреть?

В начало этой темы. Примерно первые постов 15.

Я там ЗАДОЛБАЛСЯ объяснять ТС, что нужно выкладывать код и именно тот, который работал, и логи работы тоже. Вот правда, ЗАДОЛБАЛСЯ! И Вам объяснять тоже самое уже не буду. Читайте сами. Дойдёт - сделаете как надо, не дойдёт - не моя проблема.

sadman41
Offline
Зарегистрирован: 19.10.2016

Очень интересно... Как Вы связали у себя в голове HardwareSerial и опрос раз в 950ms? Поделитесь логикой.

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

Коллеги, посыпаю голову пеплом - косяк у меня в коде:

перенося код из "дева" в "прод" оставил несколько лишних опросов...

 

Спасибо всем.... )

MaksVV
Offline
Зарегистрирован: 06.08.2015

пишу с телефона поэтому библу смотреть не удобно. Я правильно понял, что каждый запрос тормозит луп на секунду? частота опроса (получения данных от pzem) мне не критична, но вот loop так тормозить не вариант. 

sadman41
Offline
Зарегистрирован: 19.10.2016

MaksVV пишет:

Я правильно понял, что каждый запрос тормозит луп на секунду? частота опроса (получения данных от pzem) мне не критична, но вот loop так тормозить не вариант. 

Неправильно. Запросы должны осуществляться не чаще раза в секунду. Сам счётчик отвечает быстро.

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

только что проверил так тормозит луп (стандартный пример библы)

#include <PZEM004T.h>

PZEM004T* pzem;
IPAddress ip(192,168,1,1);

void setup() {
  while(!Serial) { }
  Serial.begin(9600);

  while(!Serial1) { }
  pzem = new PZEM004T(&Serial1);
  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();
}

а вот так норм. опрашиваем поочереди параметры через 1,5 сек

#include <PZEM004T.h>

PZEM004T* pzem;
IPAddress ip(192,168,1,1);
uint32_t prev = 0;
void setup() {
  while(!Serial) { }
  Serial.begin(9600);

  while(!Serial1) { }
  pzem = new PZEM004T(&Serial1);
  pzem->setAddress(ip);
}

void loop() {
  if (millis() - prev>1500) {
  static byte izmtype;
  
 if (izmtype == 0 ){ float v = pzem->voltage(ip);
  if (v < 0.0) v = 0.0;
  Serial.print(v); Serial.println("V; ");}

else if (izmtype==1) {float i = pzem->current(ip);
  if(i >= 0.0){ Serial.print(i);Serial.println("A; "); }
 }
 else if (izmtype==2){
  float p = pzem->power(ip);
  if(p >= 0.0){ Serial.print(p);Serial.println("W; "); }}
  
else if (izmtype==3){  float e = pzem->energy(ip);
  if(e >= 0.0){ Serial.print(e);Serial.println("Wh; "); }}

prev = millis(); izmtype ++; if (izmtype==4) izmtype=0;}
  Serial.println(millis());
}

 

Pahanovna
Offline
Зарегистрирован: 25.03.2019

Китайцы выпустили новую версию платы (v3.0), обещают что не надо будет ждать по одной секунде между запросами. И считать можно будет все данные за один запрос. Но и протокол поменялся, так что либа работать не будет. А ещё улучшили изоляцию шины данных от измерительной части. Теперь экран на нижней стороне платы, который соединён с сетью, не заходит на разъём данных. И под оптронами сделали разрез, чтобы исключить пробой по поверхности платы.

Мне уже приехала новая плата. Надеюсь, на этой неделе найдётся время протестить.

sadman41
Offline
Зарегистрирован: 19.10.2016

Подкиньте ссылку на девайс.

Нашел описание. Производитель туда ModBus влепил вместо своего протокола.

Pahanovna
Offline
Зарегистрирован: 25.03.2019
ratman
Offline
Зарегистрирован: 11.10.2015

Подскажите пожалуйста...

Модуль pzerm-004t v3.0 без подключения силовой части должен что-то отдавать или нет?

Подключение к WeMos D1 mini:

D0 - Rx, D4 - Tx, питание общее 5v с преобразователя. Скетч из примеров:

#include <PZEM004Tv30.h>

PZEM004Tv30 pzem(2, 16);

void setup() {
  Serial.begin(115200);
}

uint8_t addr = 0x01;

void loop() {
    pzem.setAddress(addr);
    Serial.print("Current address:");
    Serial.println(pzem.getAddress());
    Serial.println();

    if(++addr == 0xF8)
        addr = 0x01;

    delay(1000);
}

В итоге моргает светодиодом "Rx", в мониторе порта "Current address:248". Даже если модуль отключить физически. Если пины в инициализации поменять местами, начинает моргать "Tx", то есть накосячить в двух проводах я не смог.

sadman41
Offline
Зарегистрирован: 19.10.2016

Старый отдавал. В новом, как я понял, просто свой протокол на модбас заменили. Наврядли стали все перепаивать. Зацепись через USB-TTL на ПК и через утилиты всякие его пощупай.

ratman
Offline
Зарегистрирован: 11.10.2015

Старых в продаже не нашёл. Библиотека, вроде для v3.0 ():

/*
 * PZEM-004Tv30.h
 *
 * Interface library for the upgraded version of PZEM-004T v3.0
 * Based on the PZEM004T library by @olehs https://github.com/olehs/PZEM004T
 *
 * Author: Jakub Mandula https://github.com/mandulaj
 *
 *
*/

Что-то сомнения у меня. Если он весь питается от низковольтной части (схему так и не нашёл), то зачем опторазвязка по Rx и Tx. Сейчас силу подключу, посмотрю. Если нет, останется щупать через переходник или перебирать библиотеки.

ratman
Offline
Зарегистрирован: 11.10.2015

В общем, без подключения силовой части оно (PZEM-004T-100A_v3.0) не работает.

sadman41
Offline
Зарегистрирован: 19.10.2016

А... Я думал, что ты ему просто трансформатор не подключил. Так-то да - 5В с МК питают одну оптопару (в направлении "Туда"), а напруга с самого PZEM питает вторую оптопару (по направлению "Оттуда"). На старом так же было.

ratman
Offline
Зарегистрирован: 11.10.2015

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Как впечатления от нового пзема? Я так и не имплементировал его в свой прожект - никто не заинтересовался серьезно.

ratman
Offline
Зарегистрирован: 11.10.2015

Да нет еще впечатлений. Нужно собрать всё в рабочий макет, отволочь на работу, запустить и посмотреть неделю.

Тут ведь затея такая, что я ещё сам не осознал. На объекте четыре транспортёра с трёхфазными движками. Нужно "слушать", как они садят сеть, и сваливать всё на Zabbix.

По Zabbuino: Огромное тебе спасибо за проделанную работу и отдельное за порт на esp8266! Я ведь на Arduino с Ethernet так и не смог запустить. Результаты на esp ты сам видел.

Надо или не надо допиливать -- тут я просить не могу, но старых v1.0 я не нашёл (The old version has been sold out in most of the online store and no produce anymore.), хотя искал именно чтобы так прикрутить. Обойдусь траппером, до внятной реализации у меня конь ещё не валялся.

sadman41
Offline
Зарегистрирован: 19.10.2016

PZEM на трехфазных движках мы проходили - так себе идея. Срез по фазам несинхронизирован. Да ещё и хардварные проблемы были какие-то... вроде там PZEM-ы врали или даже горели. 

selan61
Offline
Зарегистрирован: 15.12.2017

Подскажите пожалуйста...

Модуль pzerm-004t v3.0. Использую библиотеку

* PZEM-004Tv30.h Author: Jakub Mandula https://github.com/mandulaj

В ней описан метод pzem.resetEnergy()- сброс счетчика энергии, однако, что то он у меня не работает.

if(dd == 1 && hh == 0 && mm == 0 && ss == 0){pzem.resetEnergy();Serial.print("Reset Energy");}

Может, что то делаю не так?

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте сброс по кнопке, а не по странному условию.

selan61
Offline
Зарегистрирован: 15.12.2017

На третьей версии нет кнопки. Сброс только программно. А условие сброса 1 числа в 0 часов в 0 минут в 0 секунд.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сброс по кнопке на Arduino, а не на счетчике.

selan61
Offline
Зарегистрирован: 15.12.2017

Я  pzem.resetEnergy() передаю и по условию и по кнопке. По кнопке PZEM её выполняет, а по условию нет. Что в нем не правильно?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

selan61
Offline
Зарегистрирован: 15.12.2017

Всё сам разобрался. Спасибо за ответы. Осталось только проблема, что PZEM что то врет в подсчете потребленной энергией. Ошибается со счетчиком чуть ли не в 2 раза. Странно, взял его что бы контролировать счетчик, а тут такая засада.

nik182
Offline
Зарегистрирован: 04.05.2015

А по данным какой параметр врёт? При распечатке - напряжение  ток. Мощность их произведение. Энергия интеграл мощности. Ошибка либо в исходных данных, либо в расчёте.    

selan61
Offline
Зарегистрирован: 15.12.2017

selan61 пишет:

 PZEM  врет в подсчете потребленной энергией.

Напряжение вроде в норме, а ток и потребляемую мощность, как проверишь. Опрашиваю его раз 5 минут и отправляю на народный мониторинг. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если метрики снимаются неодновременно, то разброд и шатание гарантированно.

nik182
Offline
Зарегистрирован: 04.05.2015

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

selan61
Offline
Зарегистрирован: 15.12.2017

sadman41 пишет:
Если метрики снимаются неодновременно, то разброд и шатание гарантированно.

И почему? Он же всё сам вычисляет, я только считываю показания. Это всё равно как каждые 5 минут подходить к электросчетчику и записывать данные. 

nik182 пишет:

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

Можно, но толку то, если PZEM врет, что мне его калибровать? А если погрешность нелинейная? Меня интересует, встречалось такое или нет?

 

b707
Offline
Зарегистрирован: 26.05.2017

selan61 пишет:

Меня интересует, встречалось такое или нет?

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

Если много - это вас примирит с неверными данными? :)

nik182
Offline
Зарегистрирован: 04.05.2015

Если известен источник ошибки, то можно думать что делать. Может быть и без калибровки можно обойтись. Может трансформатор тока дурит? 

SAB
Offline
Зарегистрирован: 27.12.2016

может эти трансформаторы идут с разными коэффициентами. На нем что то написано? Скорее всего в скетче надо этот коэф  поправить.

selan61
Offline
Зарегистрирован: 15.12.2017

Спасибо за идею. Буду разбираться.

selan61
Offline
Зарегистрирован: 15.12.2017

В даташите точность измерения 0,5%

Характеристики производителя (оптимистичные)

 

Функция Диапазон измерения разрешение Точность  
Напряжение 80 ~ 260 В 0,1 В 0,5%  
Текущий 0 ~ 10 А или 0 ~ 100 А * 0,01 А или 0,02 А * 0,5%  
Активная мощность 0 ~ 2,3 кВт или 0 ~ 23 кВт * 0,1 Вт 0,5%  
Активная энергия 0 ~ 9999,99 кВтч 1 Втч 0,5%  
Частота 45 ~ 65 Гц 0,1 Гц 0,5%  
Фактор силы 0,00 ~ 1,00 0,01 1%

Автор библиотеки пытался сделать калибровку, но ему это не удалось.

https://github.com/mandulaj/PZEM-004T-v30/issues/12

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

selan61 пишет:

sadman41 пишет:
Если метрики снимаются неодновременно, то разброд и шатание гарантированно.

И почему? Он же всё сам вычисляет, я только считываю показания. Это всё равно как каждые 5 минут подходить к электросчетчику и записывать данные. 


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

selan61
Offline
Зарегистрирован: 15.12.2017

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

А в чем смысл,и что это меняет?

Pahanovna
Offline
Зарегистрирован: 25.03.2019

sadman41 не предлагает так делать, а предполагает, что такое может случиться.

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

selan61
Offline
Зарегистрирован: 15.12.2017

PZEM сам определяет и вычисляет все параметры и хранит их в памяти. Это не просто датчик, это готовый электросчетчик. Я просто периодически снимаю показания. Ничего с ними я не могу сделать. При разных замерах естественно будут разные показания, как на обычном электросчетчике.

nik182
Offline
Зарегистрирован: 04.05.2015

Приехал PZEM. По утюгу точность напряжения лучше 0.1 % по току завышает на 0.5%, но на холостом ходу показывает 0.36А, а это как раз почти 0.5 % от 8А утюга. Вот и думай, это норма +0.36 или как?

sadman41
Offline
Зарегистрирован: 19.10.2016

А трансформатор на сколь ампер?

nik182
Offline
Зарегистрирован: 04.05.2015

Разрезной на 100

sadman41
Offline
Зарегистрирован: 19.10.2016

Так для пзема с трансом такого большого номинала, может, это вообще не баг, а технологическая особенность. В ACS712 тоже чем больше лимит, тем больше дрифт.

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

nik182
Offline
Зарегистрирован: 04.05.2015

Покрутил токовый трансформатор в пространстве, переставил на другой провод... в общем добился что на холостом ходу показывает ток 0. Теперь ток тоже соответствует тестеру лучше чем 0.1% и измеряет ток телефонной зарядки. 

Для работы с ESP32 пришлось уменьшить нагрузочные резисторы на выходе с 1к до 510 Ом оба на Rx Tx. В интернетах пишут только про Rx.   

sigma_shig
Offline
Зарегистрирован: 30.12.2016

Помогите разобраться с показаниями этого PZEM. Года два использовал версию 2 для измерения потребляемой энергии. В итоге, пришел к выводу, что показания потребляемой энергии PZEM соответствуют тем, которые показывает домовой счетчик с точностью <1%. Для бытовых целей мне этого достаточно. Сейчас на вход в дом поставил PZEM v3 (библиотека 1.1.2 от Jakub Mandula), а он уже выдает кучу циферок и я в них вгляделся. И понял, что нихрена не понимаю. Например, вот типичные показатели трех PZEM004T V3 (каждый на своей фазе):

(я в курсе, что "моментальные" показания не совсем моментальны, но погрешность в несколько процентов меня устраивает)

U=227.187 / 227.044 / 229.100
I=2.049 / 1.067 / 0.041
Частота=49.132 / 49.133 / 49.132
P=470.01 / 334.244 / 30.2
PowerFactor=0.132 / 0.032 / 0.184
 
Это частный дом. Никакого серьезного индукционного оборудования у меня нет. В момент снятия показаний индукционная плите не работала. 
1. "Одновременно" смотрел потребляемую мощность по домовому счетчику от Облэнерго. Он показывает сумму в 832Вт, что примерно соответствует моим показаниям, учитывая не одномоментность
2. Судя по PowerFactor у меня идет плавка стали или аллюминия - вся мощность реактивная
3. Пытаюсь понять, как высчитывается мощность. Берем первую фазу (пока без PowerFactor) 227.187*2.049=465.5. Итого, если принять во внимание п.1 и то, что мощность, которую он показывает истинная, то получаем PowerFactor=470.01/465.5=1.009. Ну... Можно дуопустить, что в обычном доме, с хорошей линией снабжения, значения cosF должно быть близко к единице, а остальное - погрешности вычислений. Но вот со второй фазой уже не складывается совсем 227,044*1.067=242.25 и этот cosF уже должен быть 1.56? что есть бред.
Провел чистый эксперимент. Повесил PZEM на линию, где стоит один циркуляционный насос, на котором написано 145Вт 0.66А. Pzem мне выдал
U=234.187
I=0.118
P=148
 
Мощность - считаем, правильная. Напряжение - тестер показал такое же. Ток - бред! Должен быть в 5  раз выше. Как при этом можно посчитать мощность правильно?
Итого, у меня получаются два вопрос:
1. Если мощность меряет правильно, напряжение правильное, то, значит показания тока, которые он выдает на выход и те, которые он использует - разные. Что это? Я смотрел показатели в динамике. Напряжение скачет +- 5 В, мощность от 145 до 150. А ток меняется только на 0.01А 
2. Что именно показывает PZEM под видом PowerFactor? Это явно не cosFi
sadman41
Offline
Зарегистрирован: 19.10.2016

А на другой провод трансформатор повесьте... 

Что-то мне такое помнится, что на трехфазном движке какой-то показатель в минус уходил, если подключение было некорректное. Деталей не помню, но непонятки такие были.

sigma_shig
Offline
Зарегистрирован: 30.12.2016

Сейчас у меня все трансформаторы повешены на фазовый провод. Неужели надо на нулевой? Тогда будут проблемы повесить это на трехфазный потребитель - у них ноль общий.