Appel d'une variable mesurée dans une autre fonction

onjour à tous,

j'ai une variable que j'ai mesuré avec un dht22 dont je souhaite l'utiliser dans une autre fonction avant de mettre le tout sur la fonction loop.

voici mon code histoire d'eclaircir un peu :

float  MesTempHum(int* floor_number, float* point_Pmes ){   
 
          float hum , temper;
 
                   if(floor_number == 1) {
 
                            hum = Hum1;
 
                            temper = Temp1;
 
                            Temp1 = dht1.readTemperature();
 
                            Hum1 = dht1.readHumidity();
 
                            Serial.print("Humidite 1: ");
 
                            Serial.print(Hum1); 
 
                            Serial.print("\t");
 
                            Serial.print("Temperature  1: ");
 
                            Serial.print(Temp1);
 
                            Serial.print(" *C ");
 
                            Serial.print("\t");
 
                            Serial.print("param mes etage  1: ");
 
                             float culture_params_mes[2] = {hum,temper};
 
                            Serial.print(params_mes[2]);
 
                            return  params_mes[2];
 
                          }
 
...
 
}
 
//------------------------------------
 
bool ActivVentil(int floor_number, float params_global[4]  , float *params_mes[2] ) {
 
              MesTempHum(&floor_number , &point_Pmes);
 
              float params_compar[4] = {0};
 
              float params_mes[2] = &point_Pmes;
 
              bool etat_ventil;
 
                  if (floor_number == 1) {
 
                    params_mes[1] = params_compar[1];
 
                    params_mes[0] = params_compar[0];
 
                    params_global[3] = 0;
 
                    params_global[2] = 0;
 
...
 
}

j'ai essayé d'appliqué le cours du c et utiliser l'arduino mais je crois que j'ai pas bien compris si vous avez quelque explication svp.

je profite du post pour savoir si il etait possible d'utiliser le atmega de l'arduino pour le programmer en pure C embarquée car l'arduino commence a me gaver un peu surtout que mon code commence un peu a se compliqué mdr , si oui comment je peux le faire ?

Merci d'avance et n'hesitez pas me poser des questions si vous avez pas compris mon probleme :smiley: !

float  MesTempHum(int* floor_number, float* point_Pmes ){   
 
          float hum , temper;
 
                   if(floor_number == 1) {

A quoi cela rime t-il de comparer un pointeur à 1 ?

Un pointeur n'a aucun intérêt dans ce cas :

float  MesTempHum(int floor_number, float* point_Pmes ){   
 
          float hum , temper;
 
                   if(floor_number == 1) {

D'autre part le pointeur point_Pmes n'est même pas utilisé dans la fonction.

Code trop partiel, difficile d'en dire +

je profite du post pour savoir si il etait possible d'utiliser le atmega de l'arduino pour le programmer en pure C embarquée car l'arduino commence a me gaver un peu surtout que mon code commence un peu a se compliqué mdr , si oui comment je peux le faire ?

Pourquoi ? tu penses que le compilateur de l'IDE ARDUINO n'est pas un compilateur C / C++ embarqué ?
Tu te trompes.

Si c'est l'IDE qui te gave, utilise VisualStudioCode.

Bonjour lgabed420,

lgabed420:
... pour le programmer en pure C embarquée

Qu'est-ce que du "pure C embarquée"?

Cordialement,
bidouilleelec

hello
grillé par HBachetti puis par bidouilleelec

ne t'étonnes pas de ne pas avoir de réponse
ton exposé n'est vraiment pas clair
comme on pense comprendre ce que tu veux dire, on copie ton code, on le colle dans un nouveau sketch Arduino.............
et on s'aperçoit que tu n'as donné qu'un bout de code..................on ferme tout et on se dit
quand le monsieur sera plus clair et donnera son code en entier, peut être qu'on reviendra l'aider.

Merci pour vos reponses !

oubliez mon code, je me suis un peu perdu.

je vous explique ce que je veux faire cela serait peut etre plutot simple :

j'ai deux etages avec ceux capteur dht , donc le floor_number c'est le choix d'etages :

 int floor_choosen(int floor_number){
                if ( floor_number == 1){

                          Serial.print("l'etage choisi est le : 1");

                        }
                        
                else if(floor_number == 2 ) {
                          
                          Serial.print("l'etage choisi est le : 2");
                        }

      
       }

je souhaite que le choix d’étages s'envoie à la prochaines fonctions, je sais je peux pas le faire comme ca car le floor_number est detruit dés qu'on sort de la fonction.. je sais pas comment faire du coup , si il y a une methode avec les pointeur etc ...

Ensuite j'ai une deuxieme fonction : MesTemptHum ou je vais mesurer la temperature/humidité grace à un dht dans un des etages choisi , puis stocker les valeurs deux mesures dans un tableau donc j'ai fait : (mon dht1.begin et les autre declaration du dht sont faites aucun probelme ..)

 float  MesTempHum(int floor_number) {

  float hum , temper;

  if (floor_number == 1) {

    hum = Hum1;
    temper = Temp1;
    Temp1 = dht1.readTemperature();
    Hum1 = dht1.readHumidity();
    Serial.print("Humidite etage 1: ");
    Serial.print(Hum1);
    Serial.print("\t");
    Serial.print("Temperature etage 1: ");
    Serial.print(Temp1);

    Serial.print(" *C ");
    Serial.print("\t");
    Serial.print("culture param mes etage  1: ");
    float culture_params_mes[2] = {hum, temper};
    Serial.print(culture_params_mes[2]);
    return  culture_params_mes[2];
  }
  else if (floor_number == 2) {

    hum = Hum2;
    temper = Temp2;
    Temp2 = dht2.readTemperature();
    Hum2 = dht2.readHumidity();
...};

donc pareil faut que je réussi à faire passer le floor number deja dans cette fonction ...

Et enfin une troisieme fonction où je veux utiliser cette valeur pour la stocker dans un autre tableau qui est dans une autre fonction "ActivVentil" afin de comparer avec une autre var :

bool ActivVentil(int floor_number, float culture_params_global[4]  , float culture_params_mes[2] ) {

  float culture_params_compar[4] = {0};
  bool etat_ventil;
  if (floor_number == 1) {
    culture_params_mes[1] = culture_params_compar[1];
    culture_params_mes[0] = culture_params_compar[0];
    culture_params_global[3] = 0;
    culture_params_global[2] = 0;

  }
  else if (floor_number == 2) {
    culture_params_mes[1] = culture_params_compar[3];
    culture_params_mes[0] = culture_params_compar[2];
    culture_params_global[0] = 0;
    culture_params_global[1] = 0;


  }
  else {

    Serial.print("No floor choosen");
  }


  Serial.print("etage choisi : ");
  Serial.print(floor_number) ;
  Serial.print("\t");



  if ( culture_params_compar > culture_params_global ) {

    Serial.print("Activiation du ventilateur etage : " );
    Serial.print(floor_number );
    Serial.print("\t");
    Ventil_H( floor_number);

    return etat_ventil = true ;
  }
  else {
    Serial.print("\t");
    Serial.print("Etage : " );
    Serial.print(floor_number);
    Serial.print("\t");
    Serial.print("Temperature et humidité OK");

    return etat_ventil = false;
  }


}

je sais que les parametre et les variables ont le meme noms dans les fonction mais pas les meme valeurs d'où mes questions .

j'espere que j'etais clair cette fois-ci et vous remercie d'avance , PEACE !

et puis exécuter la derniere sur le loop.

Une variable peut être locale à une fonction, un fichier, une boucle, ou elle peut être globale et donc accessible à l'ensemble du code (voir ici). C'est ce que tu veux faire : pour ça, il faut la définir dans l'en-tête du code, par exemple avant le setup (en tout cas, en dehors de toute fonction).

Bon, je suppose que vous mesurez une temperature et une humidité par étage et que vous remplissez un tableau.
Pour vous simplifier la vie, on va faire en sorte que le premier etage ait pour indice 1 dans ce tableau, le second l'indice 2.

Il vous faut donc, en C, deux tableaux (un pour la température, l'autre pour l'humidité) de trois floats
(l'indice zero ne servira à rien;, le temps passé à optimiser les indices et à gagner 4 octets sera plus utilement employé ailleurs).

Si vous voulez faire un traitement sur la temperature du 1 er étage , votre fonction sera appelée
ainsi
exotique=Fahrenheit(1, tableauDeTemperatures);

et , pour ce faire, la fonction sera définie ainsi

float Fahrenheit(int indiceEtage, float tableauDeTemperatures[3]){
// pas de controle sur bornes indiceEtage
return (1.8 * tableauDeTemperatures[indiceEtage] + 32.0);
}

L'essai complet est donc de la forme

cat ttt.c && gcc ttt.c && ./a.exe
#include <stdint.h>
#include <stdio.h>

float Fahrenheit(int indiceEtage, float tableauDeTemperatures[3]){
// pas de controle sur bornes indiceEtage
return (1.8 * tableauDeTemperatures[indiceEtage] + 32.0);
}
int main() {
uint8_t i;
 float Temperatures[3]= {-5,1,37};
 for (i=0; i< 3; i++) { // je regarde même la cave (étage zero) 
 float exotique=    Fahrenheit(i, Temperatures);
   printf("%f\n",exotique);
 }
}
23.000000
33.799999
98.599998

Nota: j'ai invoque le compilateur C; normalement, invoquer le compilateur C++ donne exactement les mêmes résultats, avec des rechercehs de bizarreires plus strictes...). Donc, les deux se valent...

Vous devriez ecrire des fonctions ultra simples avant de passer à quelque chose de compliqué ... sinon, vous allez faire des mélanges dans vos axones.

je souhaite que le choix d'étages s'envoie à la prochaines fonctions, je sais je peux pas le faire comme ca car le floor_number est detruit dés qu'on sort de la fonction.. je sais pas comment faire du coup , si il y a une methode avec les pointeur etc ...

Ce qui est sûr c'est que les paramètres ne s'envoient pas tout seuls.
C'est à l'appelant de le faire.

  int floor = 1;
  floor_choosen(floor);
  float t = MesTempHum(floor);

La première fonction pourrait être simplifiée:

int floor_choosen(int floor_number)
{
    Serial.print("l'etage choisi est le: ");
    Serial.println(floor_number);
}

La deuxième fonction utilise des variables inconnues : Hum1, Temp1, Temp2, Hum2 ?
De plus elle ne renvoie qu'une valeur alors qu'elle s'appelle "mesure température et humidité".
Elle est incomplète.

Dans la troisième fonction tu compares deux tableaux :

    if ( culture_params_compar > culture_params_global ) {

En fait tu compares deux adresses ...

Il me semble que dfgh t'a fait une remarque :

quand le monsieur sera plus clair et donnera son code en entier, peut être qu'on reviendra l'aider.

lesept :

Merci pour ta reponse, oui j'ai bien compris cela mais moi mes mesure sont faites dans une fonction donc impossible de les rendre globales... enfin si j'ai bien compris .

hbachetti :

Merci encore pour ta reponse , j'ai essayé de réexpliquer ..

Hum1, Temp1, Temp2, Hum2 sont les pas des inconnues, c'est les mesure faites par le dht .

j'ai bien mis Hum1, Temp1, sur hum et temp et apres dans un tableau afin d'avoir les deux paramtres (je sais pas exactement si on peut faire cela ) .

je poserai une question comme ca il y a pas de confusion x) ...

j'aimerai juste passer a valeur d'une variable d'une fonction à l'autre , voila ^^

int floor_choosen(int floor_number)
{
    Serial.print("l'etage choisi est le: ");
    Serial.println(floor_number);
}

a peu de chances de compiler (je ne peux pas tester toutes les horreurs, tâche automatisée depuis des décennies). Au mieux, il y aura un warning.

int floor_choosen(int floor_number)
{ // fonction triviale, qui renvoit l'etage ....
    Serial.print("l'etage choisi est le: ");
    Serial.println(floor_number);
    return number; // lourde tâche
}

est correcte.

j'aimerai juste passer a valeur d'une variable d'une fonction à l'autre , voila ^^

J'ai déjà répondu :

C'est à l'appelant de le faire, loop() ou autre :

 int floor = 1;
  floor_choosen(floor);
  float t = MesTempHum(floor);

D'autre part, si le rôle de la fonction floor_choosen est simplement d'afficher le N° d'étage, la valeur de retour ne sert à rien.

je peux faire cela pour un tableau aussi ?

lgabed420:
Merci pour ta réponse, oui j'ai bien compris cela mais moi mes mesure sont faites dans une fonction donc impossible de les rendre globales... enfin si j'ai bien compris .

Non, tu n'as pas bien compris : la mesure et la variable sont deux choses différentes. Tu déclares une variable (ou un tableau c'est pareil dans le principe) globale :

int temperature;

Dans ta fonction, tu fais ta mesure et tu affectes la valeur mesurée à cette variable :

temperature = mafonctionquimesurelatemperature();

Autre part, tu utilises la variable globale :

Serial.print(temperature);

"mais moi mes mesure sont faites dans une fonction donc impossible de les rendre globales... enfin si j'ai bien compris ."
Quelle fonction?
Comment est elle écrite?
Au pire (écrite par un autre: c'est très improbable) a-t-elle une documentation?

Parce que, si vous définissez ce qui doit ^tre variable globale, il est possible de modifier une fonction.... mais il faut savoir laquelle....

Une façon de faire est de noter en commentaires ce qu'un bout de code doit faire (sans rentrer dans les détails). Pareil pour les données les plus utiles....

dbrion06 :

float Temp1 ;
float Temp2 ;
float Hum1 ;
float Hum2 ;
int floor_number = 1;


   float  MesTempHum(){    



          float hum , temper;


                   if(floor_number == 1) {
                    
                            hum = Hum1;
                            temper = Temp1;
                            Temp1 = dht1.readTemperature();
                            Hum1 = dht1.readHumidity();
                            Serial.print("Humidite etage 1: ");
                            Serial.print(Hum1);  
                            Serial.print("\t");
                            delay(2000);   
                            Serial.print("Temperature etage 1: ");
                            Serial.print(Temp1);
                         
                            Serial.print(" *C ");
                            Serial.print("\t");
                            delay(2000);   
                            Serial.print("culture param mes etage  1: ");
                            
                             float culture_params_mes[2] = {hum,temper};
                             

                             
                            Serial.print(culture_params_mes[0]);
                            Serial.print("\t");
                            Serial.print(culture_params_mes[1]);
                            return  culture_params_mes[2];
                          }
                    else if(floor_number == 2) {
                      
                      hum = Hum2;
                      temper = Temp2;
                      Temp2 = dht2.readTemperature();
                      Hum2 = dht2.readHumidity();
                      Serial.print("Humidite etage 2: ");
                      Serial.print(Hum2); 
                      Serial.print("\t");          
                         
                      Serial.print("Temperature etage 2: ");
                      Serial.print(Temp2);
                      Serial.print(" *C ");
                      Serial.print("\t");
                      Serial.print("culture param mes etage  1: ");
                          float culture_params_mes[2] = {hum,temper};
                            Serial.print(culture_params_mes[2]);
                            return  culture_params_mes[2];
                      
                         }
                      
                    else { Serial.print("pas de mesures possible"); }

              }

ce que je veux partager avec d'autre fonction , c'est le culture_params_mes[2] , qui est un tableau qui contient la mesure du dht temper et hum .

//----------------------
lesept :

temperature = mafonctionquimesurelatemperature();

il faut que mafonctionquimesurelatemperature() return une valeur pour pouvoir faire cela ?

Bonjour

Le problème est que lorsque l'on nomme une fonction MesTempHum on s'attend à ce qu'elle retourne deux choses. Or elle n'a qu'une valeur retournée !

Je verrais les choses comme suit :

// cette fonction n'a aucun besoin de retourner quoi que ce soit

void floor_choosen(int floor_number)
{
  Serial.print("l'etage choisi est le: ");
  Serial.println(floor_number);
}

// votre fonction doit retourner 2 valeurs : t° et humidité
// elle tirerait avantage à utiliser deux pointeurs
// et la valeur retournée pourrait indiquer une erreur de lecture dht22 ou pas
// (capteur débranché par exemple)
// true : tout s'est bien passé
// false : erreur

bool MesTempHum(int floor_number, float *temperature, float *humidity)
{
  // variable status : true si lecture DHT22 OK, false sinon
  bool status = true;
  *temperature = 25.0;
  *humidity = 50.0;
  return status;
}

// en supposant que votre fonction retourne :
// true : ventilation démarrée
// false : ventilation stoppée

bool ActivVentil(int floor_number, float culture_params_global[4], float culture_params_mes[2])
{
  bool status = true;
  // ...
  return status;
}

void setup() {
  // put your setup code here, to run once:

}

void loop()
{
  // ...
  int floor = 1;
  float temp, hum;
  float cpglobal[6], cpmes[2];

  floor_choosen(floor);
  if (MesTempHum(floor, &temp, &hum) == true) {
    // ...
    // cpglobal, cpmes à renseigner ???
    // ...
    if (ActivVentil(floor, cpglobal, cpmes) == true) {
      Serial.print("Ventil démarrée");
    }
    else {
      Serial.print("Ventil stoppée");
    }
  }
  else {
    // si MesTempHum retourne un status false, les valeurs temp et hum
    // sont forcément non significatives
    // inutile d'aller activer ou arrêter la ventilation avec des valeurs
    // non valables pour temp et hum
  }
  // ...
}

Soit vous utilisez le passage de paramètres, mais dans ce cas il vaut mieux le maîtriser, passage par pointeur inclus.
Soit vous utilisez des variables globales comme le suggère lesept, ce qui sera plus accessible à un débutant, mais rendra votre code illisible au fur et à mesure qu'il évoluera.

Cordialement
Jo

il faut que mafonctionquimesurelatemperature() return une valeur pour pouvoir faire cela ?

Oui... oh oui.... et je suis sûr que tout compilateur protestera energiquement.....

temperature = mafonctionquimesurelatemperature();

En passant, puisque vous mesurez des températures à tous les étages, vous pourriez donner comme argument .....l'étage (ça ne ferait pas de mal, et du bien à ceux qui vous lisent).

Pour écrire une fonction, vous devriez noter:
a) ce qu'elle doit faire.
b) ce dont elle a besoin.
c) ce qu'elle doit retourner (et parfois, pour des valeurs d'entrée connues, ce qui doit en sortir: ex: la conversion de Celsius en Fahrenheit donne 100F pour quelqu'un de légèrement fiévreux 37.5C.... d'où ébullition aux USA).
Ces notes peuvent se faire, soit dans votre tête (mais pour modifier dans 6 mois, ce n'est pas optimum), soit sur un bout de papier (même critique) , soit, mieux si vous voulez vous corriger/vous faire corriger, en commentaire.

Tu es typiquement dans ce qu'on appelle la visibilité des variables.

Si la variable est déclarée en tête de programme, c'est à dire en dehors de toute fonction elle est est visible de n'importe quel endroit du programme.

Si la variable est déclarée dans une fonction, elle n'est visible qu'a l'intérieur de cette fonction.

A cela il faut ajouter que si la variable est déclarée dans une fonction et que cette fonction appelle une autre fonction, les variable déclarée dans la première fonction peuvent être passée en paramètre ou par valeur à cette seconde fonction.
Passage en paramètre : le contenu des variables est seulement recopiés, la fonction ne peut pas modifier les valeurs originales.
Passage par valeur : l'adresse des variables est transmise à la fonction qui peut alors modifier le contenu des valeurs originales. Utilisation des pointeurs obligatoire : voir tuto de C/C++.

Je confirme le conseil du message précédent : Dans un premier temps, sans se préoccuper de l'optimisation (l'optimisation est importante mais chaque chose en son temps), la déclaration des variables en globales à tout le programme simplifie grandement le programme.

Il existe deux moyens de retourner une valeur et une erreur en même temps.

int func1(void)
{
  return 15;
}

bool func2(int *value)
{
  *value = 15;
  return true;
}

Dans le premier cas, func1 retourne une valeur mais retourne -1 en cas d'erreur.
Elle ne pourra retourner qu'une valeur positive.

Dans le deuxième cas, func2 retourne une valeur 15 par l'intermédiaire d'un pointeur.
Elle pourra retourner une valeur positive ou négative.
Elle retourne également un indicateur de succès true ou false.