PZEM-004T possible?

Bonjour,
J’ai vu que le sujet a été demandé en 2019 sur le topic principale et j’ai reposé la même question sur ce meme topic, cependant je pense qu’il est plus judicieux que j’ouvre un nouveau sujet.

J’ai actuellement un arduino qui tourne sur ESPEasy avec un capteur PZEM-004T pour récupérer les info électrique de consommation.

Je viens de faire l’acquisition d’un arduino MEGA 2560 qui est sur Jeeduino avec shield réseau car le wifi me gonfle un peux pour virer 4 arduino et mettre que le MEGA la plupart de mes modules sont bien compatible cependant je bloque sur le PZEM-004T .

Y a t-il moyen de mettre ce capteur sur le MEGA et récupérer les info dans Jeeduino ?

Merci d’avance :slight_smile:

Bonjour,

Cela doit être possible en ajoutant son propre code utilisateur.
Tu as un lien pour voir ?

Bonne journée.

Salut,

Tu aurais besoin de quoi comme lien ?
moi j’ai suivit ça sur un Arduino sous Espeasy

si ça pourrai t’aider

Bonjour,

Si je dois le rajouter au niveau du plugin, ça ne sera pas pour tout de suite.

Sinon en attendant, tu modifies le sketch avec les commandes utilisateurs, après avoir créé 6 commandes utilisateurs (500 à 505) au niveau de l’équipement dans le plugin:

Et d’après : GitHub - mandulaj/PZEM-004T-v30: Arduino library for the Updated PZEM-004T v3.0 Power and Energy meter :

Tu mets a 1 le #define UserSketch 0
Lignes 218 - 222 :

#if (UserSketch == 1)
	// UserVars
	// Vos declarations de variables / includes etc....
	#include <PZEM004Tv30.h>
    PZEM004Tv30 pzem(&Serial3);
#endif

Lignes 327 - 334 :

#if (UserSketch == 1)
	void UserSetup()
	{
	  pzem.resetEnergy();
  	  pzem.setAddress(0x42); // Vérifier que c'est la bonne adresse !
	}
#endif

A partir de la ligne 1155:

#if (UserSketch == 1)
	void UserLoop()
	{
	// Votre loop()
	// pour envoyer une valeur a jeedom, il suffit de remplir la variable jeedom comme cela :
	// jeedom += '&';
	// jeedom += u;	// avec u = numero de la pin "info" dans l'equipement jeedom - info pin number
	// jeedom += '=';
	// jeedom += info; // la valeur a envoyer - info value to send
	float volt = pzem.voltage();
	jeedom += '&';
	jeedom += 500;
	jeedom += '=';
	jeedom += volt;
	
	float cur = pzem.current();
	jeedom += '&';
	jeedom += 501;
	jeedom += '=';
	jeedom += cur;
	
	float powe = pzem.power();
	jeedom += '&';
	jeedom += 502;
	jeedom += '=';
	jeedom += powe;
	
	float ener = pzem.energy();
	jeedom += '&';
	jeedom += 503;
	jeedom += '=';
	jeedom += ener;
	
	float freq = pzem.frequency();
	jeedom += '&';
	jeedom += 504;
	jeedom += '=';
	jeedom += freq;
	
	float pf = pzem.pf();
	jeedom += '&';
	jeedom += 505;
	jeedom += '=';
	jeedom += pf;

Bonne journée.

je teste ça dans l’après midi, ça serait top si ca fonctionne :slight_smile:

Comment puis-je savoir si il s’agis de la bonne adresse ?
Je vais exagérer un peux de tes connaissance si je veux en mettre 2 voir 3 vus que le MEG a plusieurs RX/TX Possible ??

Bonjour,

Je n’en sais pas plus que ce qu’il y a sur le lien que tu m’as indiqué.
Je t’ai juste indiqué comment modifier le sketch jeedouino en fonction de l’exemple qu’ils donnent.
Je ne possède pas ce capteur.

Il semble que l’adresse ne sert qu’a identifier le capteur si il y en a plusieurs.

Pour en mettre plusieurs dans le sketch, tu reproduis et adapte (serial , pzem) le même code que je t’ai donné en changeant les valeurs des pins 50x, et en ajoutant des pins utilisateurs supplémentaires dans l’équipement jeedouino.

Bonne journée.

Merci @revlys pour ces informations.

Je regarde des que je peux pour faire le test.

On est d’accord que si je modifie le sketch il faut obligatoirement le renvoyer avec l’appli arduino en USB ? ou est-ce possible de le faire en réseau ? c’est un peux galère d’aller brancher l’usb dessus

Merci

Bonjour,

Oui pas le choix, pour flasher il te faut passer par l’usb.

Bonne journée.

Bonjour,
J’ai reçu mon matos de test, un second Mega ainsi que 2 mocule PZEM.
J’ai donc tenté ta procedure cependant je me confronte a un problème.

Citation
JeedouinoLAN_1121:642:27: error: ‹ PinWriteLOW › was not declared in this scope
if (swtch[i]==1) PinWriteLOW(i);
^~~~~~~~~~~
C:\Users\sango\Downloads\JeedouinoLAN_1121\JeedouinoLAN_1121.ino:642:27: note: suggested alternative: ‹ bitWrite ›
if (swtch[i]==1) PinWriteLOW(i);
^~~~~~~~~~~
bitWrite
JeedouinoLAN_1121:643:15: error: ‹ PinWriteHIGH › was not declared in this scope
else PinWriteHIGH(i);
^~~~~~~~~~~~
C:\Users\sango\Downloads\JeedouinoLAN_1121\JeedouinoLAN_1121.ino:643:15: note: suggested alternative: ‹ bitWrite ›
else PinWriteHIGH(i);
^~~~~~~~~~~~
bitWrite
JeedouinoLAN_1121:766:5: error: ‹ UserAction › was not declared in this scope
UserAction();
^~~~~~~~~~
C:\Users\sango\Downloads\JeedouinoLAN_1121\JeedouinoLAN_1121.ino:766:5: note: suggested alternative: ‹ UserSetup ›
UserAction();
^~~~~~~~~~
UserSetup
JeedouinoLAN_1121:925:21: error: ‹ read_DSx › was not declared in this scope
float reponse = read_DSx(i); // DS18x20
^~~~~~~~
JeedouinoLAN_1121:1138:31: error: ‹ UserLoop › was not declared in this scope
if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s
^~~~~~~~
C:\Users\sango\Downloads\JeedouinoLAN_1121\JeedouinoLAN_1121.ino:1138:31: note: suggested alternative: ‹ UserSetup ›
if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s
^~~~~~~~
UserSetup
JeedouinoLAN_1121:1140:3: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1203:2: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1230:2: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1260:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1337:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1442:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1652:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1667:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1683:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1717:1: error: a function-definition is not allowed here before ‹ { › token
{
^
JeedouinoLAN_1121:1794:1: error: expected ‹ } › at end of input
}
^
exit status 1
‹ Init_EEPROM › was not declared in this scope

J’ai bien rajouté ma librairie

Une idée ?

J’ai réussi a faire fonctionné sur 2 PZEM :slight_smile:

Voila les manip
PZEM 1 Brancher en Serial 3 Broche 14 et 15
PZEM 2 Branché en Serial 1 Broche 18 et 19

J’ai voulu faire 2 envoie bien séparé car si un module est HS ben je n’avais même pas la valeur du second donc voici ceux que j’ai fait :

Ligne 223-229

#if (UserSketch == 1)
  // UserVars
  // Vos declarations de variables / includes etc....
  #include <PZEM004Tv30.h>
    PZEM004Tv30 pzem(&Serial3);
    PZEM004Tv30 pzem1(&Serial1);
#endif

Ligne 343-334

//// User Setup
#if (UserSketch == 1)
	void UserSetup()
	{
    pzem.resetEnergy();
      pzem.setAddress(0x42); // Vérifier que c'est la bonne adresse !
    pzem1.resetEnergy();
      pzem1.setAddress(0x42); // Vérifier que c'est la bonne adresse !
	}
#endif

Ligne 1142-1295

	#if (UserSketch == 1)
		//UserLoop(); // Appel de votre loop() permanent
		if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s
   if (NextRefresh1 < millis()) UserLoop2(); // Appel de votre loop() toutes les 60s
	#endif

	if (NextRefresh < millis())
	{
		NextRefresh = millis() + 10000;	// Refresh auto toutes les 10s
		if (RepByJeedom) // sert a verifier que jeedom a bien repondu a la demande dans Load_eeprom
		{
			jeedom += F("&ASK=1"); // Sinon on redemande
		}
	}
  if (NextRefresh1 < millis())
  {
    NextRefresh1 = millis() + 15000;  // Refresh auto toutes les 15s
    if (RepByJeedom) // sert a verifier que jeedom a bien repondu a la demande dans Load_eeprom
    {
      jeedom += F("&ASK=1"); // Sinon on redemande
    }
  }

/* 	#if (UseLCD16x2 == 1 || UseLCD16x2 == 2)
		lcd.setCursor(0,1);
		lcd.print(jeedom);
	#endif */

	if (jeedom != "") SendToJeedom();
}
//// User Loop + Action






#if (UserSketch == 1)
  void UserLoop()
  {
  // Votre loop()
  // pour envoyer une valeur a jeedom, il suffit de remplir la variable jeedom comme cela :
  // jeedom += '&';
  // jeedom += u; // avec u = numero de la pin "info" dans l'equipement jeedom - info pin number
  // jeedom += '=';
  // jeedom += info; // la valeur a envoyer - info value to send

  float volt = pzem.voltage();
  jeedom += '&';
  jeedom += 500;
  jeedom += '=';
  jeedom += volt;
  
  float cur = pzem.current();
  jeedom += '&';
  jeedom += 501;
  jeedom += '=';
  jeedom += cur;
  
  float powe = pzem.power();
  jeedom += '&';
  jeedom += 502;
  jeedom += '=';
  jeedom += powe;
  
  float ener = pzem.energy();
  jeedom += '&';
  jeedom += 503;
  jeedom += '=';
  jeedom += ener;
  
  float freq = pzem.frequency();
  jeedom += '&';
  jeedom += 504;
  jeedom += '=';
  jeedom += freq;
  
  float pf = pzem.pf();
  jeedom += '&';
  jeedom += 505;
  jeedom += '=';
  jeedom += pf;
	}
	void UserAction()
	{
		// En cas d'une reception d'une commande user action depuis jeedom
		// c[0]='U' & c[n]='R')
		//
		// c[1] = c[1] - '0';	==5 (user pin start at 500)
		// c[2] = c[2] - '0';
		// c[3] = c[3] - '0';
		// ou : for (int i = 1; i < n; i++) if (isDigit(c[i])) c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
		// int pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); 	// pin action number
		//
		// c[4] to c[n-1] 	// pin action value
		//
		// Ex1:
		// JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
		// ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
		// ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
		// Ex2:
		// JEEDOM  : Sortie Numérique (Sous-type Jeedom: curseur)
		// ARDUINO : c[] = U502128R -> U 502 128 R = Slider, Value 128, pin 502 -> c[4] = '1', c[5] = '2', c[5] = '8'
		// Ex3:
		// JEEDOM  : Sortie Numérique (Sous-type Jeedom: message)
		// ARDUINO : c[] = U507[Jeedom] Message|Ceci est un testR -> U 507 [Jeedom] Message | Ceci est un test R = Message, pin 507

		// /!\ attention de ne pas mettre de code bloquant (avec trop de "delays") - max time 2s
	}
#endif



#if (UserSketch == 1)
 void UserLoop2()
  {
  float volt1 = pzem1.voltage();
  jeedom += '&';
  jeedom += 506;
  jeedom += '=';
  jeedom += volt1;
  
  float cur1 = pzem1.current();
  jeedom += '&';
  jeedom += 507;
  jeedom += '=';
  jeedom += cur1;
  
  float powe1 = pzem1.power();
  jeedom += '&';
  jeedom += 508;
  jeedom += '=';
  jeedom += powe1;
  
  float ener1 = pzem1.energy();
  jeedom += '&';
  jeedom += 509;
  jeedom += '=';
  jeedom += ener1;
  
  float freq1 = pzem1.frequency();
  jeedom += '&';
  jeedom += 510;
  jeedom += '=';
  jeedom += freq1;
  
  float pf1 = pzem1.pf();
  jeedom += '&';
  jeedom += 511;
  jeedom += '=';
  jeedom += pf1;
  }
#endif

ça me lance 2 envoies bien diffèrent par contre j’aimerai bien avoir un check toute les 10s comment faire ?