Подключение несколько PZEM 004t на один UART

Март 02 2024

Под катом вы узнаете, как подключить несколько модулей 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. вот такой бутерброд у меня получился.

Раздел: Arduino Теги: Arduino