Problème de rappel de données pour gestion relais

Bonjour à tous,
Petit problème sur mon projet, les data températures de ma fonction TempCTN() ne semblent pas être conservées pour une utilisation dans une autre fonction visant à gérer les relais.
Merci de votre aide.

Explications :

Dans les grandes lignes, dans le loop je prends des températures puis j’identifie des périodes. Pour chacune de ces périodes, je déclare des paramètres (des consignes) et le souhait serait de faire appel à la fonction qui gère le moment de la journée pour appeler la fonction qui sert à gérer les relais. J’ai testé toutes les fonctions et elles semblent bonnes d’un point de vu fonctionnel sauf que la régulation, le pilotage des relais, ne se fait pas → les températures mesurées ne sont pas prises en compte :

TempCTN() → Periodes –[consignes, Photoperiodism()]
|
Moment journée = jour –[RegulationTempJour()]
Ou
Moment journée = nuit –[RegulationTempNuit()]

En contournement temporaire j’ai donc, pour chacune des périodes, déclaré les consignes puis la fonction qui gère le moment de la journée où j’ai répété la fonction de prise de température qui intègre la régulation pour un relais pour le moment :

Periodes –[consignes, Photoperiodism()]
|
Moment journée = jour –[TempCTNjour()]
Ou } prise de température répétée
Moment journée = nuit –[TempCTNnuit()]

Extrait de code du contournement :

Fonction photoperiodism()

void Photoperiodism() { // Pilotage des relais en fonction du moment de la journee - renommer en photoperiodism
momentJournee = (DsHour * 60)+DsMin;
if ((momentJournee >= 450) && (momentJournee < (450 + DureeJour))) {  // demarre la journee a  7h30
  digitalWrite(RelaisPhotoperiode, LOW); // on active le relais 1
  …
    TempCTNjour(); // function de prise de temperature qui intègre pilotage relais pour la période jour
} else {
 digitalWrite(RelaisPhotoperiode, HIGH); // on desactive le relais 0
 …
   TempCTNnuit(); // function de prise de temperature qui intègre pilotage relais pour la période nuit
}
}

Fonction de prise de température qui intègre la regulation (je préfèrerais bien entendu réutiliser les data températures mesurées pour les réutiliser dans une fonction propre de régulation)

void TempCTNjour(){ // Calcul et representation de la temperature pour les 3 thermometres
      int samples[5];
      int CTN[3] = {A5,A6,A7};
      float steinhart[3];
      float TempOld[3];
      int abcisAffich = 16;
      int abcisGraph = 31;
      uint8_t i;
 for (byte x=0; x<3; ++x) {  
//calcul d'une valeur moyenne d'un echantillon de mesure pour plus de precision
  float average;
  for (byte i=0; i<5; i++) {
    samples[i] = analogRead(CTN[x]);
//average = analogRead(CTN[x]);
    delay(10);
  }
  average = 0;
  for (i=0; i<5; i++) {
    average += samples[i];
  }
  average/=5;
//utilisation de la moyenne pour la convertion en temperature
 average = (1023 / average)-1;
 average = 10000 / average;
 steinhart[x] = average/10000;
 steinhart[x] = log(steinhart[x]);
 steinhart[x] /= 3950;
 steinhart[x] += 1.0 / (25 + 273.15);
 steinhart[x] = 1.0 / steinhart[x];
 steinhart[x] -= 273.15;
  if (TempOld[x]>steinhart[x]) { // Verification si temperature precedente superieure a  la mesure
    float Diff=TempOld[x]-steinhart[x]; //calcul de la difference tempOld et Temperature(steinhart) pour avoir le nombre de pixels supplementaires
        tft.fillRect(abcisGraph,119-(TempOld[x]*2),18,((Diff+1)*2),Black); // Suppression des pixels supplementaires
  }
// Affichage numeric temperature
  tft.fillRect(abcisAffich,170,51,22,White); 
  tft.setCursor(abcisAffich+2,174);tft.setTextSize(2); tft.setTextColor(Black,White); tft.print(steinhart[x],1);
  tft.setTextSize(1);
// Barres-graph des jauges
      tft.fillRect(abcisGraph,119-(steinhart[x]*2),18,(steinhart[x]*2),Red);
  TempOld[x]=steinhart[x];
  abcisAffich += 80;
  abcisGraph += 80; //abcisGraph = abcisGraph + 80;
}
// Regulation
if (steinhart[1] < TempJourAmbiant - 0.2) {
  digitalWrite(RelaisTempAmbiant, LOW); // Fonction normale de mise en route
  tft.fillRect (16,196,51,5,Orange);
} else if (steinhart[1] >= TempJourAmbiant +0.2) {
  digitalWrite(RelaisTempAmbiant, HIGH); // Fonction normale d'extinction
  tft.fillRect (16,196,51,5,Green);
} else if (steinhart[1] < TempJourAmbiant - 3) {
  tft.fillRect (16,196,51,5,Cyan); // Alerte si temperature inferieure de 3 degres a la consigne : dysfonctionnement
} else if (steinhart[1] > TempJourAmbiant + 10) {
  tft.fillRect (16,196,51,5,Red); // Alerte si temperature superieure de 10 degres a la consigne : dysfonctionnement
}
}

Une fonction de régulation qui est pensée comme suit (on utilise le première température mesurée steinhart[1] pour gérer le relais en fonction du delta à la consigne TempJourAmbiant pour la période donnée) :

void RegulationTempJour() { // Pilotage des relais temperatures en photophase 
if (steinhart[1] < TempJourAmbiant - 0.2) { // steinhart[1] premiere temperature mesuree
  digitalWrite(RelaisTempAmbiant, LOW); // Fonction normale de mise en route
  tft.fillRect (16,196,51,5,Yellow);
} else if (steinhart[1] >= TempJourAmbiant +0.2) {
  digitalWrite(RelaisTempAmbiant, HIGH); // Fonction normale d'extinction
  tft.fillRect (16,196,51,5,Green);
} else if (steinhart[1] < TempJourAmbiant - 3) {
  tft.fillRect (16,196,51,5,Blue2); // Alerte si temperature inferieure de 3 degres a la consigne : dysfonctionnement
} else if (steinhart[1] > TempJourAmbiant + 10) {
  tft.fillRect (16,196,51,5,Red); // Alerte si temperature superieure de 10 degres a la consigne : dysfonctionnement
}

Bonjour

les data températures de ma fonction TempCTN() ne semblent pas être conservées pour une utilisation dans une autre fonction visant à gérer les relais.

C'est une question de portée des variables en langage C ou C++ (chercher des infos sur ce point)
Les variables déclarées DANS la fonction tempCTN() ne sont pas visibles à l'extérieur de cette fonction
Déclarer en dehors des fonctions ce qui doit être accessible par n'importe quelle fonction, conserver dans chaque fonction les déclarations de variables qui ne concernent pas les autres fonctions.

Bonjour,
Je vais essayer de voir ça alors, merci du tuyau :wink:
Bonne journée

bonjour,
J’ai donc regardé coté portée des données.
j’ai déplacé la déclaration des variables hors fonction TempCTN()

//----Variables----------

float steinhart[3];
float Ambiant = steinhart[0];
float Nid = steinhart[1];
float Trop = steinhart[2];]

et ai utilisé la méthode en C++ pour utiliser ces variables depuis la fonction correspondante qui mesure la température

void TempCTN(){ // Calcul et representation de la temperature pour les 3 thermometres
      int samples[5];
      int CTN[3] = {A5,A6,A7};
      //float steinhart[3];
      float TempOld[3];
      int abcisAffich = 16;
      int abcisGraph = 31;
      uint8_t i;

 for (byte x=0; x<3; ++x) {
  
//calcul d'une valeur moyenne d'un echantillon de mesure pour plus de precision
  float average;
  for (byte i=0; i<5; i++) {
    samples[i] = analogRead(CTN[x]);
//average = analogRead(CTN[x]);
    delay(10);
  }
  average = 0;
  for (i=0; i<5; i++) {
    average += samples[i];
  }
  average/=5;
//utilisation de la moyenne pour la convertion en temperature
 average = (1023 / average)-1;
 average = 10000 / average;
 ::steinhart[x] = average/10000;
 ::steinhart[x] = log(steinhart[x]);
 ::steinhart[x] /= 3950;
 ::steinhart[x] += 1.0 / (25 + 273.15);
 ::steinhart[x] = 1.0 / steinhart[x];
 ::steinhart[x] -= 273.15;
  if (TempOld[x]>::steinhart[x]) { // Verifiation si temperature precedente superieure a  la mesure
    float Diff=TempOld[x]-::steinhart[x]; //calcul de la difference tempOld et Temperature(steinhart) pour avoir le nombre de pixels supplementaires
        tft.fillRect(abcisGraph,119-(TempOld[x]*2),18,((Diff+1)*2),Black); // Suppression des pixels supplementaires
  }
// Affichage numeric temperature
  tft.fillRect(abcisAffich,170,51,22,White); 
  tft.setCursor(abcisAffich+2,174);tft.setTextSize(2); tft.setTextColor(Black,White); tft.print(steinhart[x],1);
  tft.setTextSize(1);
// Barres-graph des jauges
      tft.fillRect(abcisGraph,119-(::steinhart[x]*2),18,(::steinhart[x]*2),Red);
  TempOld[x]=::steinhart[x];
  abcisAffich += 80;
  abcisGraph += 80; //abcisGraph = abcisGraph + 80;
}
Photoperiodism();
}

pour ensuite utiliser ces variables dans ma fonction photoperiodism () (pour gérer le moment de la journée) qui appelle elle-même la fonction servant à gérer les relais en fonction du moment de la journée comme par exemple AnalyseTempJour() qui contient

void AnalyseTempJour() { // Pilotage des relais temperatures en photophase 
if (Ambiant < TempJourAmbiant - 0.2) {
  digitalWrite(RelaisTempAmbiant, LOW); // Fonction normale de mise en route
  tft.fillRect (16,196,51,5,Orange);
} else if (Ambiant >= TempJourAmbiant +0.2) {
  digitalWrite(RelaisTempAmbiant, HIGH); // Fonction normale d'extinction
  tft.fillRect (16,196,51,5,Green);
} else if (Ambiant < TempJourAmbiant - 3) {
  tft.fillRect (16,196,51,5,Cyan); // Alerte si temperature inferieure de 5 degres a la consigne : dysfonctionnement
} else if (Ambiant > TempJourAmbiant + 10) {
  tft.fillRect (16,196,51,5,Red); // Alerte si temperature superieure de 5 degres a la consigne : dysfonctionnement
}

mais rien n’y fait. Donc je sèche !
Merci du coup de main et bonne journée