PZEM004 V3

User avatar
QLQ
Posts: 814
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Wed Jun 12, 2019 8:50 pm

Tak jak pisałem . Zakładam nowy temat dotyczący licznika energii z Ali PZEM004t.
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
V3_PZEM004.rar
(1.22 MiB) Downloaded 53 times


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
Clip_3.jpg
Clip_3.jpg (11.78 KiB) Viewed 1310 times
V3_PZEM004.rar
(1.22 MiB) Downloaded 53 times
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);
    }
pz.jpg
pz.jpg (225.6 KiB) Viewed 1307 times

POWIĄZANE ABY NIE DUBLOWAĆ:
viewtopic.php?f=17&t=3981&start=340
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
dawidd
Posts: 433
Joined: Tue Dec 19, 2017 12:45 pm

Thu Jun 13, 2019 5:06 am

QLQ chyba powinieneś dostać medal za samozaparcie :) brawo
Czekam teraz na suple i tez sobie takie coś poskładam
User avatar
QLQ
Posts: 814
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Fri Jun 14, 2019 10:52 pm

Hmmm...może jakiś konkurs...9 płytek pod PZEM004_V2 lub V3 do rozdania.
Muszę coś wymyślić z tym licznikem..
20190615_004845.jpg
20190615_004845.jpg (336.15 KiB) Viewed 1178 times
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
QLQ
Posts: 814
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Tue Jun 18, 2019 6:44 pm

Mam już płytki pod 1 i 3 razy pod pzem
IMG_20190618_204322.jpg
IMG_20190618_204322.jpg (147.05 KiB) Viewed 1085 times
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
lesny8
Posts: 790
Joined: Mon Dec 11, 2017 9:43 pm

Tue Jun 18, 2019 9:35 pm

Myślałem, że ta płytka na 3 fazy będzie rozmiarowo 3x większa :shock: Jak się to tam ma zmieścić, chyba że jedno na drugie i podłączone przewodami?
Do mnie PZEM-004 jeszcze nie dopłynęły :?
User avatar
QLQ
Posts: 814
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Tue Jun 18, 2019 9:45 pm

Pzem'y podlaczamy 3 szt pzem x4 kablami w złącza pzem1,2,3. Masz wszystko łacznie z jpg w tym rar co Tobie wcxesniej wyslałem.
Soft tak czy inaczej można pisać pod wemos nie mając płytek bo i tak rx tx podłączonamy np pod d1 i d2. Pakuje i wysyłam. Napisz ile chcesz płytek. Mogę wysłać też tego uszkodzonego aczkolwiek dzialajacego.oraz sprawną nową wersję v3 pzem zgodnie z opisem w zrób sam w sprzęcie. Kupiłem Jeszce 2 sieci tak będę miał. Daj znać adres mam to.jutro mogę wysłać.
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
lesny8
Posts: 790
Joined: Mon Dec 11, 2017 9:43 pm

Tue Jun 18, 2019 10:21 pm

To jak podłączyć to wiem, tylko myślałem, że trójka będzie większa od jedyki :)
Po sztuce płytek wystarczy.
User avatar
Robert Błaszczak
Posts: 479
Joined: Sat Dec 22, 2018 8:55 pm
Location: Zielona Góra
Contact:

Thu Jul 04, 2019 5:14 pm

Znalazłem ciekawą bibliotekę obsługującą PZEM-004T V3: https://github.com/mandulaj/PZEM-004T-v30

Pomiar wszystkich wartości na ESP8266 (u mnie na D1 mini):

Code: Select all

#include <PZEM004Tv30.h>        // biblioteka OZEM-004T v.3 https://github.com/mandulaj/PZEM-004T-v30.

PZEM004Tv30 pzem(4, 5);


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

  // Funkcja zerowania licznika energii. Zerowanie następuje przy każdym uruchomieniu programu. Aby wyłączyć zerowanie dodaj znacznik komentarza przed poniższymi 6 liniami.
    Serial.println();
    Serial.println();
    Serial.println("ZEROWANIE LICZNIKA ENERGII");
    Serial.println();
    Serial.println();
    pzem.resetEnergy();
}

void loop() {

  // Wyświetlenie wartości mierzonych w monitorze portu szeregowego.
  
    float voltage = pzem.voltage();
    Serial.print(voltage, 1); Serial.print(" V | ");

    float frequency = pzem.frequency();
    Serial.print(frequency, 1); Serial.print(" Hz | ");

    float current = pzem.current();
    Serial.print(current, 3); Serial.print(" A | ");

    float power = pzem.power();
    Serial.print(power, 1); Serial.print(" W | ");

    float power_factor = pzem.pf();
    Serial.print(power_factor, 2); Serial.print(" cos ø | ");

    float energy = pzem.energy();
    Serial.print(energy, 3); Serial.println(" kWh");

  // Odczyt wartości mierzonych z interwałem 5 sekund.
    delay(5000);
}
Trochę potestowałem pod różnymi obciążeniami i wartości pomiarowe wydają być się prawidłowe.
Pozdrawiam
Robert Błaszczak
https://www.blaszczak.pl
User avatar
QLQ
Posts: 814
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Thu Jul 04, 2019 5:30 pm

Robert Błaszczak wrote:
Thu Jul 04, 2019 5:14 pm
Znalazłem ciekawą bibliotekę obsługującą PZEM-004T V3: https://github.com/mandulaj/PZEM-004T-v30

Pomiar wszystkich wartości na ESP8266 (u mnie na D1 mini):

Code: Select all

#include <PZEM004Tv30.h>        // biblioteka OZEM-004T v.3 https://github.com/mandulaj/PZEM-004T-v30.

PZEM004Tv30 pzem(4, 5);


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

  // Funkcja zerowania licznika energii. Zerowanie następuje przy każdym uruchomieniu programu. Aby wyłączyć zerowanie dodaj znacznik komentarza przed poniższymi 6 liniami.
    Serial.println();
    Serial.println();
    Serial.println("ZEROWANIE LICZNIKA ENERGII");
    Serial.println();
    Serial.println();
    pzem.resetEnergy();
}

void loop() {

  // Wyświetlenie wartości mierzonych w monitorze portu szeregowego.
  
    float voltage = pzem.voltage();
    Serial.print(voltage, 1); Serial.print(" V | ");

    float frequency = pzem.frequency();
    Serial.print(frequency, 1); Serial.print(" Hz | ");

    float current = pzem.current();
    Serial.print(current, 3); Serial.print(" A | ");

    float power = pzem.power();
    Serial.print(power, 1); Serial.print(" W | ");

    float power_factor = pzem.pf();
    Serial.print(power_factor, 2); Serial.print(" cos ø | ");

    float energy = pzem.energy();
    Serial.print(energy, 3); Serial.println(" kWh");

  // Odczyt wartości mierzonych z interwałem 5 sekund.
    delay(5000);
}
Trochę potestowałem pod różnymi obciążeniami i wartości pomiarowe wydają być się prawidłowe.
O! To super. Zaraz zobaczę.
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
maly_13
Posts: 47
Joined: Fri Oct 28, 2016 3:55 am
Location: Wlkp.

Wed Jul 10, 2019 8:22 am

na testy się pisze ale żeby coś napisać to nie na moje zdolności. Można odkupić płytkę?
w użyciu: supla, nettemp...
Post Reply