besoin d'aide pour programme arduino gestion de température avec log

Bonsoir

Je ne vais pas commenter sur la partie de lecture du DS18B20 mais uniquement sur le coeur du code.
Il y a de très bonnes choses d'autres un plus ... étranges :wink:

unsigned long currentMillis = millis();

Il est très étonnant que ce code compile, mais c'est pourtant le cas (j'ai essayé).
Tu déclares une variable et tu l'initialises avec la valeur de la date au moment de cette initialisation.
Ce veut dire que tu met dans currentMillis la valeur retournée par millis() une fois et une seule.
Voir plus bas l'impact sur le reste de ton code.

void loop() {
//boucle avec fonction de temps pour la lecture de la température et action du relay chauffage
	if(currentMillis - previousMillis > intervalchauffage) {

Tu compares uniquement des variables qui ont été initialisées une fois et une seul.
Donc des constantes.
Donc le résultat est constant.
Vue la valeur de intervalchauffage, tu ne passera jamais dans le code ci-après.

		previousMillis = currentMillis;

Ne sert à rien. Voir la solution après mes commentaires.

		/* --- Affiche la temperature dans le moniteur serial ---*/

		float temp; // je n'aime pas trop les variables flotantes mais bon passons ...

Moi non plus sur un micro 8 bit qui n'a pas d'unité de calcul flottant.... :wink:

		// Lit la température ambiante à ~1Hz

je comprend pas ce commentaire : tu ne viens lire la température que toutes les 60000 millisecondes donc toute les minutes, pas toute les secondes.

		if(getTemperature(&temp)) {

Très bonne idée d'avoir prévu une valeur de retour booléenne pour getTemperature() au cas où ca se passe mal mais ....

			// Affiche la température
			Serial.print("Temperature : ");
			Serial.print(temp);
			Serial.write(176); // caractère °
			Serial.write('C');
			Serial.println();
		}
		/*-----------------------------------------------------*/
		/*--- Comparaison et enclenchement du relais ---*/
		// Lecture t°:

... ici tu continues comme si la lecture était toujours correcte. Seul l'affichage dépend de la bonne exécution de getTempérature(). C'est une bonne idée qui tourne court.
Donc cette partie devrait aussi être dans le if() au cas ou getTemperature() retourne false.

		t = temp;
		//Comparaison :
		if (t < tmin) {
			while (t < tmax) {digitalWrite(relay, HIGH); };
		}
		else {digitalWrite(relay, LOW); }

Un peu compliqué.
Tu n'as pas besoin de refaire le digitalWrite() pendant la durée du test.
En plus tu rentres ici dans une boucle locale dont la durée n'est pas maitrisée.
Tu risque d'y bloquer ton code ce qui va poser problème quand tu voudras y rajouter ta page web.

		/*-------------------------------------------*/
	}
}

Voici comment j'aurais écrit la boucle :
Tout d'abord j'ai fait l'hypothèse vu ton code que :

  • Tu ne veut tester que 1 fois par minute si la température est descendue trop bas pour allumer le chauffage.
  • Mais que une fois que le chauffage est allumé, tu veux vérifier plus souvent et couper le chauffage très vite si la température max est atteinte.
  • En cas d'erreur de lecture de la température, on réessaye tout de suite, sinon il faudrait attente 1 minute de nouveau
#define PERIODE_LENTE       60000
#define PERIODE_RAPIDE        1000

// unsigned long currentMillis = millis(); // PLUS BESOIN
unsigned long intervalchauffage = PERIODE_LENTE;  // ATTENTION AU TYPE : On traite les millis() en unsigned long
unsigned long previousMillis = 0;  // ATTENTION AU TYPE : On traite les millis() en unsigned long

int tmin = 10;                // t° min // Valeur réelle en °C
int tmax = 25;                // T° max // valeur réelle en °C
int t = 0;

bool chauffageOn = false;


void setup() {

	digitalWrite(relay, LOW);
	Serial.begin(9600); // Initialisation du port série

// initialiser previousMillis pour être sur de réclencher le test la 1ère fois
  previousMillis = millis() - intervalchauffage;
}

void loop() 
{
//boucle avec fonction de temps pour la lecture de la température et action du relay chauffage
// voilà comment on gère correctement le timing
// il faut à chaque fois comparer avec "maintenant" donc avec la valeur retournée par millis() à cet instant présent
	if( (millis() - previousMillis) > intervalchauffage) {
		previousMillis = millis();  // on mémorise la valeur de maintenant
		/* --- Affiche la temperature dans le moniteur serial ---*/

		float temp; // je n'aime pas trop les variables flotantes mais bon passons ...

		// Lit la température ambiante à ~1Hz
		if(getTemperature(&temp)) {

			// Affiche la température
			Serial.print("Temperature : ");
			Serial.print(temp);
			Serial.write(176); // caractère °
			Serial.write('C');
			Serial.println();
			/*-----------------------------------------------------*/
			/*--- Comparaison et enclenchement du relais ---*/
			// Lecture t°:
			t = temp;
			//Comparaison :
                        if ( chauffageOn )
                        {
                               if ( t > tmax )
                                {
                                      digitalWrite(relay, LOW);
                                      chauffageOn = false;
                                      intervalchauffage = PERIODE_LENTE;
                                }
                                else
                                {
                                      intervalchauffage = PERIODE_RAPIDE;
                                }
                        }
                        else  // if ( chauffageOn )
                        {
			        if (t < tmin) 
                                {
                                      digitalWrite(relay, HIGH);
                                      chauffageOn = true;
                                      intervalchauffage = PERIODE_RAPIDE;
                                }
                                else
                                {
                                      intervalchauffage = PERIODE_LENTE;
                                }
                        }   // if ( chauffageOn ) else
                }
                else  // If ( getTemperature() )
                {
                        // en cas d'erreur de lecture on passe en période rapide pour venir retester rapidemment
                        intervalchauffage = PERIODE_RAPIDE;
 		} // If ( getTemperature() ) else

		/*-------------------------------------------*/
	}
}

Amélioration encore possible : compter les erreurs de lectures successives et sonner une alarme si trop d'erreurs.