PZEM004 V3

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

Post

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


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
V3_PZEM004.rar
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

POWIĄZANE ABY NIE DUBLOWAĆ:
viewtopic.php?f=17&t=3981&start=340
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
User avatar
dawidd
Posts: 630
Joined: Tue Dec 19, 2017 12:45 pm

Post

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

Post

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
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
User avatar
QLQ
Posts: 2342
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

Mam już płytki pod 1 i 3 razy pod pzem
IMG_20190618_204322.jpg
You do not have the required permissions to view the files attached to this post.
jak coś nie działa to włącz zasilanie.....
User avatar
lesny8
Posts: 2915
Joined: Mon Dec 11, 2017 9:43 pm

Post

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 :?
SOP 2023 :heavy_check_mark:
SOP 2024 :heavy_check_mark:
Czekam na kolejne Supla Offline Party :upside_down_face:
User avatar
QLQ
Posts: 2342
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

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ć.
jak coś nie działa to włącz zasilanie.....
User avatar
lesny8
Posts: 2915
Joined: Mon Dec 11, 2017 9:43 pm

Post

To jak podłączyć to wiem, tylko myślałem, że trójka będzie większa od jedyki :)
Po sztuce płytek wystarczy.
SOP 2023 :heavy_check_mark:
SOP 2024 :heavy_check_mark:
Czekam na kolejne Supla Offline Party :upside_down_face:
User avatar
Robert Błaszczak
Posts: 4325
Joined: Sat Dec 22, 2018 8:55 pm
Location: Zielona Góra

Post

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


Moja prywatna strona: www.blaszczak.pl
User avatar
QLQ
Posts: 2342
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

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ę.
jak coś nie działa to włącz zasilanie.....
maly_13
Posts: 114
Joined: Fri Oct 28, 2016 3:55 am
Location: Wlkp.

Post

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

Return to “Zrób to sam”