Réception données MQTT et temps réel

Et alors on peut aussi faire autrement ajouter un compteur avec une variable globale en plus
qui n’envoi les données que 1 fois sur 10 par exemple …

Nouveau Code

                                 //--------PROGRAMME POUR OPTIMISER AUTOTONSOMMATION PHOTOVOLTAIQUE---------------------------------------
//---1ere partie c'est la  mesure des valeurs Volt_1 et Ampere_1---------------------------------------------------
//---2eme partie, Calculer les watts instantanés,les wattheures cumulés, les kWh et envoyer les valeurs sur un écran LCD
//---3eme partie, Gerer le servo moteur --------------------------------------------------------------------------
//---4eme Partie, Pour 2 autres pinces amperemetriques------------------------------------------------------------
//---5eme partie, gestion de differents affichages avec bouton poussoir sur un meme ecran LCD 2 lignes ---------------

#include "EmonLib.h"             // 1 Pour inclure la librairie "EmonLib.h", aller dans le menu "croquis" puis "inclure une bibliothèque" 
// 1 puis "gérer les bibliothèques ". Une fois la librairie trouvée, appuyer sur "More info" puis " Installer"
EnergyMonitor emon1;             // 1 Creer une instance qui s'appelle emon1 (on s'en servira si on veut installer plusieurs pinces ampèremétriques)
EnergyMonitor emon2;             // 4 Idem que dessus pour une deuxième pince amperemetrique
EnergyMonitor emon3;             // 4 Idem que dessus pour une troisième pince amperemetrique

#include <Wire.h>                        // 2 inclure la librairie "wire.h" (si elle n'existe pas dans la bibliothèque, faire comme expliqué pour EmonLib.h
//#include <LiquidCrystal_I2C.h>           // 2 inclure la librairie "LiquidCrystal_I2C.h" 
////LiquidCrystal_I2C lcd(0x27, 16, 4);    // 2 définir l'adresse de l'écran LCD, le nombre de caractères et le nombre de lignes
//LiquidCrystal_I2C lcd(0x3f, 16, 2);      // 2 Si Le LCD ne fonctionne pas, alors mettre // sur la ligne précédente et enlever les // sur cette ligne

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//#include <Servo.h>                       // 3 inclure la librairie "Servo.h"
//Servo myservo;                           // 3 Création de l'objet Servo pour controler Servo
//float pos = 0;                           // 3 Creation de la variable (flottante)qui donnera la position du servo


const int led = 6;                       // 6  valeur finale auquel la led va s'allumer  de 0(éteint) à 250 (allumé à fond)
int intensite_led = 0;                   // 6  Variable intermédiaire  de l'intensité de la led

float w_instantane_in = 0;            // 2 Creation de la variable flottante "puissance instantanée" qui rentre (en watt) initialisée à la valeur 0
float kwh_cumule_in = 0;              // 2' Création de la variable flottante correspondant au Kilo Watt heure "consommé" cumulés initialisé à 0

float w_instantane_out = 0;           // 2 Creation de la variable flottante "puissance instantanée" qui sort (negative) en watt initialisée à la valeur 0
float kwh_cumule_out = 0;             // 2' Création de la variable flottante correspondant au Kilo Watt heure "surproduction" cumulés initialisé à 0

float w_Chauffe_Eau_1 = 0;             // 4 Creation de la variable flottante "puissance instantanée2" 2ième pince ampèrmétrique, initialisée à la valeur 0
float kwh_Chauffe_Eau_1 = 0;           // 4 Creation de la variable flottante "puissance cumulée2" qui rentre en Kilowattheure initialisée à la valeur 0

const int pin_bouton_changer_ecran=9;  //5 numéro de la pin du bouton poussoir qui sert à changer d'écran
int impulsion = 0;                     //5 creation de la variable impulsion
int compteur_impulsion = 1;            //5 compteur du nombre d'impulsion effectué sur le bouton poussoir, variable qui va servir pour le changement d'affichage

//olive add
int boucle = 0 ; //compteur pour n'envoyer sur la sortie série qu'une fois sur X fois 
//


unsigned long previous_millis = 0;   // 2 création de la variable "previous_millis" qui garde en mémoire le temps qui s'écoule en millièmes de seconde"

//-----------------------INITIALISATION DU PROGRAMME-------------------------------------------------

void setup()
{
  Serial.begin(115200);                 // 1 Création du port série pour que l'arduino puisse envoyer des infos vers l'ordinateur

  emon1.voltage(2, 228, 1.7);      //avec 5V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
 // emon1.voltage(0, 125, 1.7);      //avec 3.3V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
  emon1.current(1, 88);          //avec 3.3V   // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)
 // emon1.current(1, 1);             // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)

    emon2.voltage(2, 228, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
    emon2.current(3, 29);             // 4 Initialisation du Courant en ampère ( Pin A3, Valeur à changer lors de l'etalonnage)
  //
  //  emon3.voltage(2, 357, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
  //  emon3.current(6, 28.5);             // 4 Initialisation du Courant en ampère ( Pin A6, Valeur à changer lors de l'etalonnage)

 // lcd.init();                         // 2 initialisation de l'afficheur LCD
lcd.begin(16,2);
  //myservo.attach(5);                   // 3 On attache l'objet servo à la Pin D5

 pinMode(led, OUTPUT);                // 6 La broche sur lequel est la variable led est une sortie 

 pinMode(pin_bouton_changer_ecran, INPUT_PULLUP);   //5 Le bouton poussoir est une entrée forcé à 0V si on appuis pas et à 5V  si on appuie
}

//----------------------- DEMARRAGE DE LA BOUCLE----------------------------------------------------

void loop()
{
  float puissance_reelle1 = emon1.realPower;   //1 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
//   Serial.print("{\"puiss\":");
//   Serial.print(puissance_reelle1);                                                         
//   Serial.println("}");
   //delay(500);
    float puissance_reelle2 = emon2.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
   // float puissance_reelle3 = emon3.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"

  float verif_voltage    = emon1.Vrms;        //1 creation de la variable "volts moyen" (mesurable avec un voltmètre pour l'etalonnage)
  float verif_ampere     = emon1.Irms;        //1 creation de la variable "Ampères Moyen" (mesurable avec une pince ampèremétrique pour l'etalonnage))

  emon1.calcVI(20, 2000);                     // 1 Demande a Emonlib de tout calculer,  (puissance relle, volts moyen, ampère moyen et facteur de puissance)
  emon2.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la deuxième pince ampèrmétrique (si on met 40 au lieu de 20, ca va moins vite)
  //emon3.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la troisième pince ampèrmétrique (et du coup c'est plus lisible sur le LCD)

  //emon1.serialprint();                      // (1) Si on ecrit cette ligne , toutes les valeurs calculées precedemment sont envoyées vers l'ordinateur

  //--------------------------Etalonnage des volts et ampères sans LCD--------------------------------------

//  Serial.print("Est-ce le bon voltage? ");      // 1 envoyer vers l'ordinateur le texte " Est-ce le bon voltage? "
//  Serial.print(verif_voltage);                  // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.print(" V  ");                         // 1 envoyer vers l'ordinateur le caractère "V"
//  Serial.print(verif_ampere);                   // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.println(" A ");                          // 1 envoyer vers l'ordinateur le caractère "A"
//  Serial.println(intensite_led);
//delay(1000);
  //----------------POUR AVOIR LES W, Wh et kWh de l'élélectricité qui rentre et de l'électricité qui sort de ma maison------------------

  if (puissance_reelle1 >= 0)                      // 2 Si la puissance reelle est positive, (c'est que je consomme et qu'a priori il n'y a pas de soleil)
  {
    w_instantane_in = puissance_reelle1;      // 2 alors on dit que la puissance instantanée entrante (in) est egale à la puissance reelle.
    w_instantane_out = 0;                     // 2 dans ces conditions de consommation (positive) , la valeur de la surproduction est nulle.

    kwh_cumule_in = kwh_cumule_in + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
    // 2 La valeur cumulée consommée (entrante) = La valeur cumulée consommée précédente,
    // 2 plus la puissance reelle multipliée par le temps écoulé entre millis et previous millis
    // 2 que divise 3600 (nb secondes / heure) et encore par 1000 car millis compte les millièmes de seconde
    // 2 et encore par mille car ce sont les kWh et non les Wh qui m'intêresse.
  }

  else                                             // 2 SINON (c'est que la puissance_reelle est négative)
  {
    w_instantane_in = 0;                       // 2 idem au dessus
    w_instantane_out = puissance_reelle1; // 2 idem au dessus

    kwh_cumule_out = kwh_cumule_out + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
  }

  // ----------------------Pour avoir les w, wh et kwh production solaire et consommation chauffe eau------

  
      w_Chauffe_Eau_1 = puissance_reelle2;        //4 idem au dessus mais la pince ampèremetrique branché sur la conso du chauffe eau
      kwh_Chauffe_Eau_1 = kwh_Chauffe_Eau_1 + puissance_reelle2 * (millis() - previous_millis) / 3600000/ 1000;


  previous_millis = millis();               // 2 Demandons a la variable previous_millis de garder en memoire la valeur de millis (le tps qui s'écoule)

 //-------------------------------------Si il y a des Watts , balance en dans le chauffe eau---------------------------------

  if (puissance_reelle1 <= 100 && intensite_led < 230) //6 si la puissance sonsommée est inférieur à 1w, et que la led n'est mas à son maximum
  {intensite_led += 5;                               // 6 augmenter l'intensité lumineuse de 5
  analogWrite(led, intensite_led);}                  //6 la led va s'éclairer au niveau de la valeur de intensite_led
  //delay(1000);

  //Serial.println(intensite_led);
  if(puissance_reelle1 >= 100 && intensite_led > 0)  //6 inversement, si la conso en watt est supérieur à 100 et et que la led n'est pas à son minimum
  {intensite_led -= 5;                               //6 diminue alors l'intensité de la led
  analogWrite(led, intensite_led);}                 // 6 la led va s'éclairer au niveau de la valeur de intensite_led

  // --------------------ECRIRE SUR LCD ET POUR CHANGER LES VALEUR DuLCD AVEC UN BOUTON POUSSOIR------------------------------------------------

  //lcd.backlight();                // 2 Allumer l'écran LCD
  lcd.clear();                    // 2 rafraichir l'écran LCD ( efface les données précédentes)


   impulsion = digitalRead(pin_bouton_changer_ecran);               //5 Demande à "impulsion" de prendre la valeur de "pin_bouton_changer_ecran"
    if (impulsion == 0) compteur_impulsion = compteur_impulsion + 1; //5 On incrémente le compteur d'impulsion s'il y a une impulsion sur le bouton
  //Serial.print(compteur_impulsion);
    if (compteur_impulsion == 1)                                     //5 Si le compteur d'impulsion est égale à 1 on affiche le premier écran
          {
  //-----Ecran n°1:-------------------------------

  //1ere ligne, watt entrant et watts sortant----
  lcd.setCursor(0, 0);               // 4 positionner le curseur sur la ligne 1 et à gauche
  lcd.print("In ");   // 4 ecrire "In " pour comprendre qu'il s'agit de la consommation
  lcd.print(w_instantane_in, 0);     // 4 puis écrire la valeur positive de la consommation au compteur EDF avec 2 chiffre derière la virgule
  lcd.setCursor(9, 0);               // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 8
  lcd.print(w_instantane_out, 0);     // 4 ecrire la valeur de w_instantane_out (c'est la surproduction) avec 2 chiffre derière la virgule



  //2eme ligne, Watt solaire et watts chauffe eau
  lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et à gauche
  lcd.print(w_Chauffe_Eau_1, 0);          // 4 puis écrire la valeur de la surproduction visible par EDF avec les compteurs electroniques (sans les virgules)
  lcd.setCursor(9, 1);              // 4 Rester sur la ligne 2 mais curseur position 8
  //lcd.print(w_Chauffe_Eau_2, 0);      // 4 puis écrire à la suite la valeur de la surproduction en Wh avec un chiffre derrière la virgule
          }
  //
   else if (compteur_impulsion == 2) //5 Sinon s'il est égale à 2 on affiche l'écran numéro 2
          {
          //Serial.print(compteur_impulsion);  
          // -----ECRAN N°2:-------------------------------
          //1ere ligne, kWh entrant et KkWh sortant--------
          lcd.setCursor(0, 0);            // 4 positionner le curseur sur la ligne 1 et à gauche
          lcd.print("2 ");                // 4 ecrire "2" pour comprendre que nous sommes sur l'écran n°2
          lcd.print(kwh_cumule_in,4);     // 4 puis écrire la valeur de la consommation en kWh avec 4 chiffres derrière la virgule
          lcd.setCursor(8, 0);            // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 9
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          lcd.print(kwh_cumule_out,4);    // 4 ecrire la valeur des Watts cumulé en kWh, c'est la valeur de la surproduction
  
          //2eme ligne, KWh solaire et kWh chauffe eau
          lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et position 2
          lcd.print(kwh_Chauffe_Eau_1,4);         // 4 puis écrire la valeur de la production cumulée de mes panneaux solaire en kWh
          lcd.setCursor(8, 1);              // 4 rester sur la ligne 2 mais positionner le curseur en position 2
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          //lcd.print(kwh_Chauffe_Eau_2,4);     // 4 puis écrire la consomation cumulée de mon chauffe eau en Kwh
          }
  
   else if (compteur_impulsion == 3)      // 5 si on a appuié 3 fois sur le bouton poussoir,
          {
           // Serial.print(compteur_impulsion);
          compteur_impulsion = 1;          // 5 alors on remet le compteur à 0 et on retrouve l'écran n°1
          }
          
  // olive add        
  if(boucle > 10){     //on test si la boucle est dupérieur a 10 on envoi les données
       
  Serial.print(w_instantane_in);
  Serial.print(";");
  Serial.print(w_instantane_out);
  Serial.print(";");
  Serial.print(w_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(kwh_cumule_in);
  Serial.print(";");
  Serial.print(kwh_cumule_out);
  Serial.print(";");
  Serial.print(kwh_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(intensite_led);
  Serial.print("\n");
  delay(500);
  boucle =0;// olive on remet la boucle a 0
  }// olive fin de conditions
  
  // Olive on incrémente la boucle
  boucle += 1;


}                                 // FIN DU PROGRAMME