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
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....
// 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.