36class ThreePhasePZEMv3 :
public ElectricityMeter {
38#if defined(PZEM004_SOFTSERIAL)
39 ThreePhasePZEMv3(int8_t pinRX1,
45 : pzem{PZEM004Tv30(pinRX1, pinTX1),
46 PZEM004Tv30(pinRX2, pinTX2),
47 PZEM004Tv30(pinRX3, pinTX3)} {
52 ThreePhasePZEMv3(HardwareSerial *serial1,
55 HardwareSerial *serial2,
58 HardwareSerial *serial3,
61 : pzem{PZEM004Tv30(serial1, pinRx1, pinTx1),
62 PZEM004Tv30(serial2, pinRx2, pinTx2),
63 PZEM004Tv30(serial3, pinRx3, pinTx3)} {
66 ThreePhasePZEMv3(HardwareSerial *serial1,
67 HardwareSerial *serial2,
68 HardwareSerial *serial3)
69 : pzem{PZEM004Tv30(serial1), PZEM004Tv30(serial2), PZEM004Tv30(serial3)} {
74 lastReadTime = millis();
75 readValuesFromDevice();
76 updateChannelValues();
79 virtual void readValuesFromDevice() {
80 bool atLeatOnePzemWasRead =
false;
81 for (
int i = 0; i < 3; i++) {
82 float current = pzem[i].current();
86 resetReadParametersForPhase(i);
90 atLeatOnePzemWasRead =
true;
92 float voltage = pzem[i].voltage();
93 float active = pzem[i].power();
94 float apparent = (voltage * current);
96 if (apparent > active) {
97 reactive = sqrt(apparent * apparent - active * active);
102 setVoltage(i, voltage * 100);
103 setCurrent(i, current * 1000);
104 setPowerActive(i, active * 100000);
105 setFwdActEnergy(i, pzem[i].energy() * 100000);
106 setPowerFactor(i, pzem[i].pf() * 1000);
107 setPowerApparent(i, apparent * 100000);
108 setPowerReactive(i, reactive * 10000);
110 setFreq(pzem[i].frequency() * 100);
113 if (!atLeatOnePzemWasRead) {
114 resetReadParameters();
118 void resetStorage() {
119 for (
int i = 0; i < 3; i++) {
120 pzem[i].resetEnergy();