В первую очередь хочу поблагодарить сотрудников интернет магазина. За предоставленные образцы PZEM-004 и
ESP8266
В следствии чего, у меня появилась возможность написать этот обзор и поделиться с вами тем что я узнал и сделал с этими замечательными приборами.
Я не буду описывать упаковку и характеристики данных товаров. подобные обзоры уже существуют на Муске. Я попытаюсь рассказать как можно соединить эти приборы и считывать информацию с PZEM-004 на ESP8266.
Данный экземпляр PZEM-004 имеет интерфейс Uart, который я и буду использовать. Первое препятствие на моем пути, стало то, что сигнальное напряжение на UART PZEM-004 5v а на ESP8266 3,3v. Можно конечно использовать модуль согласования напряжения. Но в данном случае я поступил проще и дешевле. Для того что бы UART интерфейс PZEM-004 работал на напряжении 3.3v достаточно впаять одно дополнительное сопротивление на плату PZEM-004.
Делается это так:
откручиваем 4 винта на задней крышке и снимаем лицевую панель
Дальше вытаскиваем плату из корпуса
И вот таким образом припаиваем сопротивление 1ком.
Теперь рабочее напряжение на сигнальных контактах PZEM-004 будет 3.3v.
Следующие препятствие состоит в том что штатные выходы UART ESP8266 который я использую подключены к интерфейсу USB и не могут быть использованы для других целей. Да и штатный USB штука полезная и может пригодиться для логирования и управления контролером через компьютер. Но выход есть.В ESP8266 UART можно переключать на альтернативные контакты.
GPIO13 и GPIO15. Но тут нас ожидает очередная засада.Дело в том что GPIO15 при включении питания контроллера должен находиться в низком уровне и на плате контроллера есть сопротивление которое подтягивает его к земле. Но при подключении этого контакта к RX контакту PZEM-004, он через светодиод оптрона оказывается подключенным к плюсу питания. Это приводит к тому, что если в момент включения питания на контроллере подключен UART интерфейс к PZEM-004, контроллер не запускается и переходит в режим прошивки.
Что бы этого избежать необходимо добавить ключ на транзисторе по схеме с общим коллектором.
На этом электрические заморочки закончены, и можно приступать к программированию.
Так выглядит готовый модуль.
С подключенным дисплеем.
Как-то так, это все работает.
Некоторая разница в показаниях видна из за того, что существует период опроса 2 сек и соответственно задержка в выводе показаний.
Минимальное напряжение при котором PZEM-004 еще работает
В данной конструкции можно использовать более дешевую модификацию без дисплея
PZEM-004t
В этом случае дополнительный резистор для согласования напряжения UART впаивается сюда:
Я делаю устройство которое будет контролировать некий агрегат для нагрева жидкости. Так что я добавил в схему датчик температуры.
Соединяем все детали вместе таким образом:
Подключаем PZEM-004
Подключаем датчик температуры ds18b20
Через модуль согласования уровней подключаем дисплей.
В моем случае LCD 2004
Тут берем скрипты на lua и закачиваем в контролер
В этом обзоре я описывал как прошивать контроллер и закачивать скрипты
Если мовый модуль PZEM-004 не будет отвечать, необходимо подать на него команду «установки адреса»
Это можно сделать так;
В скрипте POWER.lua найти такой кусок кода:
uart.write(0, 0xB0,0xC0,0xA8,0x01,0x01,0x00,0x1A); -- ??????????
--uart.write(0, 0xB4,0xC0,0xA8,0x01,0x01,0x00,0x1E);
И поправить так:
--uart.write(0, 0xB0,0xC0,0xA8,0x01,0x01,0x00,0x1A); -- ??????????
uart.write(0, 0xB4,0xC0,0xA8,0x01,0x01,0x00,0x1E);
Загрузить исправленный скрипт и запустить контроллер и PZEM-004.
После этого исправить текст скрипта обратно как было и снова его загрузить в контроллер.
После этого все должно заработать.
Всем удачи, хорошего настроения и радости от сделанного своими руками.
Хотя для новичков, скорей всего, не помешало бы разжевать некоторые пункты.
У меня такой датчик работает в паре с ESP8266, данные шлет в приложение Blynk, в помещении 3фазы, встал вопрос прикрутить такой датчик на остальные 2 фазы. На каждый датчик вешать ESP не хочется, поэтому задался вопросом прикрутить все 3 датчика к одной ESP. В этой области не силен, но как понимаю нужно каким то образом прикрутить каждому датчику свой ip и присвоить каждому разные переменные вольт, ватт и т.д. А в ESP использовать программные сериал порты. С портами разобрался, с переменными думаю тоже разберусь, они вроде находятся в PZEM004T.h, а вот как с ip адресом как быть? Да и вообще правильные ли у меня мысли по этому поводу или прикрутить к каждому датчику свою ESP и не заморачиваться?
Поставить логический коммутатор и опрашивать их по очереди.
У меня часто проседает напряжение — срабатывает реле контроля напряжения — включается ИБП — пищит зараза.
Хочу логировать просадки и скачки — найти причину и устранить ее.
На самом деле — дисплей прекрасно управляется уровнями 3,3 (питание естественно, на модуль нужно подавать 5). Модуль согласования там лишний.
Но вот если сигнал идет в обе стороны, или — сигнал входящий для контроллера — тогда, 5В логики с внешнего устройства могут оказаться неприемлемыми для контроллера. Вот тут то и нужен модуль согласования (хотя для чисто входящих сигналов можно и резисторным делителем обойтись).
zftlab.org/pages/2016050700.html
zftlab.org/pages/2015101400.html
esp8266.flymon.net/?macs=18FE34DE1372,18FE34DE1529,5CCF7F0A74B0&graphs=acvolt,temp,pres,rssi&period=24h#!/
Надобно исправить
Кто-то может выложить код, на предмет вывода напряжения\тока с PZEM в консоль?
Без подключения модулей экрана и датчика температуры.
Заранее спасибо!
Далее, я подключил pzem к nodemcu, выпилил из луа все, что связано с дисплеем и датчиком температуры, чтобы не мешало. И добавил вывод в консоль (в разных местах тыкал print). (Резюк на 1к и ставил и откидывал).
Не работало. Либо висло, либо принтало (init, exec, exec,exec, или data,data,data_)
init.lua
pastebin.com/tXuxCwKr
script4.lua
pastebin.com/ZQGzFS5L
POWER.lua
pastebin.com/VRXp7fnV
Но потом, я прочитал, что в обвзяке NodeMCU только один usb-uart преобразователь. Соответственно, когда мы переключаемся на резервные пины в консоль мы уже ничего не получим.
Вопрос. Можно ли поправить эти луа скрипты, а в идеале сделать все одним файлом, чтобы получать значения с pzem на веб страничку?
Вряд ли получится одним файлом. Оперативной памяти не хватит. Там вся фишка в множестве файлов в том, что они по очереди загружаются и выгружаются из памяти и ее хватает на всех.
Поэтому я предположил, что можно в качестве дебага для начала выводить данные в локальный web-сервер, поднятый на esp.
Но в луа пока что не силен. Пробую, методом тыка :) Нид хелп.
После этого можно проверить глобальную переменную «P»
Если она -1 значит данные не получены и сработал таймаут.
Иначе можно проверить переменные V[1] и V[2] есть ли в них вменяемые значения, потом проверить переменную PWR. Все это можно отправлять в оператор print если P=0 или P=-1
годная штука.
Замечаю в графике аномалии по току. Сервер забирает инфу раз в минуту, и на соседних минутах ток на обычном уровне, т.е. аномалия длится менее минуты.
По мощности их нет, может не успевает словить их из-за своей инерционности, хотя попадать запросом прям в начало скачка тока и до увеличения мощности маловероятно. Вот и не пойму толи правда иногда он столько жрёт кратковременно, толи pzem гонит.
Аномалии редки (мониторится с 20.01.17):
Кто-нибудь замечал такое?
З.Ы. Сейчас контроллер по запросу с инета запрашивает у монитора данные и выдаёт серверу. Думаю сделать запросы монитора раз секунд в 20, три раза с интервалом секунды три. Сравнивать три полученных результата и если есть большие отличия опросить повторно три раза. И так пока данные не будут более-менее близки. Сохранять напряжение-ток-мощность-потреблённую в переменные и по запросу извне отдавать инфу с этих переменных. И только при определённом http-запросе запрашивать у монитора и отдавать с него, мало ли понадобится посмотреть данные на данный момент а не 1-20 секундной давности.
Теперь зная среднее потребление компрессора холодильника(или, например, бойлера), вы можете с клем компрессора через реле\бп подать сигнал на один из входов esp, таким образом считать время работы компрессора. Далее время умножить на среднюю мощность и посчитать потребление. Таким образом PZEM можно переместить на общий ввод и считать и полное потребление и отдельно холодильника(бойлера, чего то еще).
Кто подскажет схему подключения и пример кода для реализации?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.