PZEM004 V3

Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

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) Pobrany 656 razy


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) Przejrzano 10612 razy
V3_PZEM004.rar
(1.22 MiB) Pobrany 656 razy
Programik Arduino bardzo prosty - wyczytanie wartości śmiesznie proste -TYLKO JAK TO WYSŁAĆ DO ENERGYMETER ?!

Kod: Zaznacz cały

    /*
    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) Przejrzano 10609 razy

POWIĄZANE ABY NIE DUBLOWAĆ:
viewtopic.php?f=17&t=3981&start=340
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

QLQ chyba powinieneś dostać medal za samozaparcie :) brawo
Czekam teraz na suple i tez sobie takie coś poskładam
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

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) Przejrzano 10480 razy
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Mam już płytki pod 1 i 3 razy pod pzem
IMG_20190618_204322.jpg
IMG_20190618_204322.jpg (147.05 KiB) Przejrzano 10387 razy
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
lesny8
Posty: 2803
Rejestracja: pn gru 11, 2017 9:43 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 :?
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

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.....
Awatar użytkownika
lesny8
Posty: 2803
Rejestracja: pn gru 11, 2017 9:43 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.
Czekam na kolejne Supla Offline Party 👍
Awatar użytkownika
Robert Błaszczak
Posty: 3945
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontakt:

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):

Kod: Zaznacz cały

#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
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Robert Błaszczak pisze: czw lip 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):

Kod: Zaznacz cały

#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
Posty: 92
Rejestracja: pt paź 28, 2016 3:55 am
Lokalizacja: Wlkp.

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

Wróć do „Zrób to sam”