PZEM-004t и Ардуино
- Войдите на сайт для отправки комментариев
Чт, 19/04/2018 - 11:19
Доброго времени, уважаемые! Появилась необходимость соединить модуль контроля электроэнергии PZEM-004t с Ардуино по UART. Есть библиотека: https://github.com/olehs/PZEM004T , но беда в том, что частота опроса порта в этой библиотеке 1 раз в секунду, а мне нужно 10 раз в секунду. Попробовал в файле PZEM004T.cpp поменять значение PZEM_DEFAULT_READ_TIMEOUT с 1000 на 100, белиберда получается. Помогите пожалуйста!
Код в студию.
А Ваш-то код где? Которым Вы это читаете?
Кстати, зачем Вы меняли таймаут? Это же просто время ожидания, а вовсе не частота чтения. Меняйте "в зад".
И давайте свой код.
Код взят из примера, идущего с библиотекой. Вот он:
Блин, ну что ж из Вас всё клещами-то надо тянуть? В коде есть печати. Давайте лог - чего печатает-то?
Правильно ли я понимаю, что у Вас строка 28 тоно такая (с комментарием). Печать валится постоянно, но меняется только раз в секунду? Или с чего Вы взяли, что там частота опроса раз в секунду?
И ещё. Вы выложили код библиотеки, но... Вы же говорили, что меняли там константу, а выложили что? Без изменений!
давайте Вы вылодите ТОЧНО ИМЕННО ТОТ код, который запускаете и заодно скопируете протокол печати - что печатает.
Прошу прощения, если плохо объясняю.
Под рукой устройства сейчас нет, монитор порта выложу вечером. Код в Ардуино точно тот, который выложил выше. Монитор порта выдаёт значения напряжения, тока, мощности и потребления раз в секунду (значения меняются раз в секунду). Строчка 28 как в выложенном коде. Пробовал раскомментировать - ничего не меняется. Из этого я сделал вывод, что частота опроса заложена в библиотеке.
Код библиотеки (константу) я поменял, результат не получил и вернул всё обратно.
Не понял приписки в скобках. Давайте конкретно.
1. Значения выдаются раз в секуднк?
или
2. Значения выдаются часто, но одни и те же, а изменяются раз в секунду.
Это большая разница.
И в общем, я жду протокола монитора порта. ТОлько добавьте в печатьи ещё и время (просто значение millis печатайте), чтобы видны были задержки.
Значения выводятся на экран монитора раз в секунду. Вечером попробую выложить, что Вы просите.
Хорошо, я тогда посмотрю, буду ждать.
Ниже скрин монитора порта. На счёт millis не знаю как сделать, программист я никудышный. Новая строка со значениями появляется в мониторе раз в секунду. На самом PZEM-004t имеются 4 индикатора, показания которых совпадают с показаниями в мониторе и обновляются в один и тот же момент времени. Это навело меня сейчас на мысль, что возможно частота выдачи данных из PZEM фиксированная и не зависит от частоты посылаемых запросов. Надо будет даташит посмотреть.
У меня тоже такое ощущение, потому, что в библиотеке никаких специальных задержек нет.
Перерыл даташиты - ничего не нашёл. Подключил терминал и попробовал отослать запросы с частотой, чаще 1сек... И тут всё стало понятно, PZEM не обрабытывает запросы чаще двух раз в секунду.
ЕвгенийП, спасибо за уделённое мне внимание, тему можно закрывать.
У меня тоже такое ощущение, потому, что в библиотеке никаких специальных задержек нет.
Уважаемый Евгений, может быть вы знаете как тогда считывать показания с PZEM004T и при этом не ждать 1 секунду ответа от функций pzem.voltage (.current, .power, .energy)? В то время, когда ардлуина ждет ответа от этих функций, она просто "висит", а это никуда не годится.
Не знаю, но могу попробовать посмотреть. Только Вы делайте то, что Вас просят.
В прошлый раз Вы не сделали, я и подумал, что Вам не надо.
Давайте, выложите печать как я просил и свежий скетч (тот самый, который печатал).
Это уже другой человек.
"PZEM allows to read max 2 values at once (per second). So if you try to read all 4 values - it will take minimum 2 second" (C)
Ну, по любому, нужен скетч и печать, чтобы не вслепую работать, другой - так другой
"PZEM allows to read max 2 values at once (per second). So if you try to read all 4 values - it will take minimum 2 second" (C)
Да это то ладно. Надо быяснить обязательно ли его ждать или можно в это время другими делами заниматься. Вопрос-то, мне показалось, так стоит.
Ждать не обязательно. Главное - не обращаться чаще. Лучше - раз в секунду. Иначе прибор может затупить и коннект будет по таймауту отваливаться через определенное в библиотеке время.
Ну Вот, Вы и ответили спрашивающему. Доводите уж теперь, чего мне лезть-то.
Ну, по любому, нужен скетч и печать, чтобы не вслепую работать, другой - так другой
"PZEM allows to read max 2 values at once (per second). So if you try to read all 4 values - it will take minimum 2 second" (C)
Да это то ладно. Надо быяснить обязательно ли его ждать или можно в это время другими делами заниматься. Вопрос-то, мне показалось, так стоит.
Код:
Распечатка:
Уважаемый, sadman41!
Спасибо за ответ! Подскажите, а как не ждать, ведь функция pzem.voltage тормозит цикл на 2 секунды? Или работать с PZEM004T напрямую (без библиотеки PZEM004T.h)? Есть пример такого кода?
Функция не тормозит. Просто счетчик не готов отвечать так быстро, как вы его опрашиваете. Хоть через библиотеку, хоть напрямую. Производите чтение так, как рекомендует статья "blink без delay", а в промежутках между чтениями раз в секунду делайте еще что-то полезное в скетче.
Все, теперь понял. Спасибо за вразумление! :)
Если к модулю обращаться не чаще, чем 1 раз в секунду, то он данные выдает быстро – около 25мс. Вот, распечатка задержек. В скобках время в мс за которое получили значение и вывели в порт:
V=227.60 ( 27) I=0.08 ( 26) P=11.00 ( 23) E=27.00 ( 22)
V=226.70 ( 23) I=0.09 ( 21) P=10.00 ( 19) E=27.00 ( 19)
V=225.00 ( 18) I=0.08 ( 16) P=11.00 ( 25) E=27.00 ( 24)
V=226.10 ( 25) I=0.08 ( 24) P=11.00 ( 20) E=27.00 ( 20)
V=226.10 ( 20) I=0.08 ( 19) P=11.00 ( 16) E=27.00 ( 17)
Вот код (для будущих ковыляльщиков):
Предлагаю упрощение:
Спасибо!
Это все-равно пока черновик. Надо еще все переделать под 3 фазы, добавить чтение 3х DS18B20, дисплей, sd-карту и отправку на MQTT через ESP8266 :)
Ну вот, как раз чтение вразнобой разных метрик с трех PZEM + DS-ки + всякое другое секунду и сожрут. 3 PZEM-а можно подключить собрав все их RX-ы на один пин ардуины. Так экономится два пина и не надо резисторы выпаивать с прибора.
1. Да-да, так и планирую потратить секунду :)
2. А как это "собрав все их RX-ы на один пин ардуины"? Я пока их все по разным софт-портам раскидываю (PZEM004T pzemA(10,11), pzemB(3,4), pzemC(5,6); )
2. А как это "собрав все их RX-ы на один пин ардуины"? Я пока их все по разным софт-портам раскидываю (PZEM004T pzemA(10,11), pzemB(3,4), pzemC(5,6); )
Если ног хватает, то можно и так. Но, когда приходится кроить, то можно этак: https://github.com/zbx-sadman/zabbuino/issues/8 . Так же: сбором RX-ов на один пин - тогда ардуина одновременно командует всем, а слушает ответ у одного. Или, наверное, можно попробовать TX-ы собрать (но, наверняка не будет работать без выпайки резисторов) - ардуина будет говорить по отдельному проводу, а слушать общий. Типа этого: PZEM004T pzemA(10,11), pzemB(10,4), pzemC(10,6). Софтсериалу-то пофигу, за какой провод дергать.
Спасибо за наводку!
Вы как, шабашки берете? А то у меня это хобби-диверсификация, и очень мало времени на допиливание до ума.
Беру иногда. wrk.sadman@gmail.com
БОЛЬШОЕ спасибо, за эту тему! Очень помогла!!! Уже неделю мучился, просил помощи на других сайтах... на которых ОЧЕНЬ сильно УМНИЧАЮТ и СПЕЦОВ из себя корчат. А реально никто помочь не желает. Хочешь решить проблему, плати-один ответ. Ещё раз СПАСИБО!
Если ног хватает, то можно и так. Но, когда приходится кроить, то можно этак: https://github.com/zbx-sadman/zabbuino/issues/8 . Так же: сбором RX-ов на один пин - тогда ардуина одновременно командует всем, а слушает ответ у одного. Или, наверное, можно попробовать TX-ы собрать (но, наверняка не будет работать без выпайки резисторов) - ардуина будет говорить по отдельному проводу, а слушать общий. Типа этого: PZEM004T pzemA(10,11), pzemB(10,4), pzemC(10,6). Софтсериалу-то пофигу, за какой провод дергать.
Я правильно понял что можно подключить 3шт PZEM004T паралельно на 2 пина всего лишь выпаяв R15 на двух из них? Можно пример кода? По ссылке не нашёл.
Совсем параллельно (на два вывода) я сам не пробовал, но у товарища по ссылке работало. Только каждому предварительно нужно назначить свой адрес (который похож на IP Address). А со сбором RX-ов на один пин можно даже тупо объекты SoftwareSerial-а создавать каждый раз на другие пины, опрашивать PZEM и утилизировать объект. Всё достаточно быстро происходит на 328-м МК.
Мой исходник тут: https://github.com/zbx-sadman/zabbuino/blob/master/src/uart_pzem.cpp , но не знаю, чем он Вам поможет. Есть библиотека для PZEM, но она с ошибкой - с одним экземпляром счетчика работает, а с тремя - глючит.
Кстати, эксперименты показали, что на 2 раза в секунду таки лучше не расчитывать - в редкие моменты случается у счетчика затуп. Стоит рассматривать период чтения от секунды и более.
Вот эта глючит? https://github.com/olehs/PZEM004T
А существуют другие версии библиотеки? Так как надо именно с 3 счётчиками.
Я сталкивался со странным поведением, если создать несколько инстансов (по каждому на счетчик). Но зацикливаться на этом не стал.
Других версий не знаю, обмен пишу сам, если надо.
Я сталкивался со странным поведением, если создать несколько инстансов (по каждому на счетчик). Но зацикливаться на этом не стал.
Других версий не знаю, обмен пишу сам, если надо.
А в чём выражается страннось? Хоть знать с чем столкнусь. Увы, я не обладаю в программиовании настолько что-бы писать обмен самостоятельно. Поэтому пользуюсь тем что есть.
Да читал он только с первого объявленного, по-моему.
Да, проблема вылезла сразу.
Верхняя часть, до разделителя - это подключены 3шт. Видно как втупляет чтение с 2 и 3. Разделитель - это я выдернул датчик №3 с дуины. Первые два сразу нормальзовались. Второй разделитель - это я выдернул 2, а 3 воткнул. Сответственно 1 и 3 стали показывать норм. Это я всё на горячую делал, без перезапуска дуины.
Плата - ардуино нано.
Ну, вобщем, что-то такое было и у меня. Решал врукопашную.
Ну, вобщем, что-то такое было и у меня. Решал врукопашную.
А поподробнее?
Попробовал третий посадить на серийный порт самой дуины. Все 3 датчика читает, но тот что на серийном весит лезет мусор какой-то.
А поподробнее?
Подробнее уже было - "обмен пишу сам, если надо". Дальше уже только писать за вас прошивку остается.
Если ног хватает, то можно и так. Но, когда приходится кроить, то можно этак: https://github.com/zbx-sadman/zabbuino/issues/8 . Так же: сбором RX-ов на один пин - тогда ардуина одновременно командует всем, а слушает ответ у одного. Или, наверное, можно попробовать TX-ы собрать (но, наверняка не будет работать без выпайки резисторов) - ардуина будет говорить по отдельному проводу, а слушать общий. Типа этого: PZEM004T pzemA(10,11), pzemB(10,4), pzemC(10,6). Софтсериалу-то пофигу, за какой провод дергать.
У меня глучило при варианте собранных TX(PZEM004T) на один пин ардуины. При сборке RX(PZEM004T) на один пин вообще не работало. Сейчас сделал 2 датчика с одним TX(PZEM004T) и 3й на отдельных пинах. Вроде пашет.
Если ног хватает, то можно и так. Но, когда приходится кроить, то можно этак: https://github.com/zbx-sadman/zabbuino/issues/8 . Так же: сбором RX-ов на один пин - тогда ардуина одновременно командует всем, а слушает ответ у одного. Или, наверное, можно попробовать TX-ы собрать (но, наверняка не будет работать без выпайки резисторов) - ардуина будет говорить по отдельному проводу, а слушать общий. Типа этого: PZEM004T pzemA(10,11), pzemB(10,4), pzemC(10,6). Софтсериалу-то пофигу, за какой провод дергать.
Разобрался с подключением 3шт на 2 ноги. Сначала подключаем по одной и через setAddress назначаем каждой свой адресс. Этот адресс хранится во внутренней памяти датчика и не сбрасывается при отключении питания. А потом выпаеваем сопротивления у всех кроме одной и собираем вместе на 2 ноги. А в коде уже получаем данные через pzem.voltage(ip1), pzem.voltage(ip2) и т.д.
Заодно собрал програмный сброс количества учтённых ватт. А то сбрасывать на кнопку как-то несерьёзно.
Разобрался с подключением 3шт на 2 ноги. Сначала подключаем по одной и через setAddress назначаем каждой свой адресс. Этот адресс хранится во внутренней памяти датчика и не сбрасывается при отключении питания. А потом выпаеваем сопротивления у всех кроме одной и собираем вместе на 2 ноги. А в коде уже получаем данные через pzem.voltage(ip1), pzem.voltage(ip2) и т.д.
Вобщем-то это и написано было по ссылке. Сбор ног одно типа - это уже чтобы не лезть паяльником в PZEM. Забудешь потом чего у кого отпаял.
С другой стороны - адреса надо тоже запоминать. Или подписывать на счетчике. Он же, гад, если адрес не тот ему суешь, молчит как партизан. От сломанного и не отличить.
Вобщем-то это и написано было по ссылке.
Да я вок как-то только сейчас допёр. Мне почему-то казалось что setAddress надо делать в setup()
Сбор ног одно типа - это уже чтобы не лезть паяльником в PZEM. Забудешь потом чего у кого отпаял.
С другой стороны - адреса надо тоже запоминать. Или подписывать на счетчике. Он же, гад, если адрес не тот ему суешь, молчит как партизан. От сломанного и не отличить.
Так это видно сразу. А и учёт ЭЭ не то устройство которое надо постоянно разбирать и собирать. Сделал раз, поставил в щит и забыл.
Вот именно - забыл )) Через годик решил апгрейд сделать: в щит добавить чего, в прошивке чего-нить улучшить и сиди, думай чего ты там кому назначил, у кого что отпаял. Стандартное попадалово. Конечно, если память эдейтическая, то проще.
Вот именно - забыл )) Через годик решил апгрейд сделать: в щит добавить чего, в прошивке чего-нить улучшить и сиди, думай чего ты там кому назначил, у кого что отпаял. Стандартное попадалово. Конечно, если память эдейтическая, то проще.
А тут надо не ленится и писать документацию. :)
Добрый день. Я так и не понял, у вас получается прочитать все четыре параметра раз в секунду? Или на чтение каждого параметра нужна секунда?
Другими словами, я могу раз в секунду получать значения сразу и напряжения, и тока, и мощности, и энергии? Или чтобы получить все четыре эти значения, мне придётся затратить четыре секунды?
Одно обращение к счетчику в секунду. За одно обращение получаем только одну метрика (параметр/значение/...). Сразу всё не получить.
Аааа! Какое же бесполезное нецензурное слово, эта плата! Ладно когда датчик температуры или влажности воздуха так себя ведёт. Но это же датчик тока! Я уже готов был смириться с тем, чтобы получать все параметры раз в секунду. Слишком редко, но хоть как-то. Но цикл замеров раз в две секунды минимум (остальное можно вычислить), когда электричество скачет как попало - это просто ни о чём.
Найдите другой... Мне тоже было бы интересно узнать, как зовут недорогой счетчик с цифровым интерфейсом и возможностью одновременного получения всех параметров измерительного "среза".