Подключение несколько PZEM 004t на один UART
Под катом вы узнаете, как подключить несколько модулей PZEM-004T v.1 & v.2 к одному Serial порту (UART) Ардуино, ESP8266 или любому другому контроллеру.
Наверняка, если вы работали с данными модулями, у вас возникала идея использовать их для разных линий потребителей, например, отдельно освещение, кухня, или просто, мониторить три фазы, если у вас такая подача электроэнергии, и подключить их все на один микроконтроллер. В v.3 можно установить персональный адрес каждому модулю, и подключить их все на один порт, через развязывающий диод, такие схемы есть в интернете. Но в моей коллекции остались старые модули, купленные давно и ждавшие своего часа. В этой статье я расскажу, как можно подключить любое число модулей с минимальной его переделкой.
Я подключаю их к ESP8266, и делаю следующее:
Необходимо удалить резисторы R15 на всех модулях и поменять R17, который имеет сопротивление 1Ком и рассчитан на напряжение подключаемого контроллера 5В. Поскольку ESP8266 имеет напряжение питания 3.3В, нужно поменять резисторы, я поставил номинал 510Om. Затем нужно соединить все контакты GND, RX, TX между собой на всех модулях, а к контакту 5V припаять проводник, который нужно подключить к свободному порту вывода контроллера. Когда мы подадим на него напряжение высокого уровня (3,3В), активируем соединение с данным модулем PZEM. Так-же необходимо обеспечить подтяжку линии TX к плюсу питания, через резистор от 1 до 6 Ком.
После всех манипуляций паяльником, переходим к программе.
#include <PZEM004T.h> PZEM004T pzem(&Serial); IPAddress ip(192,168,1,1); uint32_t timer; float power; uint8_t pos = 1; void setup(void) { Serial.begin(9600); } void loop(void) { if (millis() - timer > 1000) { timer = millis(); switch (pos) { case 1: pinMode(D5, INPUT); pinMode(D7, OUTPUT); digitalWrite(D7, HIGH); break; case 2: pinMode(D7, INPUT); pinMode(D6, OUTPUT); digitalWrite(D6, HIGH); break; case 3: pinMode(D6, INPUT); pinMode(D5, OUTPUT); digitalWrite(D5, HIGH); break; default: break; } power = pzem.power(ip); if (pos++ == 3) { pos = 1; } } }
По очереди подаем высокий уровень на модули и считываем показания. Для остальных модулей, переводим состояние порта на вход, отключая его от принятия команды запроса. Всё!
Таким образом, можем подключить необходимое количество модулей PZEM к одному порту UART и по очереди снимать с них показания. Можете использовать и библиотеку SoftwareSerial, чтобы использовать аппаратный UART для загрузки программ и отладки, но я рекомендую использовать OTA и Serial1 соответственно.
Спасибо за внимание! До новых встреч!
p.s. вот такой бутерброд у меня получился.