Medidor de energia PZEM-004T v3.0 (10 A)
Medidor de energia da rede elétrica (corrente alternada): mede tensão, corrente, potência, energia acumulada, frequência e fator de potência, e manda os valores pela UART com o protocolo Modbus-RTU (9600 baud, 8N1). O programa envia um pedido com CRC e confere o CRC da resposta antes de usar os números. Na bancada a carga (potência, fator de potência, tensão da rede) é escolhida no painel da peça. No módulo de verdade o lado da rede tem 127/220 V: só monte com o professor.
Pinagem
| Pino | Ligar em | Observação |
|---|---|---|
| 5V | VIN (5 V) | o conector TTL é passivo: precisa de 5 V de fora |
| RX | TX da UART (ex.: TX2, GPIO17) | o pedido Modbus entra aqui |
| TX | RX da UART (ex.: RX2, GPIO16) | a resposta sai daqui |
| GND | GND | sem os 4 fios ligados ele não comunica |
A IA que lembra da sua vida e mora no seu computador
- Memória de longo prazo com a fonte de cada resposta
- Funciona offline: seus dados ficam no seu PC
- Lê PDFs, slides, fotos e gravações de reunião
Plano Essencial grátis para sempre
Exemplo em MicroPython
from machine import UART
import struct, time
# RX do PZEM no TX2 (GPIO17), TX do PZEM no RX2 (GPIO16), 5V no VIN, GND no GND
# timeout_char maior que os 26 ms da resposta de 25 bytes a 9600 baud
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 registradores a partir do 0x0000
c = crc16(pedido)
uart.write(pedido + bytes([c & 0xFF, c >> 8])) # CRC: byte baixo primeiro
r = uart.read(25)
if r is None or len(r) != 25 or crc16(r[:-2]) != r[-2] | r[-1] << 8:
return None # sem resposta ou CRC errado: 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)
Especificações
| Item | Valor | Fonte |
|---|---|---|
| Comunicação | 9600 baud, 8 bits, sem paridade, 1 stop; 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; passivo, precisa de 5 V de fora; os 4 ligados | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Endereços | 0x01–0xF7; 0x00 = broadcast (sem resposta); 0xF8 = geral (um aparelho só na linha) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Funções | 0x04 lê medidas, 0x03 lê parâmetros, 0x06 grava parâmetro, 0x42 zera a energia, 0x41 calibração | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Registradores de medida (0x04) | 0x0000 tensão (0,1 V); 0x0001–0x0002 corrente (1 mA); 0x0003–0x0004 potência (0,1 W); 0x0005–0x0006 energia (1 Wh); 0x0007 frequência (0,1 Hz); 0x0008 FP (0,01); 0x0009 alarme (0xFFFF) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Parâmetros (0x03/0x06) | 0x0001 limite do alarme (1 W); 0x0002 endereço (0x0001–0x00F7) | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| Faixas (modelo de 10 A) | 80–260 V; 0–10 A (mede a partir de 0,01 A); 0–2,3 kW (a partir de 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 |
| Erros | função + 0x80 e o código: 0x01 função, 0x02 endereço, 0x03 dado, 0x04 escravo | Manual "PZEM-004T V3.0 User Manual" (AC communication module), narodmon.com/img/sens/PZEM-004Tv3.pdf |
| CRC | CRC-16, polinômio 0xA001, byte baixo primeiro | MODBUS over Serial Line V1.02 (modbus.org), seções 2.5.1 e 6.2.2; github.com/mandulaj/PZEM-004T-v30 (src/PZEM004Tv30.cpp, setCRC) — Em verificação: as tabelas do manual põem o byte alto primeiro |
| Ler a resposta | 25 bytes levam ≈ 26 ms a 9600 baud: use timeout_char acima disso (ex.: 50 ms) | MicroPython v1.29.0: ports/esp32/machine_uart.c (mp_machine_uart_read) |
| Tempo de resposta e atualização | não estão no manual; aqui responde 3,5 caracteres depois do fim do pedido e mede na hora | MODBUS over Serial Line V1.02 (modbus.org), seções 2.5.1 e 6.2.2 — Em verificação: medir no módulo |
| Endereço e limite de fábrica | 0x01 e 2300 W no simulador | Catálogo de componentes do PyPlaca — Em verificação: o manual não dá os valores de fábrica |
| Falhas na bancada | sem resposta, CRC inválido, resposta de outro endereço: simulam a linha, não o aparelho | Catálogo de componentes do PyPlaca |
Valores com "Em verificação" ainda vão ser conferidos nas peças do laboratório.