Medidor de energía PZEM-004T v3.0 (10 A)
Medidor de energía de la red eléctrica (corriente alterna): mide tensión, corriente, potencia, energía acumulada, frecuencia y factor de potencia, y envía los valores por la UART con el protocolo Modbus RTU (9600 baudios, 8N1). El programa envía un pedido con CRC y comprueba el CRC de la respuesta antes de usar los números. En la mesa de trabajo la carga (potencia, factor de potencia, tensión de la red) se elige en el panel de la pieza. En el módulo de verdad el lado de la red tiene 127/220 V: móntalo solo con tu profesor.
Distribución de pines
| Pin | Conectar a | Observación |
|---|---|---|
| 5V | VIN (5 V) | el conector TTL es pasivo: necesita 5 V de afuera |
| RX | TX de la UART (ej.: TX2, GPIO17) | el pedido Modbus entra por aquí |
| TX | RX de la UART (ej.: RX2, GPIO16) | la respuesta sale por aquí |
| GND | GND | sin los 4 cables conectados no se comunica |
La IA que recuerda tu vida y vive en tu ordenador
- Memoria a largo plazo con la fuente de cada respuesta
- Funciona sin conexión: tus datos se quedan en tu PC
- Lee PDF, diapositivas, fotos y grabaciones de reuniones
Plan Esencial gratis para siempre
Ejemplo en MicroPython
from machine import UART
import struct, time
# RX del PZEM al TX2 (GPIO17), TX del PZEM al RX2 (GPIO16), 5V a VIN, GND a GND
# timeout_char mayor que los 26 ms de la respuesta de 25 bytes a 9600 baudios
uart = UART(2, 9600, tx=17, rx=16, timeout=200, timeout_char=50)
def crc16(dados):
crc = 0xFFFF
for b in dados:
crc ^= b
for _ in range(8):
crc = (crc >> 1) ^ 0xA001 if crc & 1 else crc >> 1
return crc
def ler_medidas(endereco=0x01):
pedido = bytes([endereco, 0x04, 0, 0, 0, 10]) # 10 registros desde el 0x0000
c = crc16(pedido)
uart.write(pedido + bytes([c & 0xFF, c >> 8])) # CRC: byte bajo primero
r = uart.read(25)
if r is None or len(r) != 25 or crc16(r[:-2]) != r[-2] | r[-1] << 8:
return None # sin respuesta o CRC incorrecto: se descarta
v = struct.unpack('>10H', r[3:23])
return {'V': v[0] / 10, 'A': (v[1] | v[2] << 16) / 1000, 'W': (v[3] | v[4] << 16) / 10,
'Wh': v[5] | v[6] << 16, 'Hz': v[7] / 10, 'FP': v[8] / 100}
while True:
print(ler_medidas())
time.sleep(2)
Especificaciones
| Elemento | Valor | Fuente |
|---|---|---|
| Comunicación | 9600 baudios, 8 bits, sin paridad, 1 bit de parada; Modbus RTU | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Conector TTL | 5V, RX, TX, GND; pasivo, necesita 5 V de afuera; los 4 conectados | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Direcciones | 0x01–0xF7; 0x00 = broadcast (sin respuesta); 0xF8 = general (un solo aparato en la línea) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Funciones | 0x04 lee medidas, 0x03 lee parámetros, 0x06 graba un parámetro, 0x42 pone la energía en cero, 0x41 calibración | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Registros de medida (0x04) | 0x0000 tensión (0,1 V); 0x0001–0x0002 corriente (1 mA); 0x0003–0x0004 potencia (0,1 W); 0x0005–0x0006 energía (1 Wh); 0x0007 frecuencia (0,1 Hz); 0x0008 FP (0,01); 0x0009 alarma (0xFFFF) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Parámetros (0x03/0x06) | 0x0001 límite de la alarma (1 W); 0x0002 dirección (0x0001–0x00F7) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Rangos (modelo de 10 A) | 80–260 V; 0–10 A (mide desde 0,01 A); 0–2,3 kW (desde 0,4 W); 45–65 Hz; FP 0,00–1,00; 0–9999,99 kWh | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Errores | función + 0x80 y el código: 0x01 función, 0x02 dirección, 0x03 dato, 0x04 esclavo | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| CRC | CRC-16, polinomio 0xA001, byte bajo primero | MODBUS over Serial Line V1.02 (modbus.org), secciones 2.5.1 y 6.2.2; github.com/mandulaj/PZEM-004T-v30 (src/PZEM004Tv30.cpp, setCRC) — En verificación: las tablas del manual ponen el byte alto primero |
| Leer la respuesta | 25 bytes tardan ≈ 26 ms a 9600 baudios: usa un timeout_char mayor (ej.: 50 ms) | MicroPython v1.29.0: ports/esp32/machine_uart.c (mp_machine_uart_read) |
| Tiempo de respuesta y de actualización | no están en el manual; aquí responde 3,5 caracteres después del fin del pedido y mide en el momento | MODBUS over Serial Line V1.02 (modbus.org), secciones 2.5.1 y 6.2.2 — En verificación: medir en el módulo |
| Dirección y límite de fábrica | 0x01 y 2300 W en el simulador | Catálogo de componentes de PyPlaca — En verificación: el manual no da los valores de fábrica |
| Fallas en la mesa | sin respuesta, CRC inválido, respuesta de otra dirección: simulan la línea, no el aparato | Catálogo de componentes de PyPlaca |
Los valores con "En verificación" todavía se comprobarán en las piezas del laboratorio.