Sondes de température DS18B20

Bonsoir,

J'ai un petit soucis avec mes sondes de température DS18B20. Une sonde me donne la température exacte une fois sur 5 : 4 fois la bonne (24°5) et une fois une température erronée toujours la même (-127°0). l'autre m'indique très souvent la bonne température et parfois les fameux -127°, quelque soit la librairie utilisée (Dallas ou autre).

Je soupçonne donc un conflit dans mon code mais ou.......?

#include <DallasTemperature.h>
#include <OneWire.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
#include <config.h>
#include <Wire.h>



#define ONE_WIRE_BUS 19  // Data wire is plugged into port 19 on the Arduino
OneWire oneWire(ONE_WIRE_BUS);  // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);  // Pass our oneWire reference to Dallas Temperature. 
    
LiquidCrystal_I2C lcd(0x27,20,4);

   // Variables et broches pour les élairages PP, Sec et Leds Bleues et blanches
   
  const int EclPP = 51;  // pilote le relais 1-1 de l'éclairage PrinciPal
  const int EclSec = 52;  // pilote le relais 1-2 de l'éclairage Secondaire
  const int EclLed = 49;  // pilote le relais 2-1 du transfo 15V
  const int BPEclPP = 25;  //  Allume ou éteint l'éclairage PP en manuel
  const int BPEclSec = 26;  // Allume ou éteint l'éclairage Sec en manuel
  const int LedEclSec = 28; // pilote la led verte de l'éclairage Secondaire
  const int LedEclPP = 29; // pilote la led verte de l'éclairage PrinciPal
  const int LedEclLedBleue = 32; // pilote la led verte de l'éclairage bleu
  const int LedEclLedBlanche = 33; // pilote la led verte de l'éclairage blanc
  const int LedBleue = 4; // sortie PWM pour led bleue
  const int LedBlanche = 5; //sortie PWM pour led blanche

  int valupLedBleue = 0; int valdownLedBleue = 0; // valeur d'intensité croissante/décroissante des leds bleues
  int valupLedBlanche = 0; int valdownLedBlanche = 0; // valeur d'intensité croissante/décroissante des leds blanches
  boolean a; //Statut éclairage principal
  boolean b; //statut éclairage secondaire
  boolean c;  // statut éclairage leds bleues
  boolean d;  // statut éclairage leds blanches 

  
 

  // Variables et broches pour le chauffage

  const int LedChauffage = 31; // pilote la led verte du chauffage
  const int LedAlarmeChauffage = 30;  // pilote la led rouge de l'alarme Température haute
  const int Chauffage = 50;  // pilote le relais 1-4 du chauffage (en NC)
  

  // Variables et broches pour la RTC DS3231
  
  struct ts t;  // Pour DS3231
  float TempRTC;  // variable Température RTC

  

  // Variables et broches pour la mesure de température d'eau
  
  // const int DS18B20 = 19; // broche entrée du signal de la sonde de température
  float TemperatureEau; // variable de stockage de la température de l'eau    
  


  
 
  
  // Variables pour le programme
  
  int dateheure;  // variable date_heure contient l'heure actuelle
  int dateminute; // variable date_minute contient la minute actuelle
  int HProg; // variable Heure pour programme: Hx100 + minutes
  
  
  
    


void setup() 

  {
  
  pinMode(EclPP, OUTPUT); pinMode(LedEclPP, OUTPUT);
  pinMode(EclSec, OUTPUT); pinMode(LedEclSec, OUTPUT);
  pinMode(Aeration, OUTPUT); pinMode(LedAir, OUTPUT);
  pinMode(Chauffage, OUTPUT); pinMode(LedChauffage, OUTPUT); pinMode(LedAlarmeChauffage, OUTPUT);
  pinMode(EclLed, OUTPUT); pinMode(LedBleue, OUTPUT); pinMode(LedBlanche, OUTPUT);
  pinMode(LedEclLedBleue, OUTPUT); pinMode(LedEclLedBlanche, OUTPUT);
  pinMode(BPEclSec, OUTPUT); pinMode(BPEclPP, OUTPUT);
  //pinMode(DS18B20, INPUT);
  pinMode(Niveau, INPUT); pinMode(NHH, OUTPUT); pinMode(NH, OUTPUT); pinMode(NN, OUTPUT); pinMode(NB, OUTPUT); pinMode(NBB, OUTPUT);
  
  analogWrite(LedBleue, 0); analogWrite(LedBlanche, 0); // initialise les leds bleues et blanches à 0
  
  a=0; b=0; c=0; d=0;  // initialise à 0 les BP 
  
    
  lcd.begin();
  lcd.clear();
  Wire.begin();
  sensors.begin();
  DS3231_init(DS3231_INTCN);
  

    
  }



void loop() 

  {
// Affichage de la date et de l'heure en alternance sur la première ligne du lcd

{
  
  DS3231_get(&t);
  lcd.setCursor(0,0);
  lcd.print("                    ");
  lcd.setCursor(0,0);

  switch (t.wday) {
  case 1:
  .......
 

  lcd.print(" ");
  lcd.print(t.mday);
  lcd.print(" ");

  switch (t.mon) {
  case 1:
    lcd.print("janvier");
    break;
 
  lcd.print(" ");
  lcd.print(t.year);
  delay(4000);

    // Affichage de l'heure

  lcd.setCursor(0,0);
  lcd.print("                    ");
  lcd.setCursor(6,0);
  lcd.print(t.hour);
  lcd.print(":");
  
  if ((t.min) < 10)
  {
  lcd.print("0");
  }
  lcd.print(t.min);
  
  delay(5000);
}



// Calcul HProg 



// ECLAIRAGE PRINCIPAL PP
  
  lcd.setCursor(0,1);
  lcd.print("Eclair. PP:");
  
  if (HProg >= 1600 && HProg <= 2000)// Si il est + de 16h00 et - de 20h00
  {
    digitalWrite(EclPP, LOW); digitalWrite(LedEclPP, HIGH); lcd.print("OK"); // Allume l'éclairage PrinciPal et sa led verte
    a = 1;// écriture en sortie (broche 51) d'un état BAS
  }  

  else // Si il est entre 20h00 et 16h00
  {
    digitalWrite(EclPP, HIGH); digitalWrite(LedEclPP, LOW); lcd.print("NO");  // Eteint l'éclairage PrinciPal et sa led verte
    a = 0;// écriture en sortie (broche 51) d'un état HAUT
  }
  



// ECLAIRAGE LED BLEUES ET BLANCHES

   
  


  // ECLAIRAGE LED BLEUES ET BLANCHES

    valupLedBleue = (map (t.min, 0, 30, 0, 255));  // allumage des leds bleues sur 30 minutes
    valupLedBlanche = (map (t.min, 0, 59, 0, 255));  // allumage des leds bleues sur 59 minutes
    valdownLedBleue = (map (t.min, 0, 30, 255, 0)); // extinction des leds bleues sur 30 minutes
    valdownLedBlanche = (map (t.min, 0, 59, 255, 0)); // extinction des leds bleues sur 59 minutes


  // LE MATIN
  
    //LED BLEUE
    
  {
    if (HProg >= 1100 && HProg <= 1130)  // Si il est 11h00
  {
    analogWrite(LedBleue, valupLedBleue * 0.8); digitalWrite(32, HIGH); c = 1;  // Allumage progressif de l'éclairage Led Bleue et sa led témoin
  }
    else if (HProg > 1130 && HProg <= 1230)
  {
    analogWrite(LedBleue, 255); c = 1; digitalWrite(32, HIGH);
  }
  else if (HProg > 1230 && HProg <= 1302)// Si il est 12h31
  {
    analogWrite(LedBleue, valdownLedBleue * 0.8); // Extinction progressif de l'éclairage Led Bleue
  }
  else if (HProg > 1300 && HProg <= 2059) 
  {
    digitalWrite(LedEclLedBleue, LOW); c = 0; // Eteint la led témoin
  }

  

  
// ALLUMAGE MANUEL






// GESTION DU CHAUFFAGE
                          // ***** Le relais du chauffage est câblé en NC (inverse des autres relais)*********
  {
    lcd.setCursor(7,2);
    lcd.print("Chauff:OK");
    digitalWrite(LedChauffage, HIGH); digitalWrite(Chauffage, HIGH); digitalWrite(LedAlarmeChauffage, LOW);// Allume la led verte du chauffage, éteint la led rouge de l'alarme et laisse le relais en NC
    
    if (TemperatureEau > 25.5) //  si la température est supérieure à 25.5°
    {
    digitalWrite(Chauffage, LOW); digitalWrite(LedChauffage, LOW); digitalWrite(LedAlarmeChauffage, HIGH); // Eteint la led verte du chauffage, allume la led rouge de l'alarme et passe le relais en NO
    lcd.setCursor(0,2);
    lcd.print("                    ");
    lcd.print(" ALARME TEMPERATURE");
    lcd.setCursor(0,3);
    lcd.print("                    ");
    lcd.print("  HAUTE : T > 25,5");
    lcd.print((char)223), ("C");
    delay(3000);
    }

        
  }



//  AFFICHAGE DE LA TEMPERATURE DE L'EAU et du RTC

  {
    // call sensors.requestTemperatures() to issue a global temperature 
    // request to all devices on the bus
  TemperatureEau = 0;
  sensors.requestTemperatures(); // Send the command to get temperatures
  delay(1000);
  TemperatureEau = (sensors.getTempCByIndex(0));
  }

    // Affiche les températures

  {
    TempRTC = DS3231_get_treg();  // lit la température de l'horloge
    lcd.setCursor(0,3);
    lcd.print("                   ");
    lcd.setCursor(0,3);
    lcd.print("Temp RTC: ");
    lcd.print(float(TempRTC),1);
    lcd.print((char)223), ("C");
    delay(3000);
  }
    
  {
    lcd.setCursor(0,3);
    lcd.print("                ");
    lcd.setCursor(0,3);
    lcd.print("Temp Eau: ");
    lcd.print(TemperatureEau, 1);
    lcd.print((char)223), ("C");
    delay(3000);
  }
    
  }

Si quelqu'un peut m'aider car là je galère un peu et comme vous avez pu le constater en lisant mon code : je suis débutant.

Merci par avance de votre aide

hello
as tu mis une résistance de 1.8k entre le fil VCC et le fil data ( 20K ça marche aussi)

EGT59:
J'ai un petit soucis avec mes sondes de température DS18B20.

bonsoir
DS18B20 alimenté comment ?
en "mode parasitic" ou en "standard"

bsr

Alimentées en std avec une résistance de 4K7 comme préconisé

dfgh:
hello
as tu mis une résistance de 1.8k entre le fil VCC et le fil data ( 20K ça marche aussi)

bonsoir dfgh
pourquoi ces valeurs "exotiques" de Rp ?
la valeur usuelle recommandée par le "fondeur" est une 4.7K

EGT59:
bsr

Alimentées en std avec une résistance de 4K7 comme préconisé

Donc en "trois fils" et pas en deux ?

Pour info, j'arrive à lire les codes de chaque sonde mais j'ai l'erreur "non valide" du code crc8 après les mesures.

Je ne sais pas si les erreurs viennent de là.

@ artouste
bonsoir,
tu as raison, par habitude j'ai toujours mis 1.8k, j'ai testé 20K pour un gars qui ne semblait pas avoir un grand jeu de valeurs à dispo.

oui en 3 fils

-127 c'est pas une T°, ça veut dire erreur de lecture...

ok mais quelqu'un peut il me dire d'ou peut provenir cette erreur: code, conflit de matériel ou autre, car là je suis bloqué.

merci de votre aide

mauvais contact ?

les raccordements se font sur bornier à vis, les pistes du circuit imprimé sont ok,.......

Les deux sondes me donnent presque les mêmes erreurs :

  • une sonde donne continuellement -127° avec la librairie Dallas et avec une autre librairie One-wire c'est aléatoire 25° ou -127°

  • l'autre sonde me donne plus souvent la bonne température (une fois sur cinq) et -127°,

voilà, je continue à chercher de mon côté

partant du principe que nous sommes partis sur le hard directement, j'ai voulu regarder ton prg
celui que tu nous as posté ne se compile pas, il est incomplet ( manque des déclarations)

oui je sais mais j'ai du supprimer pas mal de choses car je dépassais les 9000 caractères....

1ére partie du code

#include <DallasTemperature.h>
#include <OneWire.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>



#define ONE_WIRE_BUS 19  // Data wire is plugged into port 19 on the Arduino
OneWire oneWire(ONE_WIRE_BUS);  // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);  // Pass our oneWire reference to Dallas Temperature. 
    
LiquidCrystal_I2C lcd(0x27,20,4);

   // Variables et broches pour les élairages PP, Sec et Leds Bleues et blanches
   
  const int EclPP = 51;  // pilote le relais 1-1 de l'éclairage PrinciPal
  const int EclSec = 52;  // pilote le relais 1-2 de l'éclairage Secondaire
  const int EclLed = 49;  // pilote le relais 2-1 du transfo 15V
  const int BPEclPP = 25;  //  Allume ou éteint l'éclairage PP en manuel
  const int BPEclSec = 26;  // Allume ou éteint l'éclairage Sec en manuel
  const int LedEclSec = 28; // pilote la led verte de l'éclairage Secondaire
  const int LedEclPP = 29; // pilote la led verte de l'éclairage PrinciPal
  const int LedEclLedBleue = 32; // pilote la led verte de l'éclairage bleu
  const int LedEclLedBlanche = 33; // pilote la led verte de l'éclairage blanc
  const int LedBleue = 4; // sortie PWM pour led bleue
  const int LedBlanche = 5; //sortie PWM pour led blanche

  int valupLedBleue = 0; int valdownLedBleue = 0; // valeur d'intensité croissante/décroissante des leds bleues
  int valupLedBlanche = 0; int valdownLedBlanche = 0; // valeur d'intensité croissante/décroissante des leds blanches
  boolean a; //Statut éclairage principal
  boolean b; //statut éclairage secondaire
  boolean c;  // statut éclairage leds bleues
  boolean d;  // statut éclairage leds blanches 

  
  // Variables et broches pour l'aération
  
  const int LedAir = 27;  // pilote la Led verte de l'aération
  const int Aeration = 53;  // pilote le relais 1-3 de l'Aération


  // Variables et broches pour le chauffage

  const int LedChauffage = 31; // pilote la led verte du chauffage
  const int LedAlarmeChauffage = 30;  // pilote la led rouge de l'alarme Température haute
  const int Chauffage = 50;  // pilote le relais 1-4 du chauffage (en NC)
  

  // Variables et broches pour la RTC DS3231
  
  struct ts t;  // Pour DS3231
  float TempRTC;  // variable Température RTC

  

  // Variables et broches pour la mesure de température d'eau
  
  // const int DS18B20 = 19; // broche entrée du signal de la sonde de température
  float TemperatureEau; // variable de stockage de la température de l'eau    
  


  
  // Variables et broches pour l'indication de niveau d'eau

  int Niveau = A6; // assigne la pin 6 à l'entrée du signal sonde de niveau
  int SondeNiveau;  // variable de stockage lecture sonde
  int Sonde; // Moyenne pour les leds
  //int somme;  // Somme du tableau
  int NHH = 40;  // pilote la led rouge niveau trés haut
  int NH = 41;  // pilote la led orange niveau haut
  int NN = 42;  // pilote la led verte niveau normal
  int NB = 43;  // pilote la led orange niveau bas
  int NBB = 44; //pilote la led rouge niveau trés bas


  
  // Variables pour le programme
  
  int dateheure;  // variable date_heure contient l'heure actuelle
  int dateminute; // variable date_minute contient la minute actuelle
  int HProg; // variable Heure pour programme: Hx100 + minutes
  
  
  
    


void setup() 

  {
  
  pinMode(EclPP, OUTPUT); pinMode(LedEclPP, OUTPUT);
  pinMode(EclSec, OUTPUT); pinMode(LedEclSec, OUTPUT);
  pinMode(Aeration, OUTPUT); pinMode(LedAir, OUTPUT);
  pinMode(Chauffage, OUTPUT); pinMode(LedChauffage, OUTPUT); pinMode(LedAlarmeChauffage, OUTPUT);
  pinMode(EclLed, OUTPUT); pinMode(LedBleue, OUTPUT); pinMode(LedBlanche, OUTPUT);
  pinMode(LedEclLedBleue, OUTPUT); pinMode(LedEclLedBlanche, OUTPUT);
  pinMode(BPEclSec, OUTPUT); pinMode(BPEclPP, OUTPUT);
  //pinMode(DS18B20, INPUT);
  pinMode(Niveau, INPUT); pinMode(NHH, OUTPUT); pinMode(NH, OUTPUT); pinMode(NN, OUTPUT); pinMode(NB, OUTPUT); pinMode(NBB, OUTPUT);
  
  analogWrite(LedBleue, 0); analogWrite(LedBlanche, 0); // initialise les leds bleues et blanches à 0
  
  a=0; b=0; c=0; d=0;  // initialise à 0 les BP 
  
    
  lcd.begin();
  lcd.clear();
  Wire.begin();
  sensors.begin();
  DS3231_init(DS3231_INTCN);
  Serial.begin(9600);

    
  }



void loop() 

  {
// Affichage de la date et de l'heure en alternance sur la premiére ligne du lcd

{
  
  DS3231_get(&t);
  lcd.setCursor(0,0);
  lcd.print("                    ");
  lcd.setCursor(0,0);

  switch (t.wday) {
  case 1:
    lcd.print("Lun");
    break;
  case 2:
    lcd.print("Mar");
    break;
  case 3:
    lcd.print("Mer");
    break;
  case 4:
    lcd.print("Jeu");
    break;
  case 5:
    lcd.print("Ven");
    break;
  case 6:
    lcd.print("Sam");
    break;
  case 7:
    lcd.print("Dim");
    break;
    }

  lcd.print(" ");
  lcd.print(t.mday);
  lcd.print(" ");

  switch (t.mon) {
  case 1:
    lcd.print("janvier");
    break;
  case 2:
    lcd.print("fevrier");
    break;
  case 3:
    lcd.print("mars");
    break;
  case 4:
    lcd.print("avril");
    break;
  case 5:
    lcd.print("mai");
    break;
  case 6:
    lcd.print("juin");
    break;
  case 7:
    lcd.print("juillet");
    break;
  case 8:
    lcd.print("aout");
    break;
  case 9:
    lcd.print("septemb");
    break;
  case 10:
    lcd.print("octobre");
    break;
  case 11:
    lcd.print("novembr");
    break;
  case 12:
    lcd.print("decembr");
    break;
  }
  
  lcd.print(" ");
  lcd.print(t.year);
  delay(4000);

    // Affichage de l'heure

  lcd.setCursor(0,0);
  lcd.print("                    ");
  lcd.setCursor(6,0);
  lcd.print(t.hour);
  lcd.print(":");
  
  if ((t.min) < 10)
  {
  lcd.print("0");
  }
  lcd.print(t.min);
  
  delay(5000);
}



// Calcul HProg 

{
  dateheure = t.hour;  // variable date_heure contient l'heure actuelle
  dateminute = t.min; // variable date_minute contient la minute actuelle
  HProg = (dateheure*100) + dateminute;
  
}
// AERATION

  lcd.setCursor(0,2);

  if (HProg >= 700 && HProg <= 2230)// Si il est entre 7h00 et 22h00
  {
    digitalWrite(Aeration, LOW); digitalWrite(LedAir, HIGH); // démarrer l'aération et allumer la led "Air"
    lcd.print("Air:OK");
  }

  else // Si il est entre 22h30 et 7h00
  {
    digitalWrite(Aeration, HIGH); digitalWrite(LedAir, LOW);// sinon arreter l'aération et éteindre la led "Air"
    lcd.print("Air:NO");
  }

2éme partie du code

// ECLAIRAGE PRINCIPAL PP
  
  lcd.setCursor(0,1);
  lcd.print("Eclair. PP:");
  
  if (HProg >= 1600 && HProg <= 2000)// Si il est + de 16h00 et - de 20h00
  {
    digitalWrite(EclPP, LOW); digitalWrite(LedEclPP, HIGH); lcd.print("OK"); // Allume l'éclairage PrinciPal et sa led verte
    a == 1;// écriture en sortie (broche 51) d'un état BAS
  }  

  else // Si il est entre 20h00 et 16h00
  {
    digitalWrite(EclPP, HIGH); digitalWrite(LedEclPP, LOW); lcd.print("NO");  // Eteint l'éclairage PrinciPal et sa led verte
    a == 0;// écriture en sortie (broche 51) d'un état HAUT
  }
  

// ECLAIRAGE SECONDAIRE Sec

  lcd.setCursor(13,1);
  lcd.print(" Sec:");

  if (HProg >= 1330 && HProg <= 1602)// Si il est + de 12h00 et - de 16h02
  {
    digitalWrite(EclSec, LOW); digitalWrite(LedEclSec, HIGH); lcd.print("OK"); // Allume l'éclairage Seconcdaire et sa led verte
    b = "1";  // écriture en sortie (broche 52) d'un état BAS
  }
    
  else if (HProg >= 1945 && HProg <= 2130 )// Si il est + de 19h45 et - de 21h30
  {
    digitalWrite(EclSec, LOW); digitalWrite(LedEclSec, HIGH); lcd.print("OK"); // Allume l'éclairage Seconcdaire et sa led verte
    b = "1";  // écriture en sortie (broche 52) d'un état BAS
  }

  else  // Si il est + de 21h30
  {
    digitalWrite(EclSec, HIGH);digitalWrite(LedEclSec,LOW); lcd.print("NO"); // Eteint l'éclairage Secondaire et sa led verte
    b = "0"; // écriture en sortie (broche 52) d'un état HAUT
  }

// ECLAIRAGE LED BLEUES ET BLANCHES

   
        // GESTION DU TRANSFO 15V

    
  if (HProg >= 1058 && HProg <= 1402)
  {
    digitalWrite(EclLed, LOW);  // alimente le relais 2-1 du transfo 15V
  }
  
  else if (HProg >= 1958 && HProg <= 2232)
  {
    digitalWrite(EclLed, LOW);  // alimente le relais 2-1 du transfo 15V
  }
  
  else
  {
    digitalWrite(EclLed, HIGH); // coupe le relais 2-1 du 15v
  }


  // ECLAIRAGE LED BLEUES ET BLANCHES

    valupLedBleue = (map (t.min, 0, 30, 0, 255));  // allumage des leds bleues sur 30 minutes
    valupLedBlanche = (map (t.min, 0, 59, 0, 255));  // allumage des leds bleues sur 59 minutes
    valdownLedBleue = (map (t.min, 0, 30, 255, 0)); // extinction des leds bleues sur 30 minutes
    valdownLedBlanche = (map (t.min, 0, 59, 255, 0)); // extinction des leds bleues sur 59 minutes


  // LE MATIN
  
    //LED BLEUE
    
  {
    if (HProg >= 1100 && HProg <= 1130)  // Si il est 11h00
  {
    analogWrite(LedBleue, valupLedBleue * 0.8); digitalWrite(32, HIGH); c = 1;  // Allumage progressif de l'éclairage Led Bleue et sa led témoin
  }
    else if (HProg > 1130 && HProg <= 1230)
  {
    analogWrite(LedBleue, 255); c = 1; digitalWrite(32, HIGH);
  }
  else if (HProg > 1230 && HProg <= 1302)// Si il est 12h31
  {
    analogWrite(LedBleue, valdownLedBleue * 0.8); // Extinction progressif de l'éclairage Led Bleue
  }
  else if (HProg > 1300 && HProg <= 2059) 
  {
    digitalWrite(LedEclLedBleue, LOW); c = 0; // Eteint la led témoin
  }

     //LED BLANCHE

  if (HProg >= 1130 && HProg <= 1230)  // Si il est entre 11h30 et 12h30
  { 
    analogWrite(LedBlanche, valupLedBlanche * 0.8); digitalWrite(33, HIGH); d = 1;  // Allumage progressif de l'éclairage Led Blanche et sa led témoin
  }
  else if (HProg > 1230 && HProg <= 1300)// Si il est entre 12h30 et 13h00
  { 
    analogWrite(LedBlanche, 255); digitalWrite(33, HIGH); d = 1;
  }
  else if (HProg > 1300 && HProg <= 1400)
  {
    analogWrite(LedBlanche, valdownLedBlanche * 0.8); d = 1; // Extinction progressif de l'éclairage Led Blanche
  }
  else if (HProg > 1400 && HProg <= 2059)
  {
    digitalWrite(LedEclLedBlanche, LOW);  // Extinction de la led témoin Led Blanche
    d = 0;  // écriture en sortie d'un état BAS
  }

  }

  // LE SOIR
  
    //LED BLEUE

  if (HProg >= 2100 && HProg <= 2130) // Si il est 21h00
  {
    analogWrite(LedBleue, valupLedBleue * 0.8); digitalWrite(LedEclLedBleue, HIGH); c = 1;  // Allumage progressif de l'éclairage Led Bleue
  }
  else if (HProg > 2100 && HProg <= 2200)  // Si il est entre 20h00 et 22h00
  {
    analogWrite(LedBleue, 255); c = 1; digitalWrite(32,HIGH);
  }
  else if (HProg > 2200 && HProg <= 2230)
  {
    analogWrite(LedBleue, valdownLedBleue * 0.8); //  progressive des leds bleues
  }
  else if (HProg > 2230 && HProg <= 2359) // Si il est entre 22h30 et minuit
  {
    digitalWrite(32, LOW); c = 0; // Extinction de la led témoin Led Bleue et écriture en sortie d'un état BAS
  }
  else if (HProg > 0 && HProg <= 1059)  // Si il est entre minuit et 11h00
  {
    digitalWrite(32, LOW); c = 0; // Extinction de la led témoin Led Bleue et écriture en sortie d'un état BAS
  }

3 éme et dernière partie

  //LED BLANCHE

  if (HProg >= 2000 && HProg <2100)
  {
    analogWrite(LedBlanche, valupLedBlanche * 0.8); digitalWrite(LedEclLedBlanche, HIGH);  // Allumage progressif de l'éclairage Led Blanche
    d = 1;  // écriture en sortie d'un état HAUT
  }

  else if (HProg >= 2100 && HProg <2200) // Si il est entre 21h00 et 22h00
  {
    analogWrite(LedBlanche, valdownLedBlanche * 0.8); // Extinction de l'éclairage Led Blanche 
  }

  else if (HProg > 2200 && HProg <= 2359) // Si il est entre 22h00 et minuit
  {
    digitalWrite(LedEclLedBlanche, LOW);  // Extinction de la led témoin Led Blanche
    d = 0;  // écriture en sortie d'un état BAS
  }
  else if (HProg >= 0 && HProg <= 1059) // Si il est entre minuit et 11h00
  {
    digitalWrite(LedEclLedBlanche, LOW);  // Extinction de la led témoin Led Blanche
    d = 0;  // écriture en sortie d'un état BAS
  }

// ALLUMAGE MANUEL






// GESTION DU CHAUFFAGE
                          // ***** Le relais du chauffage est câblé en NC (inverse des autres relais)*********
  {
    lcd.setCursor(7,2);
    lcd.print("Chauff:OK");
    digitalWrite(LedChauffage, HIGH); digitalWrite(Chauffage, HIGH); digitalWrite(LedAlarmeChauffage, LOW);// Allume la led verte du chauffage, éteint la led rouge de l'alarme et laisse le relais en NC
    
    if (TemperatureEau > 25.5) //  si la température est supérieure à 25.5°
    {
    digitalWrite(Chauffage, LOW); digitalWrite(LedChauffage, LOW); digitalWrite(LedAlarmeChauffage, HIGH); // Eteint la led verte du chauffage, allume la led rouge de l'alarme et passe le relais en NO
    lcd.setCursor(0,2);
    lcd.print("                    ");
    lcd.print(" ALARME TEMPERATURE");
    lcd.setCursor(0,3);
    lcd.print("                    ");
    lcd.print("  HAUTE : T > 25,5");
    lcd.print((char)223), ("C");
    delay(3000);
    }

        
  }

//  GESTION DU NIVEAU D'EAU

  {
    {
    SondeNiveau = 0; int i = 0;
    
    for (int i = 0; i < 5 ; i++)
    {
      SondeNiveau = analogRead(Niveau);
      //Serial.println(SondeNiveau);
      SondeNiveau += SondeNiveau;
      //Serial.println(SondeNiveau);
      delay(300);
    }
        
    Sonde = (SondeNiveau / 5);
        Serial.println(Sonde); " ";
    }

    digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);
        
    if (Sonde < 500) 
    {
      digitalWrite(NBB, HIGH);  // allume la led rouge du niveau très bas
    }
    
    else if (Sonde >= 500 && Sonde <515) 
    {
      digitalWrite(NB, HIGH); digitalWrite(NBB, LOW);  // allume la led orange du niveau bas et éteint la rouge du niveau très bas
    }
    
    else if (Sonde >= 515 && Sonde < 530) 
    {
      digitalWrite(NN, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW);  // allume la led verte du niveau normal et éteint les leds des niveaux inférieurs
    }

    else if (Sonde >= 530 && Sonde < 545) 
    {
      digitalWrite(NH, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW);  // allume la led orange du niveau bas et éteint les leds des niveaux inférieurs
    }

    else if (Sonde >= 545 && Sonde < 750) 
    {
      digitalWrite(NHH, HIGH); digitalWrite(NBB, LOW); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW);  // allume la led rouge du niveau bas et éteint les leds des niveaux inférieurs
    }
    delay(100);
  }

//  AFFICHAGE DE LA TEMPERATURE DE L'EAU

  {
    // call sensors.requestTemperatures() to issue a global temperature 
    // request to all devices on the bus
  TemperatureEau = 0;
  sensors.requestTemperatures(); // Send the command to get temperatures
  delay(1000);
  TemperatureEau = (sensors.getTempCByIndex(0));
  }

    // Affiche les températures

  {
    TempRTC = DS3231_get_treg();  // lit la température de l'horloge
    lcd.setCursor(0,3);
    lcd.print("                   ");
    lcd.setCursor(0,3);
    lcd.print("Temp RTC: ");
    lcd.print(float(TempRTC),1);
    lcd.print((char)223), ("C");
    delay(3000);
  }
    
  {
    lcd.setCursor(0,3);
    lcd.print("                ");
    lcd.setCursor(0,3);
    lcd.print("Temp Eau: ");
    lcd.print(TemperatureEau, 1);
    lcd.print((char)223), ("C");
    delay(3000);
  }
    
  }

Si cela peut t'aider, j'utilise le programme suivant pour lire la température d'un DS18B20 (avec UNO), et tout fonctionne rondement:

#include <OneWire.h>

int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 8
int laser = 4;

//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 8

void setup(void) 
{
  Serial.begin(9600);
  pinMode(laser, OUTPUT);
}

void loop(void)
{ float temperature = getTemp(); //will take about 750ms to run
  Serial.print("                                                         Temperature= ");
  Serial.print(temperature, 1);
  Serial.println(" C");
  
  digitalWrite(laser, HIGH);   // sets the LED on
  delay(100);                  // waits for a second
  digitalWrite(laser, LOW);    // sets the LED off
  
  delay(4900);
}


float getTemp() 

{
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
    //no more sensors on chain, reset search
    ds.reset_search();
    return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print("Device is not recognized");
    return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1); // start conversion, with parasite power on at the end

  delay(750); // Wait for temperature conversion to complete

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

ok, je vais modifier mon code et essayer le tien.

merci