https://pl.aliexpress.com/item/PZEM-004 ... 2e0ednKqk9
Obecna wersja obsługuje odczyt parametrów:
- napięcia
- prądu
-mocy
-energii (zapisuje je w swojej pamięci - w przypadku zaniku zasilania)
-częstotliwości
-współczynnika mocy.
PZEM004 V3 dotarł w pń do mnie i został przeze mnie przetestowany za pomocą programu pod niego dedykowanego przez producenta oraz pod arduino sprzęgnięty z WEMos D1 mini.
Wszystko co mam do tego modułu razem z gerberami, opisem komunikacji zawieram poniżej.
Na Githubie użytkownik brunohorta82 udostępnił gerbery pod płytki 1faz i 3faz wraz z licencją MIT.
https://github.com/brunohorta82/BH_PZEM_ESP8266 - GERBERY
PROGRAM POD ARDUINO, program producenta, opis komunikacjiw PDF
Nadmieniam że pliki powyższe są znalezione w sieci i nie jestem ich autorem, chcę tylko Was zainteresować tematem , który od czasu do czasu przypominam gdyż uważam, że PZEM004 jest fajną alternatywą licznika energii dla chcących coś pomajsterkować. Nie chcę tu robić żadnej konkurencji innych modułów.
Tak wygląda odczyt z Arduino przy pomocy WeMos (RX, TX, GND, 5V):
Przepraszam że wartości zerowe ale młodzież śpi a nie chcę hałasować i podłączać coś energożarłocznego musicie mi uwierzyć że działa Programik Arduino bardzo prosty - wyczytanie wartości śmiesznie proste -TYLKO JAK TO WYSŁAĆ DO ENERGYMETER ?!
Code: Select all
/*
An Arduino Sketch for reading data from a PZEM-014 or PZEM-016
Uses this library: http://4-20ma.io/ModbusMaster/
*/
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial pzemSerial(4,5); //rx, tx
ModbusMaster node;
static uint8_t pzemSlaveAddr = 0x01;
#define LEDPIN 13
void setup() {
pzemSerial.begin(9600);
Serial.begin(9600);
// resetEnergy(pzemSlaveAddr);
node.begin(pzemSlaveAddr, pzemSerial);
pinMode(13, OUTPUT);
digitalWrite(LEDPIN,0);
}
/*
RegAddr Description Resolution
0x0000 Voltage value 1LSB correspond to 0.1V
0x0001 Current value low 16 bits 1LSB correspond to 0.001A
0x0002 Current value high 16 bits
0x0003 Power value low 16 bits 1LSB correspond to 0.1W
0x0004 Power value high 16 bits
0x0005 Energy value low 16 bits 1LSB correspond to 1Wh
0x0006 Energy value high 16 bits
0x0007 Frequency value 1LSB correspond to 0.1Hz
0x0008 Power factor value 1LSB correspond to 0.01
0x0009 Alarm status 0xFFFF is alarm,0x0000is not alarm
*/
void loop() {
uint8_t result;
digitalWrite(LEDPIN,1);
result = node.readInputRegisters(0x0000, 9); //read the 9 registers of the PZEM-014 / 016
digitalWrite(LEDPIN,0);
if (result == node.ku8MBSuccess)
{
float voltage = node.getResponseBuffer(0x0000) / 10.0;
uint16_t tempWord;
float current;
tempWord = 0x0000;
tempWord |= node.getResponseBuffer(0x0002); //LowByte
tempWord |= node.getResponseBuffer(0x0001) << 8; //highByte
current = tempWord;
float power;
tempWord = 0x0000;
tempWord |= node.getResponseBuffer(0x0004); //LowByte
tempWord |= node.getResponseBuffer(0x0003) << 8; //highByte
power = tempWord;
uint16_t energy;
tempWord = 0x0000;
tempWord |= node.getResponseBuffer(0x0006); //LowByte
tempWord |= node.getResponseBuffer(0x0005) << 8; //highByte
energy = tempWord;
Serial.print(voltage);
Serial.print("V ");
Serial.print(current);
Serial.print("A ");
Serial.print(power);
Serial.print("W ");
Serial.print((node.getResponseBuffer(0x0008))/100.0);
Serial.print("PowFac ");
Serial.print((node.getResponseBuffer(0x0007))/10.0);
Serial.print("Hz ");
Serial.print(energy);
Serial.print("Wh ");
Serial.println();
} else {
Serial.println("Failed to read modbus");
}
delay(2000);
}
void resetEnergy(uint8_t slaveAddr){
//The command to reset the slave's energy is (total 4 bytes):
//Slave address + 0x42 + CRC check high byte + CRC check low byte.
uint16_t u16CRC = 0xFFFF;
static uint8_t resetCommand = 0x42;
u16CRC = crc16_update(u16CRC, slaveAddr);
u16CRC = crc16_update(u16CRC, resetCommand);
Serial.println("Resetting Energy");
pzemSerial.write(slaveAddr);
pzemSerial.write(resetCommand);
pzemSerial.write(lowByte(u16CRC));
pzemSerial.write(highByte(u16CRC));
delay(1000);
}
POWIĄZANE ABY NIE DUBLOWAĆ:
viewtopic.php?f=17&t=3981&start=340