Monitorización del consumo eléctrico y de la temperatura y humedad(Parte 1)


Dado el incremento histórico en los costos de la electricidad y la previsión de un continuo aumento, consideramos esencial contar con un método para evaluar el consumo eléctrico y identificar las áreas de la casa con mayor gasto energético. Esto nos permitirá optimizar el uso de la electricidad y, en última instancia, reducir nuestra factura. Una manera efectiva de lograr este objetivo es la instalación de medidores de consumo, ya sea a nivel de dispositivo o de la casa en su totalidad. En este post nos enfocaremos en la colocación de un medidor de consumo en el cuadro eléctrico para monitorizar el consumo de toda la vivienda , pues aunque hay numerosos dispositivos disponibles en el mercado para este propósito no siempre estan accesibles en tiempo real las medidas. Además adoptaremos una solución abierta  económica y no invasiva (esto significa que no es necesario que la línea eléctrica que se va a medir pase a través del dispositivo, lo cual hace que su instalación y uso sean más seguros).

Los componentes

El corazón del montaje es un Pzem004 , un módulo de prueba de monitorización eléctrica de alta precisión que viene además ya calibrado , muy económico ( unos 13€ en amazon) , autoalimentado ( ca 220v) y que incluye un transformador de corriente ( cerrado o con clip) para la medida de la corriente. Este mismo módulo incluso puede usarse para medir la energía, el voltaje y la corriente, y luego mostrarlo en un PC u otros terminales ofreciendo una precisión del 1%..

Ciertamente existen varias versiones con display que incluyen un botón de restablecimiento que puede restablecer los datos de energía simplemente pulsándolo, pero para el cometido de este post es mucho mejor usar la versión sin display dado que la idea es conectarlo a un microcontrolador y enviar las medidas para su análisis posterior (ya que de no ser así solo podemos verlas in situ y nos perderemos los valores históricos)

Gracias a que todas las versiones equipan un interfaz de comunicación de datos serie TTL, se puede leer y configurar los parámetros relevantes a través del puerto serie que podemos capturar con un microcontrolador como por ejemplo un potente ESP32, como vamos a ver en este post con una versión de los mas vendida: el ESP32 WROOM-32 (unos 12€ en amazon).

El AZDelivery ESP32 Dev Kit C V4, que corresponde al fabricante Espressif, combina en un solo microcontrolador una CPU con 2 núcleos de Tensilica LX6, con una frecuencia de reloj de hasta 240 MHz, y 512 kilobytes de SRAM. Para ello integra un aparato de radio para WLAN (802.11b/g/n) y Bluetooth (Classic y LE).

Con la nueva distribución de la placa, tanto la alimentación como el circuito de reset para la programación automática han sido mejorados significativamente. La versión  Dev-Kit está equipado con el ESP32-WROOM-32., módulo que a sido reposicionado por Espressif para lograr un aumento significativo en la calidad de transmisión y recepción, sin aumentar el rendimiento.

La función WLAN es compatible con todos los métodos de cifrado habituales, como WPA2. También puede actuar como punto de acceso o sniffer en la WLAN. Entre los más de 32 pines GPIO están disponibles: UART, I2C, SPI, DAC, ADC (12 Bit), todos los pines GPIO pueden utilizarse como entrada o salida.

Conectándolo todo

Usando la Biblioteca Arduino para Peacefair  en un ESP32 y un PZEM-004T-100A v3.0 podemos construir un Monitor de energía usando la interfaz ModBUS.

Antes de empezar ,debemos saber que la versión 3.0 PZEM es una versión mejorada de la anterior PZEM-004T, siendo las principales características de este módulo son las siguientes;

  • Mide voltaje, corriente, potencia, energía, factor de potencia y frecuencia (nuevo en la versión 3.0).
  • 247 direcciones esclavas programables únicas.
  • Permite que múltiples esclavos usen la misma interfaz serial PZEM MulitDevice Demo
  • Contador de energía interna hasta 9999.99kWh.
  • Alarma de sobrealimentación.
  • Puesta a cero del contador de energía.
  • Suma de comprobación CRC16.
  • Mejor, pero no perfecto aislamiento de red.

También destacar que existe ya actualmente una nueva versión versión con exactamente las mismas especificaciones pero con soporte de RS485 ( como tratamos en este post) , lo cual a efectos prácticos nos puede interesar en caso de necesitar usar múltiples dispositivos de medidas sobre el mismo bus de medidas.

Especificaciones del fabricante para el PZEM004 v3
FUNCIÓNRANGO DE MEDICIÓNRESOLUCIÓNPRECISIÓN
Voltaje80~260V0.1V0,5%
Actual0~10A o 0~100A*0.01A o 0.02A*0,5%
Poder activo0~2,3kW o 0~23kW*0.1W0,5%
energía activa0~9999.99kWh1Wh0,5%
Frecuencia45~65Hz0,1 Hz0,5%
Factor de potencia0,00~1,000.011%
*Uso del transformador de corriente externo en lugar del derivador incorporado

Este módulo, es una versión mejorada del PZEM-004T con funciones de medición de frecuencia y factor de potencia, disponible en los lugares habituales. Se comunica mediante una interfaz TTL a través de un protocolo de comunicación similar a Modbus-RTU, pero es incompatible con la biblioteca @olehs anterior que se encuentra aquí: https://github.com/olehs/PZEM004T

Para hacer mas interesante la propuesta además al circuito un simple medidor de temperatura y humedad «clásico» como el módulo DHT11. Este sensor lee la temperatura y humedad del lugar donde está el sensor. Tiene dos pines para alimentación («-» para la tierra, el pin central es VCC). El pin con la etiqueta «S» es la entrada de pin. Las lecturas se reciben a través de este pin.

Los componentes empleados necesarios para el montaje propuesto pues son los siguientes:

  • Modulo Esp32 genérico : ESp32 WROOM3
  • Modulo PZEM004
  • Modulo DHT11
  • Fuente encapsulada de 5v : módulo 220AC /5vDC
  • Cablecillo hembra-hembra y cable de ca
  • Caja

El circuito

En cuanto a las conexiones, seguiremos un esquema bastante simple que puede ajustarse a diversas necesidades y configuraciones. Se ha optado además del citado modulo PZEM004, añadir un sensor de temperatura y humedad (el DHT11 ) así como para darle mayor estabilidad un fuente sellada de 5V ultra-miniatura ( aunque un cargador USB debería también ser suficiente).

El esquema propuesto del montaje queda como en la siguiente imagen :

A continuación para que quede mas claro exponemos las principales conexiones con el ESp32:

NodeMCU ESP32SPZEM004-T V3Fuente 5v DCDHT11
5V5VRojo/+/VCC/5V 5V
GNDGNDNegro/-/GND GND
GPIO16TX  
GPIO17RX  
GPIO 5 DATA (PIN CENTRAL)
Resumen de conexiones importantes del ESP32 con el DHT11 y PZEM004

ATENCION: La Fase y el Neutro se conectarán a la corriente directa de la casa. Dentro del anillo toroidal para la medición de la corriente ( que puede ser en forma de pinza o no ), deberemos pasar el cable de la Fase (color Negro) sobre el cual deseamos llevar a cabo las mediciones, que puede ser el mismo que utilizamos para suministrar corriente al circuito o no.

Debemos destacar la importancia de verificar si los módulos ESP permiten la salida de corriente de 5V por el pin, ya que esto puede variar según el modelo. En caso de alimentar el módulo ESP desde un cable USB y suministrar energía al módulo PZEM-004T mediante sus pines 5V/VCC y GND, es esencial confirmar que estos pines puedan proporcionar la corriente necesaria. Mencionar además la intención de llevar a cabo pruebas según el esquema propuesto y luego realizar un montaje más seguro dentro del cuadro eléctrico.

MUCHO CUIDADO: Para que ciertamente este montaje no conlleve ningún peligro, dado qeu va alñimentado directamente con ca 220V , debemos aislar ambas placas (por ejemplo en una caja de conexiones) para asegurarnos de que no recibimos ninguna descarga eléctrica fortuita especialmente del PZEM004 .

Código Arduino

Una vez tengamos listo el montaje, antes de incluso integrarlo en Home Assistant que veremos en un nuevo post, es muy interesante cerciorarnos que el montaje funciona correctamente, para lo cual en el ambiente de Arduino deberíamos probar algún mínimo código que nos ratifique que el montaje es correcto.

Teniendo el montaje bien revisado, debemos seleccionar desde el interface de Arduino «ESP Dev Module» y asegurarnos de haber configurado el puerto serie correcto.

Con el siguiente código lo cargaremos y los desplegaremos en el microcontrolador pulsando la flecha derecha ( deploy) y ya podemos probar las funcionalidades abriendo el monitor serie.

#include <PZEM004Tv30.h>
#include "DHT.h"

#define DHTPIN 4 // Digital pin connected to the DHT sensor

// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --

// Pin 15 can work but DHT must be disconnected during program upload.



// Uncomment whatever type you're using!

#define DHTTYPE DHT11 // DHT 11

//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321

//#define DHTTYPE DHT21 // DHT 21 (AM2301)



// Connect pin 1 (on the left) of the sensor to +5V

// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1

// to 3.3V instead of 5V!

// Connect pin 2 of the sensor to whatever your DHTPIN is

// Connect pin 4 (on the right) of the sensor to GROUND

// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor



// Initialize DHT sensor.

// Note that older versions of this library took an optional third parameter to

// tweak the timings for faster processors. This parameter is no longer needed

// as the current DHT reading algorithm adjusts itself to work on faster procs.

DHT dht(DHTPIN, DHTTYPE);




//inicializacion de los contadores

PZEM004Tv30 pzem0(Serial2, 16, 17);

float puerto;



String Imprimir3;

/**variables genericas para capturar todas las medidas*/

float voltage,current ,power, frequency,pf;



void setup() {


Serial.begin(9600);

Serial.println(F("DHTxx test!"));


dht.begin();

pinMode(2,OUTPUT);

// Uncomment in order to reset the internal energy counter

pzem0.resetEnergy();



}





void loop() {



Serial.print("Custom Address:");

//Serial.println(pzem.readAddress(), HEX);

//Serial.println(pzem.readAddress());


Serial.println(pzem0.getAddress());

//Custom Address:248

//Error reading voltage



puerto=pzem0.getAddress();


Serial.print("Read Custom Address:");

Serial.println(puerto);


if (puerto>0)

{


digitalWrite(2,HIGH);

Serial.print("Medidor 0 :( ");

Serial.print(pzem0.readAddress(), HEX);

Serial.print(") Medidas: ");


// Read the data from the sensor

voltage = pzem0.voltage(); //Volt

current = pzem0.current(); //Amp

power = pzem0.power(); //watt

//float energy = pzem0.energy(); //kwh

frequency = pzem0.frequency(); //hz

pf = pzem0.pf();




Serial.print ("M0 AGREGADO I=");

Serial.print (current);


Serial.print (" W=");

Serial.print (power);


Serial.print (" pf=");

Serial.print (pf);


Serial.print (" V=");

Serial.print (voltage);



Serial.print (" f=");

Serial.print (frequency);


// Serial.println ((String)voltage+";"+(String)current+";"+(String)power+";"+(String)frequency+";"+(String)pf);

// Wait a few seconds between measurements.

delay(2000);


// Reading temperature or humidity takes about 250 milliseconds!

// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

float h = dht.readHumidity();

// Read temperature as Celsius (the default)

float t = dht.readTemperature();

// Read temperature as Fahrenheit (isFahrenheit = true)

float f = dht.readTemperature(true);



// Check if any reads failed and exit early (to try again).

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println(F("Failed to read from DHT sensor!"));

return;

}



// Compute heat index in Fahrenheit (the default)

float hif = dht.computeHeatIndex(f, h);

// Compute heat index in Celsius (isFahreheit = false)

float hic = dht.computeHeatIndex(t, h, false);



Serial.print(F("Humidity: "));

Serial.print(h);

Serial.print(F("% Temperature: "));

Serial.print(t);

Serial.print(F("°C "));

Serial.print(f);

Serial.print(F("°F Heat index: "));

Serial.print(hic);

Serial.print(F("°C "));

Serial.print(hif);

Serial.println(F("°F"));

}

}

Destacar que aunque este código no será necesario en la integración con Home Assitant, pero si es conveniente antes de desplegarlo en el ESP32 , para probar que el montaje funciona correctamente y que no nos hemos equivocado en nada , ya que el código Arduino anterior es funcional al 100% .

Os mostramos como hemos probado el montaje antes de llevarlo su ubicación junto al cuadro de distribución de ca:

Si hemos desplegado el código anterior correctamente los dos leds TX/RX del PZEM004 deberían parpadear al unísono y desde la consola serie de Arduino ver todas la lecturas de tensión, corriente, potencia, frecuencia, factor de potencia así como la temperatura y la humedad. !buena suerte!.

Conexión de un ESP32 a un PZEM004


El Pzem004 es un módulo de prueba de monitorización eléctrica que incluye un transformador de corriente que viene además ya calibrado. El módulo puede usarse para medir la energía, el voltaje y la corriente, y luego mostrarlo en un PC u otros terminales ofreciendo una precisión del 1%.

En la versión con display incluye un botón de restablecimiento que puede restablecer los datos de energía simplemente pulsándolo. Además, puede almacenar datos cuando se apaga, y almacenar los datos de energía acumulados antes de apagarse, por lo que es muy conveniente usarlo.

Gracias a que todas las versiones equipan un interfaz de comunicación de datos serie TTL, puede leer y configurar los parámetros relevantes a través del puerto serie que podemos capturar con un microcontrolador como por ejemplo un ESP32.

En efecto usando la Biblioteca Arduino para Peacefair  en un ESP32 y un PZEM-004T-100A v3.0 podemos construir un Monitor de energía usando la interfaz ModBUS.

Antes de empezar debemos saber que la versión 3.0 PZEM es una versión mejorada de la anterior PZEM-004T (para la que puede encontrar la biblioteca aquí aunque las bibliotecas son incompatibles entre las dos versiones de hw).

Las principales características de este módulo son las siguientes;

  • Mide voltaje, corriente, potencia, energía, factor de potencia y frecuencia (nuevo en la versión 3.0)
  • 247 direcciones esclavas programables únicas
  • Contador de energía interna hasta 9999.99kWh
  • Alarma de sobrealimentación
  • Puesta a cero del contador de energía
  • Suma de comprobación CRC16
  • Mejor, pero no perfecto aislamiento de red

Especificaciones del fabricante

FunciónRango de mediciónResoluciónPrecisión
Voltaje80~260V0.1V0,5%
Actual0~10A o 0~100A*0.01A o 0.02A*0,5%
Poder activo0~2,3kW o 0~23kW*0.1W0,5%
energía activa0~9999.99kWh1Wh0,5%
Frecuencia45~65Hz0,1 Hz0,5%
Factor de potencia0,00~1,000.011%

* Uso del transformador de corriente externo en lugar del derivador incorporado

Este módulo es una versión mejorada del PZEM-004T con funciones de medición de frecuencia y factor de potencia, disponible en los lugares habituales. Se comunica mediante una interfaz TTL a través de un protocolo de comunicación similar a Modbus-RTU, pero es incompatible con la biblioteca @olehs anterior que se encuentra aquí: https://github.com/olehs/PZEM004T&nbsp;. 

Compatibilidad con Arduino

A continuación mostramos la compatibilidad con diferentes microcontroladores:

UCMSerie de hardwareSerie de softwareNo probadoEjemplosnotas
ATmega168XHardware Serie Software Serie
ATmega328 ( Arduino Uno)( ✅)✔️Hardware Serie Software SerieHW Serial entra en conflicto con la salida de depuración. Sin embargo, se puede usar sin tener ninguna salida de consola serie
ATmega2560 ( Arduino Mega​​)✔️✔️Hardware Serie Software Serie
ESP8266( ✅)✔️SoftwareSerialHW Serial entra en conflicto con la salida de depuración Serial
ESP32✔️HardwareSerieSW Serial no es realmente necesario ya que ESP32 tiene 3 seriales HW con pines configurables
STM32X

Comunicación en serie


Este módulo está equipado con una interfaz de comunicación de datos en serie TTL, puede leer y configurar los parámetros relevantes a través del puerto en serie; pero si desea comunicarse con un dispositivo que use USB o RS232 (como un ordenador), debe estar equipado con un adaptador TTL diferente (la comunicación USB debe estar equipada con una placa adaptadora de conexiones TTL a USB y la comunicación RS232 debe estar equipada con un adaptador TTL a niveles RS232)

En la siguiente tabla se encuentran los protocolos de comunicación de este módulo:

NoFunciónCabezaDatos1- Datos5Suma
1aRequerimiento de voltajeB0C0 A8 01 01 00 (La computadora envía una solicitud para leer el valor del voltaje)1A
1bRespuesta de voltajeA000 E6 02 00 00 (Respuesta del medidor, el valor del voltaje es 230,2 V)88
2aRequerimiento actualB1C0 A8 01 01 00 (La computadora envía una solicitud para leer el valor actual)1B
2bRepresentante actualA100 11 20 00 00 (Respuesta del medidor, el valor actual es 17.32A)D2
3aRequerimiento de potencia activaB2C0 A8 01 01 00 (La computadora envía una solicitud para leer el valor de potencia activa)1C
3bPotencia activa Resp.A208 98 00 00 00 (Respuesta del medidor, el valor de potencia activa es 2200w)42
4aLeer energía ReqB3C0 A8 01 01 00 (La computadora envía una solicitud para leer el valor de energía)1D
4bLeer energía Resp.A301 86 9f 00 00 (Respuesta del medidor, el valor de energía es 99999wh)C9
5aEstablecer la dirección del módulo ReqB4C0 A8 01 01 00 (La computadora envía una solicitud para configurar la dirección, la dirección es 192.168.1.1)1E
5bEstablecer la dirección del módulo resp.A400 00 00 00 00 (Respuesta del medidor, la dirección se estableció correctamente)A4
6aEstablecer el umbral de alarma de potencia ReqB5C0 A8 01 01 14 (la computadora envía una solicitud para establecer un umbral de alarma de energía)33
6bEstablecer el umbral de alarma de potencia RespA500 00 00 00 00 (El medidor responde que el umbral de alarma de energía se configuró correctamente)A5

Veamos ahora un ejemplo de protocolo de comunicación:

1-Configure la dirección de comunicación: 192.168.1.1 (el usuario puede configurar su propia dirección en función de sus preferencias y necesidades).

Enviar comando: B4 C0 A8 01 01 00 1E –>Datos de respuesta: A4 00 00 00 00 00 A4 .

Nota: El envío de comandos y la respuesta automática de datos son como se muestra arriba, los datos se expresan en hexadecimal; el último byte de los datos de envío y respuesta son 1E y A4, pertenecen a la suma acumulativa. En el envío de comandos: B4 + C0 + A8 + 01 + 01 + 00 = 21E (utilice la suma hexadecimal), los datos de suma acumulada son 21E, tome los dos últimos bytes 1E para utilizar los datos de suma acumulada en el envío de comandos; datos en respuesta: A4 + 00 + 00 + 00 + 00 + 00 = A4 (use la suma hexadecimal), la suma acumulada de datos es A4, que es la suma acumulada de datos en respuesta.

2-Configure el umbral de alarma de potencia: 20 KW
Comando de envío: B5 C0 A8 01 01 14 33–>Datos de respuesta: A5 00 00 00 00 00 A5
Nota : 14 en el comando de envío es el valor de la alarma (14 es una representación de datos hexadecimales, que se convirtió a decimal es 20). Lo que debe tener en cuenta es que el valor de alarma de potencia de este módulo se basa en unidades KW, lo que significa que el valor mínimo de alarma es 1 KW, el valor máximo es 22 KW.

3-Leer el voltaje actual
Enviar comando: B0 C0 A8 01 01 00 1A–>Datos de respuesta: A0 00 E6 02 00 00 88
Nota : Los datos de voltaje de respuesta son D1D2D3 = 00 E6 02, 00 E6 representa el bit entero del voltaje, 02 representa el decimal del voltaje, el decimal es un dígito, convierte 00 E6 en decimal es 230; convierte 02 a decimal es 2, por lo que el valor de voltaje actual es 230.2V.

4-Leer el comando de envío actual actual

Enviar comando: B1 C0 A8 01 01 00 1B–>Datos de respuesta: A1 00 11 20 00 00 D2
Nota : Los datos actuales de respuesta son D2D3 = 11 20, 11 representan el bit entero de la corriente, 20 representan el decimal del actual, el decimal actual es de dos dígitos, convierte 11 en decimal es 17; convierte 20 a decimal es 32, por lo que el valor actual actual es 17,32 A.

5-Leer el comando de envío de energía actual

Enviar comando:: B2 C0 A8 01 01 00 1C–>Datos de respuesta: A2 08 98 00 00 00 42
Nota : Los datos de energía de respuesta son D1D2 = 08 98, convierte 08 98 a decimal es 2200, por lo que el valor de voltaje actual es 2200W .

6-Leer el comando de envío de energía:

Enviar comando:B3 C0 A8 01 01 00 1D–>Datos de respuesta: A3 01 86 9F 00 00 C9
Nota : los datos de energía de respuesta son D1D2D3 = 01 86 9F, convierte 01 86 9F a decimal es 99999, por lo que la energía acumulada es 99999Wh .

Circuito Básico con ejemplo de código

Gracias a la biblioteca PZEM-004T v3.0 para el monitor de energía Peacefair PZEM-004T-10A y PZEM-004T-100A v3.0 utilizando la interfaz ModBUS y una placa ESP32, podemos monitorizar el consumo eléctrico junto a otras variables eléctricas como la tensión , la frecuencia , el factor de potencia, etc.

Es interesante destacar que debemos usar la ultima version del modulo, pues la versión 3.0 PZEM es una versión mejorada del antiguo PZEM-004T 

Respecto a las conexiones eléctricas debemos tener especialmente cuidado en el conexionado de las clemas de BT , las cuales viene claramente especificadas en la hoja de característica del modulo PZEM que usemos, pues una parte es para la medida del voltaje ( la medición se hace en paralelo ) y la parte contigua es la parte de la medida de la Intensidad (la medida se toma en serie en versiones de menos intensidad maxima admisible, pero para la version de 100A se suele tomar con una bobina toroidal o con un pinza amperimétrica)

¡Asegúrese de que el dispositivo esté conectado a la alimentación de CA! Los 5V solo alimentan los optoacopladores, no el chip real. Además, tenga cuidado, ¡la corriente alterna es peligrosa! ¡Si no sabe lo que estás haciendo, puede morir ! Es usted responsable de su propia estupidez. Así que no sea estúpido

Peor tanto ,debemos extremar el cuidado especialmente en estas conexiones (las que van con tornillo).

Observe por ejemplo las conexiones del módulo de 100 Amp. usado para escribir este post:

Esta versión PZEM tiene una UART Serial que funciona a 5V, por lo que se debe realizar una simple modificación soldando una resistencia de 1K a 1/4W para permitir que la comunicación funcione a 3.3v en los casos de placas como Raspberry Pi, ESP32 y esp8266, con esta modificación la UART funcionará a 5v o 3.3v.

Nota: Esta es la manera más sencilla y económica si no tienen al alcance un convertidor TTL de 5 a 3.3v, pero no se garantiza que funcione en todos los casos y con todos los medidores (en el prototipo probado funciona sin problemas).

Respecto a las conexiones del PZEM004 con una placa ESP32 , estas son las siguientes:

  • TX ->GPIO17 (pin 7)
  • RX ->GPIO16 (pin 6) (podemos conectar una resistencia de 1K entre este y GND ).
  • GND->GND DE SP32 (pin 2)
  • VCC->3.3 DE ESP32 (pin 1)


Vamos a seguir un esquema bastante sencillo que puede ser adaptado a distintas necesidades y montajes. Por ahora, y para realizar las pruebas podemos usar el siguiente simple esquema:

Por el interior del anillo tendremos que pasar el cable de Fase (Negro) sobre el que queramos realizar las mediciones, pudiendo ser el mismo, o no, que el que hemos usado para dar corriente al circuito.

Nota: Algunos módulos ESP permiten la salida de corriente 5V por el pin, otros no. Si vas a alimentar el módulo ESP con un cable USB y desde sus pines 5V/VCC y GND alimentar el módulo PZEM-004T comprueba que estos pines ofrezcan la corriente deseada.

Dado que realmente el módulo ESP funciona a 3,3V y si se desea alimentar el módulo PZEM-004T con este voltaje, se recomienda colocar una resistencia de 1K entre 5V y RX del propio PZEM-004T. La Web de Tasmota tiene mucha información al respecto.

Para ciertamente este montaje no conlleve ningún peligro debemos aislar ambas placas (por ejemplo en una caja de conexiones) para asegurarnos de que no recibimos ninguna descarga eléctrica fortuita tal y como podemos ver en el prototipo de abajo donde se usa un Arduino uno en lugar de un ESp32.

Compatibilidad

PRINCIPALES CARACTERÍSTICAS
  • Mide voltaje, corriente, potencia, energía, factor de potencia y frecuencia (nuevo en la versión 3.0)
  • 247 direcciones esclavas programables únicas
  • Contador de energía interno hasta 9999,99kWh
OTRAS CARACTERÍSTICAS
  • Alarma de sobrecarga
  • Reinicio del contador de energía
  • Suma de comprobación CRC16
  • Aislamiento de red mejor, pero no perfecto

Código arduino:

A continuación vemos un ejemplo básico de código Arduino para probar nuestro montaje mostrando a traves del puerto serie a 115200 las medidas de potencia, tensión , corriente, frecuencia y factor de potencia a intervalos de unos 20ms.

#include <PZEM004Tv30.h>

/* Hardware Serial2 is only available on certain boards.
 * For example the Arduino MEGA 2560
*/
#if defined(ESP32)
PZEM004Tv30 pzem(Serial2, 16, 17);
#else
PZEM004Tv30 pzem(Serial2);
#endif

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

    // Uncomment in order to reset the internal energy counter
    // pzem.resetEnergy()
}

void loop() {
        
    Serial.print("Custom Address:");
    Serial.println(pzem.readAddress(), HEX);

    // Read the data from the sensor
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();

    // Check if the data is valid
    if(isnan(voltage)){
        Serial.println("Error reading voltage");
    } else if (isnan(current)) {
        Serial.println("Error reading current");
    } else if (isnan(power)) {
        Serial.println("Error reading power");
    } else if (isnan(energy)) {
        Serial.println("Error reading energy");
    } else if (isnan(frequency)) {
        Serial.println("Error reading frequency");
    } else if (isnan(pf)) {
        Serial.println("Error reading power factor");
    } else {

        // Print the values to the Serial console
        Serial.print("Voltage: ");      Serial.print(voltage);      Serial.println("V");
        Serial.print("Current: ");      Serial.print(current);      Serial.println("A");
        Serial.print("Power: ");        Serial.print(power);        Serial.println("W");
        Serial.print("Energy: ");       Serial.print(energy,3);     Serial.println("kWh");
        Serial.print("Frequency: ");    Serial.print(frequency, 1); Serial.println("Hz");
        Serial.print("PF: ");           Serial.println(pf);

    }

    Serial.println();
    delay(2000);
}

Por supuesto este código lo podemos mejorar salvando por ejemplo los datos en una SD, enviando los datos a un proveedor de IoT y un largo etc

Mas información en https://github.com/mandulaj/PZEM-004T-v30