Variables globale

Bonjour,

Je suis en train de faire un programme pour récupérer les différentes valeurs de production, consommation de nos panneaux solaire et de notre centrale solaredge.

Voila une partie de mon code dans une feuille main.cpp

#include <WiFi.h>
#include <Arduino.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

#include <ProductConsommation.h>


...
String jsonStringConso;
String jsonStringConso1;
String jsonStringConso2;
String GRID;
String CurentPowerGrid;
String CurentPowerGrid2;
String CurentPowerGrid3;

void setup()
{

  connectWifi();

 ProductConsommation();

  Serial.print("Consommation = ");
  Serial.print(CurentPowerGrid3); //affichage de la consommation en récupérant la valeur de la fonction
  Serial.println("KWh");

  delay(300000);

} // Fin du setup

void loop()
{
 
} 

J'ai dissocié l'interrogation de la centrale solaredge de mon programme main dans une fonction appelé "ProductConsommation.h"

#include <HTTPClient.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include <iostream>

// Déclaration des variables//

extern int httpCode; // Pour les codes de connections des sites interrogés
extern String payload;
extern String jsonStringConso;
extern String jsonStringConso1;
extern String jsonStringConso2;
extern String GRID;
extern String CurentPowerGrid;
extern String CurentPowerGrid2;
extern String CurentPowerGrid3;

void ProductConsommation()
{

  String url = "https://monitoringapi.solaredge.com/site/4391185/currentPowerFlow?api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxx";

  HTTPClient http;

  http.begin(url);

  int httpCode = http.GET(); // Envoie la requête HTTP

  if (httpCode > 0)
  {
    payload = http.getString();
    // Serial.println("Données reçues de l'API : ");
    // Serial.println(payload);

    // Décode le JSON

    JsonDocument doc;
    deserializeJson(doc, payload);
    JsonObject GRID = doc["siteCurrentPowerFlow"]["GRID"];
    JsonObject LOAD = doc["siteCurrentPowerFlow"]["LOAD"];
    JsonObject PV = doc["siteCurrentPowerFlow"]["PV"];

    // String jsonString;

    serializeJson(GRID, jsonStringConso);
    serializeJson(LOAD, jsonStringConso1);
    serializeJson(PV, jsonStringConso2);

    float CurentPowerGrid = doc["siteCurrentPowerFlow"]["GRID"]["currentPower"];
    Serial.print("Importation électrique = ");
    Serial.print(CurentPowerGrid);
    Serial.println("KWh");

    float CurentPowerGrid2 = doc["siteCurrentPowerFlow"]["PV"]["currentPower"];
    Serial.print("Production solaire= ");
    Serial.print(CurentPowerGrid2);
    Serial.println("KWh");

    float CurentPowerGrid3 = doc["siteCurrentPowerFlow"]["LOAD"]["currentPower"];
    Serial.print("Consommation = ");
    Serial.print(CurentPowerGrid3);
    Serial.println("KWh");
  }
  else
  {
    Serial.println("Solaredge - Rien reçu : ");
  }
}

Le problème, c'est que une fois que j'ai récupéré les différentes valeurs de "Consommation", "Production" et "Importation", je n'arrive pas à les exporter comme variable dans ma feuille main.cpp

Comme on peut le voir sur le l'image ci-dessous:

image

Je programme sous VS code

Voir ici un sujet similaire

Merci pour votre réponse.

En fait, j'arrive bien à récupérer mes valeurs dans mon fichier ProductConsommation.h, pas de soucis de ce coté là, mais je n'arrive pas à envoyer ces valeurs récupérées, dans mon fichier main.cpp

En passant ces valeurs en argument de la fonction

J'ai modifié pour donner l'argument dans l'appel de fonction.

Sur main.cpp:

ProductConsommation (CurentPowerGrid3);

et sur dans mon fichier ProductConsommation.h

void ProductConsommation(float CurentPowerGrid3)

Il m'affiche bien la valeur mais elle est de 0.00

image

Dans la déclaration d'une fonction il y a deux types de variables : entrantes et sortantes. Par exemple :

float ProductConsommation (int abcdef) {
  float CurentPowerGrid3;
// bla bla bla
  return CurentPowerGrid3;
}

J'ai ici deux déclarations :

  • float : c'est le type de la sortie, donc de la variable à la suite du return. Si je ne renvoie rien, la fonction est déclarée comme void ProductConsommation (int abcdef)
  • int : c'est la (ou les) variable(s) passée(s) en argument, ce qui rentre dans la fonction. Lorsque tu appelles la fonction, il faut que les arguments entre parenthèses soient du même type dans le même ordre.

Dans ton cas, je comprends que tu veux que ta fonction renvoie la valeur de CurentPowerGrid3 et qu'elle ne reçoit rien en entrée. Donc tu dois déclarer la fonction comme ceci :
float ProductConsommation()

Dans le code de la fonction tu définis la variable :
float CurentPowerGrid3 = 0;
tu la mets à jour dans le corps de la fonction et tu la renvoies en fin :
return CurentPowerGrid3;

Dans le setup tu appelles la fonction comme suit :
float CurentPowerGrid3 = ProductConsommation();

Et ça devrait fonctionner... si j'ai bien compris ton besoin.

Tu n'as pas besoin de faire un return.
Dans ta fonction il faut mettre l'adresse de ta variable
void ma fonction( type &ma variable)

n'est ce pas ce que j'ai fait lors de l'appel de ma fonction???

void setup()
{

 
  ProductConsommation (CurentPowerGrid3);

  // Serial.print("Interrogation Test2 fait ");
  Serial.print("Consommation affichée venant de main.cpp = ");
  Serial.print(CurentPowerGrid3);
  Serial.println("KWh");

  delay(300000);

} // Fin du setup

Le principe est le suivant
void ProductConsommation() doit avoir en argument l'adresse de(s) variable(s) que tu veux transmettre. L'opérateur à utiliser est &

Pour cela la définition doit contenir l'adresse de ta variable CurentPowerGrid3
void ProductConsommation(string & CurentPowerGrid3)

et la déclaration doit dire qu'elle contient un argument
void ProductConsommation(string & );

Pour l'appel tu déclares ta variable et tu appelles la fonction

string valeurTransmise;
ProductConsommation(valeurTransmise);

Sur le post précédent
Ce que je fais, vouloir expliquer d'une manière simpliste, pour éviter d'entrer dans la notion de référence propre au C++ est une erreur.
Pour plus d'info il faut lire les cours qui portent sur le passage des paramètres par référence, le fait que l'on trouve difficilement toutes les explications regroupées m'ont incité à ce raccourci bien tentant mais d'autant plus stupide que l'opérateur est le même ce qui ne peut qu'apporter de la confusion.

Merci pour votre aide, pb réglé

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.