Bon, après en avoir longtemps discuté avec moi même je suis (presque) convaincu que le problème est celui que je t'avais signalé au début: tu fais le traitement même quand la valeur retournée par getTemperature est false (dans ce cas temp vaut 0)
Pour une raison inconnue (ou connue des seuls initiés) ce cas doit se produire assez souvent
Essaies le code ci dessous qui test le retour de getTemperature pour faire le traitement.
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE A0 // Broche utilisée pour le bus 1-Wire
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean unefois = false;
boolean unefois1 = false;
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
//KY019 5V relay module
int relay = 7; // relay turns trigger signal - active high;
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
lcd.begin(16, 2); //Taille LCD
pinMode(6, OUTPUT); // LED VERTE
pinMode(8, OUTPUT); // LED ROUGE
pinMode(relay, OUTPUT); // Relais sortie
}
// loop()
void loop() {
if (!unefois) {
//Affichage TEXTE (Nom du produit) une seule fois
lcd.setCursor(0, 0);
lcd.print(" * X-Fresh *");
lcd.setCursor(0, 1);
lcd.print(" Version : 1.0");
delay(4000);
lcd.clear();
unefois = true;
}
if (!unefois1) {
//Affichage TEXTE (Démarrage) une seule fois
lcd.setCursor(0, 0);
lcd.print("Bonjour !");
lcd.setCursor(0, 1);
lcd.print(" Demarrage...");
delay(1000);
lcd.clear();
unefois1 = true;
}
float temp;
// Lit la température ambiante à ~1Hz
bool cr = getTemperature(&temp);
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
if (!cr)
return; // !!!!!!! On ne fait pas le traitement
const float consigne=25;
const float hysteresis=0.5;
// Action au-dela de 25°C enclanche relais
if (temp >= consigne) { //Conditionnement de mise en service.
lcd.setCursor(0, 0);
lcd.write("Arrosage actif");
digitalWrite(8, LOW); // VERTE ETEINTE
digitalWrite(6, HIGH); // ROUGE ALLUMEE
digitalWrite(relay, HIGH); // MOTEUR ALLUME
}
if (temp <= consigne - hysteresis) { //Conditionnement de mise hors service.
lcd.setCursor(0, 0);
lcd.write("Normal ");
//digitalWrite(relay, LOW); // MOTEUR ETEINT
digitalWrite(8, HIGH); // VERTE ALLUMEE
digitalWrite(6, LOW); // ROUGE ETEINTE
}
lcd.setCursor(0, 1);
lcd.print(temp);
lcd.print(" C ");
}