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
}