16-06-2024, 12:29 PM
J'ai repris votre code et l'ai fusionné au mien, en ne lisant que les données nécessaires et en faisant les calculs en binaire, c'est parfaitement stable avec un délai de 400ms défini dans le ino principal
les mesures de conso et injection semblent fiable, je vais tester sur plusieurs jours !
les mesures de conso et injection semblent fiable, je vais tester sur plusieurs jours !
Code :
// *************************************************
// * Client lecture JSY-MK-333 * Triphasé *
// * Développement initial de Pierre F (Mars 2024) *
// * update PhDV61 Juin 2024 *
// *************************************************
void Setup_JSY333() {
MySerial.setRxBufferSize(SER_BUF_SIZE);
MySerial.begin(19200, SERIAL_8N1, RXD2, TXD2); //PORT DE CONNEXION AVEC LE CAPTEUR JSY-MK-333
}
void Lecture_JSY333() {
float Tension_M1, Tension_M2, Tension_M3;
float Intensite_M1, Intensite_M2, Intensite_M3;
float PVA_M_inst1, PVA_M_inst2, PVA_M_inst3;
float PW_inst1, PW_inst2, PW_inst3;
byte Lecture333[200];
bool injection;
bool sens1, sens2, sens3;
long delta_temps = 0;
int i;
byte msg_send[] = { 0x01, 0x03, 0x01, 0x09, 0x00, 0x30, 0x94, 0x20 };
for (i = 0; i < 8; i++) {
MySerial.write(msg_send[i]);
}
int a = 0;
while (MySerial.available()) {
Lecture333[a] = MySerial.read();
a++;
}
if (a == 101) { //message complet reçu
delta_temps = (unsigned long) (millis()-Temps_precedent); // temps écoulé depuis le dernier appel
Temps_precedent=millis(); // on conserve la valeur du temps actuel pour le calcul précédent
injection = (Lecture333[86] >> 3) & 0x01; //si sens est true, injection
if (injection) {
PuissanceS_M_inst = 0;
PuissanceI_M_inst = float((Lecture333[3] << 24) + (Lecture333[4] << 16) + (Lecture333[5] << 8) + Lecture333[6]);
// PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir une énergie en Wh
Energie_jour_Injectee += ((float) delta_temps / 1000 ) * ( PuissanceI_M_inst / 3600.0) ;
} else { // soutirage
PuissanceI_M_inst = 0;
PuissanceS_M_inst = float((Lecture333[3] << 24) + (Lecture333[4] << 16) + (Lecture333[5] << 8) + Lecture333[6]);
// PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir pour obtenir une énergie en Wh
Energie_jour_Soutiree += ((float) delta_temps / 1000 ) * ( PuissanceS_M_inst / 3600.0) ;
}
MK333_dataBrute = "<br>Puissance active soutirée : " + String(PuissanceS_M_inst) + "W</br>";
MK333_dataBrute += "<br>Puissance active injectée : " + String(PuissanceI_M_inst) + "W</br>";
MK333_dataBrute += "<br>Energie jour nette soutirée (Linky): " + String(Energie_jour_Soutiree) + "Wh</br>";
MK333_dataBrute += "<br>Energie jour nette injectée (Linky): " + String(Energie_jour_Injectee) + "Wh</br>";
MK333_dataBrute += "<br>Données reçues : " + String(a) + "</br>";
MK333_dataBrute += "<br>Number of bytes : " + String(Lecture333[2]) + "</br>";
Pva_valide=true;
filtre_puissance();
esp_task_wdt_reset(); //Reset du Watchdog à chaque trame du JSY reçue
EnergieActiveValide = true;
if (cptLEDyellow > 30) {
cptLEDyellow = 4;
}
} else {
StockMessage("Pas tout reçu, pas traité... nombre de données : " + String(a));
}
}