Hilfe gesucht für den Strom-/Spannungs-/Leistungsmesser PZEM004T

Hallo allerseits!

Mein Ziel:

Mit dem PZEM Modul möchte ich im ersten Schritt einfach die Spannung, den Strom sowie die Leistung auf dem seriellen Monitor ausgeben.

Die Daten:

Den Code und die Bibliothek habe ich bereits von Github gezogen.

Das Problem:

Ich bekomme keine passende Ausgabe auf dem Monitor. Entweder, ich bekomme eine V=0.00 oder bei anderen Codes aus dem Netzt kommt ein -1 bei den Werten heraus.

Meine Frage:

Wie bekomme ich den Chip zum Laufen?

Mein Setup:

PZEM004T

Arduino Nano Clone

Den PZEM004T betreibe ich mit 3,3 Volt vom Arduino Board. Die Spule sowie die 230 V sind ebenfalls laut Plan angeschlossen.

Beispielcode:

#include <SoftwareSerial.h> // Arduino IDE <1.6.6
#include <PZEM004T.h>

PZEM004T pzem(&Serial1);
IPAddress ip(192,168,1,1);

void setup() {
 Serial.begin(9600);
 pzem.setAddress(ip);
}

void loop() {
 float v = pzem.voltage(ip);
 if (v < 0.0) v = 0.0;
 Serial.print(v);Serial.print("V; ");

 float i = pzem.current(ip);
 if(i >= 0.0){ Serial.print(i);Serial.print("A; "); }
 
 float p = pzem.power(ip);
 if(p >= 0.0){ Serial.print(p);Serial.print("W; "); }
 
 float e = pzem.energy(ip);
 if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); }

 Serial.println();

//  delay(1000);
}

Die Rx und Tx Pins vom PZEM004T habe ich hierbei auf den Arduino Pins 10/11/1 sowie 0 ausprobiert, allerdings bekomme ich nie das gewünschte Ergebnis.

Ich verstehe nicht, warum bei mir keine Ausgabe kommt. Laut diversen Posts im Internet, müsste mit diesem Standard-Code alles perfekt funktionieren - tut es bei mir aber nicht.

Es wäre super, wenn mir hier jemand auf die Sprünge helfen könnte!

Gruß
Matze

Setze den Sketch bitte in Code-Tags, dann kann man den auch mobil vernünftig lesen.
Schaltfläche </> oben links im Editorfenster.

Und das kannst du sogar noch nachträglich machen.

Edit:
In der Zeile “PZEM004T pzem(&Serial1);” passt die “1” nicht.
Und wozu brauchst du die Zeile mit der IP-Adresse ?

Ist abgeändert :wink:

Matzewu:
Ist abgeändert :wink:

Ok, danke.
Ich habe meinen letzten Post noch erweitert.

Als erstes habe ich die beiden Beispielscodes aus dem Github-Verzeichnis ausprobiert:

https://github.com/olehs/PZEM004Tls

Daher kommt die Zeile mit der IP.

Aber auch andere Codes verwenden diese Zeile mit der entsprechenden IP.

Das Datenblatt gibt diese Adresse aber auch als Kommunikationsport an:

Zitat aus diesem:

"1. Set the communication address: 192.168.1.1
Send command: B4 C0 A8 01 01 00 1E
Reply data: A4 00 00 00 00 00 A4
Note:The above example illustrate that setting the communication address as 192.168.1.1 (the user
can set their own address based on their preferences and needs), sending commands and replying data
automatically are as shown above, the data are expressed in hexadecimal; the last byte of the sending
and replying data are 1E and A4, belong to cumulative sum."

Es gibt zwar Videos auf Youtube, die diesen Chip behandeln, leider sind diese aber auch russisch. Ich sitze bereits mehrere Tage an diesem Problem und komme einfach nicht weiter,..

Aber deine Benennung der seriellen Schnittstelle passt nicht.
Wenn du SoftwareSerial verwendest, darf es später nicht serial heißen.
Du musst in der oben genannten Zeile einen eigenen Namen dafür festlegen und diesen später immer einsetzen.

Ehrlich gesagt verstehe ich gerade nur Bahnhof.

Serial verwende ich doch nachher nur noch, um die Werte auf dem seriellen Monitor auszugeben.

Wo genau ist die bei benannte Zeile im Code zu finden?

Es ist sicherlich nur eine Kleinigkeit die flasch ist.

Und wie sprichst du den Sensor an ?
Doch über SoftwareSerial, oder ?

Poste doch mal den Link zur Beispieldatei bei GitHub als Hyperlink, dann kann ich den auch öffnen.

Einmal der Link:

https://github.com/olehs/PZEM004T/blob/master/examples/PZEMDisplay/PZEMDisplay.ino

Und einmal der Code als solches:

#include <SoftwareSerial.h> // Arduino IDE <1.6.6
#include <PZEM004T.h>

PZEM004T pzem(10,11);  // RX,TX
IPAddress ip(192,168,1,1);

void setup() {
  Serial.begin(9600);
  pzem.setAddress(ip);
}

void loop() {
  float v = pzem.voltage(ip);
  if (v < 0.0) v = 0.0;
  Serial.print(v);Serial.print("V; ");

  float i = pzem.current(ip);
  if(i >= 0.0){ Serial.print(i);Serial.print("A; "); }
  
  float p = pzem.power(ip);
  if(p >= 0.0){ Serial.print(p);Serial.print("W; "); }
  
  float e = pzem.energy(ip);
  if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); }

  Serial.println();

//  delay(1000);
}

Ok, leider ist es kein Hyperlink.
Aber der Sketch ist dabei und diese Zeile ist bei dir falsch:

PZEM004T pzem(10,11);  // RX,TX

Bei dir sieht die so aus:

PZEM004T pzem(&Serial1);

Sry, habe das untere Antwortfeld nicht gesehen und das System erlaubt mir dezeit nicht mehr zu antworten, da zu viele Nachrichten geschrieben wurden.

Laut der Bibliothek werden durch den Befehl die beiden Pinne für Rx unt Tx definiert. Wie muss diese Zeile also korrigiert werden?

Mein aktueller Sketch hat an dieser Stelle

PZEM004T pzem(10,11); // RX,TX

stehen, klappt aber auch nicht.

Meine Pins stecken übrigens auf 10/11

Matzewu:
Okay, und jetzt die entscheidene Frage:

Was muss an dieser Zeile abgeändert werden?

Laut der Bibliothek werden durch den Befehl die beiden Pinne für Rx unt Tx definiert. Wie muss diese Zeile also korrigiert werden?

Meine Pins stecken übrigens auf 10/11

Ja, wie im Beispiel. Die Pins müssen hier angegeben werden.
Und wichtig: du musst RX mit TX und TX mit RX verbinden.

Es ist alles gemacht, wie du es beschrieben hast.

Rx auf Tx und Tx auf Rx.
Im Code sind die Pins entsprechend angegeben, in der Ausgabe steht aber weiterhin eine 0.00 V..

Ich verzweifle echt an diesem Teil, vonwegen Plug and Play,..

Tja. Bei meinem zweiten Chip habe ich Versorgung einmal auf 5 Volt gestellt und schon funktioniert alles einwandfrei. Komisch manchmal, diese Technik :b

Trotzdem vielen Dank für die Hilfe!

Matzewu:
Tja. Bei meinem zweiten Chip habe ich Versorgung einmal auf 5 Volt gestellt und schon funktioniert alles einwandfrei. Komisch manchmal, diese Technik :b

Trotzdem vielen Dank für die Hilfe!

Ups...
Ich wollte gerade mitteilen, mir fällt nichts mehr dazu ein. Hatte das Datenblatt gelesen und alles sehr easy...und jetzt das. :wink:

Prima, freut mich dass es funktioniert.
Ja eine Spannungsangabe habe ich nicht gefunden.

Kann das sein, dass das Teil für 5V gebaut ist?
Woher weißt du ob das mit 3,3V läuft'?

Nachtrag:

Tja. Bei meinem zweiten Chip habe ich Versorgung einmal auf 5 Volt gestellt und schon funktioniert alles einwandfrei.

Das habe ich mir gedacht!

Grund:
Der Strom auf Rx reicht dem Optokoppler nicht.
Halbiere R17.

Oder setze 1K parallel dazu.

Die Angaben gehen da auch in zwei Richtungen. Bei manchen Seiten stand fett geschrieben, dass man den nur mit 3,3 Volt betreiben darf. Andere haben geschrieben, dass erst bei 5 Volt Daten geschickt werden können.

Komischkomisch alles, aber nun kann das Projekt endlich weitergehen! :slight_smile: