Problème Sondes DS18b20 HS ou pas

Bonjour,

J'utilise deux sondes Dallas DS18b20 qui fonctionnaient très bien jusqu'à ce que .......

J'ai modifié mon programme pour allumer/éteindre des leds en fonction du niveau d'eau (une partie qui n'a rien à voir avec les sondes Dallas) et quand je l'ai téléversé : au démarrage plus d'indication de températures par les 2 sondes.

J'ai donc téléverser l'ancien programme qui fonctionnait et plus rien non plus en provenance des sondes Dallas.

J'ai testé mes sondes avec un programme Dallas mais il ne trouve rien : plus d'adresse "usine" dans les sondes, résolutions à 0 ....

Sont elles mortes ou peut on ré injecter une adresse pour communiquer avec ?

Merci pour votre aide

bonjour,
photo du montage
code injecté

re

le code :

#include <Event.h>
#include <Timer.h>
#include <OneWire.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


LiquidCrystal_I2C lcd(0x27,20,4);

// Variables et broches pour la mesure de température d'eau et d'air
    
  float NewTempEau; // variable de stockage de la température de l'eau 
  float NewTempAir; // variable de stockage de la température de l'air
  float TempEau; // variable de stockage de la température de l'eau 
  float TempAir; // variable de stockage de la température de l'air
 
  const byte BROCHE_ONEWIRE = 19;  // Pin de données des capteurs DS18B20 sur la broche 19
  OneWire ds(BROCHE_ONEWIRE);
  
  // Adresses des capteurs de température */
  const byte SENSOR_ADDRESS_0[] = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };
  const byte SENSOR_ADDRESS_1[] = { 0x28, 0xFF, 0xE1, 0x59, 0x60, 0x16, 0x05, 0xC8 };

  unsigned long Time1;
  unsigned long Interval1 = 119007L;
  unsigned long Time2;
  unsigned long Interval2 = 60000L;
  unsigned long Time3;
  unsigned long Interval3 = 181005L;
  unsigned long DureeAffich;
  unsigned long Interval4 = 4000L;
  unsigned long Interval5 = 9000L;
  unsigned long Interval6 = 19000L;
  
 
  void MesureTemp (const byte addr[]) {
  ds.select(addr);
  ds.write(0x44,1);
  delay(800);
  }

 
  float LectureMesureT (const byte addr[]) {
  byte data[9];
   
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
 
  return ((data[1] << 8) | data[0]) * 0.0625; 
  }
  int a, b, c, d, aa, bb, cc, dd;  

  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)
  int ledState = LOW; int ledState1 = LOW;
  unsigned long previousMillis = 0; unsigned long previousMillis1 = 0; unsigned long previousMillis2 = 0; 
  unsigned long currentmillis; unsigned long currentmillis1; unsigned long currentmillis2;

  struct ts t;  // Pour DS3231
  float TempRTC;  // variable Température RTC
  Timer MonTimer1; // déclare le timer
  
  const 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 S = 0;
  const int NHH = 40;  // pilote la led rouge niveau trés haut
  const int NH = 41;  // pilote la led orange niveau haut
  const int NN = 42;  // pilote la led verte niveau normal
  const int NB = 43;  // pilote la led orange niveau bas
  const int NBB = 44; //pilote la led rouge niveau trés bas

  int HProg; // variable Heure pour programme: Hx100 + minutes
  const int Minute = 0;
  int JdM;
  String JdlS, Mois;
  int K = 0;
  const int Interval10 = 2;
  String EtatAir, EtatChauff;
 

 void AffichHeure()
      {
        lcd.setCursor(0,0); lcd.print("        ");
        if ((t.hour) < 10)
          {
            lcd.print(" ");
          }
        lcd.print(t.hour);
        lcd.print("H");
        if ((t.min) < 10)
          {
            lcd.print("0");
          }
        lcd.print(t.min); lcd.print("       ");
        
      }
 
  void AffichDate()
      {
        lcd.setCursor(0,0); lcd.print(JdlS); lcd.print(" ");
        lcd.print(t.mday); lcd.print(" ");
        lcd.print(Mois); lcd.print(" "); lcd.print(t.year);
      }  

  void LectureSondeNiveau()
      {
        SondeNiveau = analogRead(Niveau);
        Sonde += SondeNiveau;
        S += 1 ;
      }
      
  void AffichAirChauff()
      {
        lcd.setCursor(0,2); lcd.print("Air: ");
        lcd.print(EtatAir); lcd.print(" Chauff: "); 
        lcd.print(EtatChauff);
      }
 
  void AffichTempAir()
      {
        lcd.setCursor(0,3); lcd.print("  ");
        lcd.print("Temp Air: "); lcd.print(TempAir, 1);
        lcd.print((char)223); lcd.print("C");    
      }

  void AffichTempEau()
      {
        lcd.setCursor(0,3); lcd.print("  ");
        lcd.print("Temp Eau: "); lcd.print(TempEau, 1);
        lcd.print((char)223); lcd.print("C");
      }
 
void setup()

  {
 
  pinMode(Chauffage, OUTPUT); pinMode(LedChauffage, OUTPUT); pinMode(LedAlarmeChauffage, OUTPUT);
  pinMode(Niveau, INPUT); pinMode(NHH, OUTPUT); pinMode(NH, OUTPUT); pinMode(NN, OUTPUT); pinMode(NB, OUTPUT); pinMode(NBB, OUTPUT);
  a=0; b=0; c=0; d=0;  // initialise à 0 les BP
  
 
  lcd.begin();    
  Wire.begin();
  DS3231_init(DS3231_INTCN);
  Serial.begin(9600);
  
  }

void loop()

  { 

  MonTimer1.update();

  // allumage-Extinction du lcd
  {
    if (HProg >= 700 &&  HProg <= 2300)
    {
      lcd.backlight();
      lcd.display();
    }
  else
    {
      lcd.noBacklight();
      lcd.noDisplay();
    }
  }
     
  {

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

   switch (t.mon) 
    {
      case 1:
        Mois = "janvier";
        break;
      case 2:
        Mois = "févier";
        break;
      case 3:
        Mois = "mars";
        break;
      case 4:
        Mois = "avril";
        break;
      case 5:
        Mois = "mai";
        break;
      case 6:
        Mois = "juin";
        break;
      case 7:
        Mois = "juillet";
        break;
      case 8:
        Mois = "aout";
        break;
      case 9:
        Mois = "septemb";
        break;
      case 10:
        Mois = "octobre";
        break;
      case 11:
        Mois = "novembr";
        break;
      case 12:
        Mois = "decembr";
        break;
    }
 
  {
      if (millis() - DureeAffich < Interval4)
        {
          AffichDate();
        }
 la deuxième partie

[code  if ((millis() - DureeAffich >= Interval4) && (millis() - DureeAffich < Interval5))
        {
          AffichHeure();
          AffichTempAir();
        }
  
      if ((millis() - DureeAffich >= Interval5) && (millis() - DureeAffich < Interval6))
        {
          AffichHeure();
          AffichTempEau();
        }
    }
      if (millis() - DureeAffich >= Interval6)
      {
        DureeAffich=millis();
      }
      
    AffichAirChauff();
    }

    // Calcul HProg 

   {
     HProg = (t.hour*100) + t.min;
  }
 
   
//  GESTION DU NIVEAU D'EAU

  {
    for (int i = 0; i < 10 ; i++)
      {
        MonTimer1.every(100,LectureSondeNiveau,1);
      }
         
    if (S = 10)
    {
    Sonde = Sonde/10;
    if (Sonde >= 300) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, HIGH);  // allume la led rouge du niveau bas et éteint les leds des niveaux inférieurs
      }
    if (Sonde < 300  && Sonde >= 260) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,HIGH); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint les leds des niveaux inférieurs
      }
    if (Sonde < 260 && Sonde >= 220) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, HIGH); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led verte du niveau normal et éteint les leds des niveaux inférieurs
      }
    if (Sonde < 220 && Sonde >= 180) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, HIGH); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led orange du niveau bas et éteint la rouge du niveau très bas
      }
    if (Sonde < 180) 
      {
        digitalWrite(NBB, HIGH); digitalWrite(NB, LOW); digitalWrite(NN, LOW); digitalWrite(NH,LOW); digitalWrite(NHH, LOW);  // allume la led rouge du niveau très bas
      }

    Sonde = 0; S = 0;
    }
  }

//  AFFICHAGE DES TEMPERATURES RTC - AIR - EAU

  
  float temperature[2];
  
    //  lecture des températures
  {
   if (millis() - Time1 >= Interval1)
      { 
      Time1 = millis();
      MesureTemp(SENSOR_ADDRESS_0);
      temperature[0] = LectureMesureT(SENSOR_ADDRESS_0);
      NewTempAir = temperature[0];
    }
   
  if (millis() - Time2 >= Interval2)
    {
      Time2 = millis();
      MesureTemp(SENSOR_ADDRESS_1);
      temperature[1] = LectureMesureT(SENSOR_ADDRESS_1);
      NewTempEau = temperature[1];
    }

  }

  
   // GESTION DU CHAUFFAGE
                                                  
  {
    if (HProg >= 700 && HProg <=2200)   // Température de jour 25°C
    {
      EtatChauff = "Jour";
        if (TempEau > 25.1)
          {
            digitalWrite(Chauffage, LOW); digitalWrite(LedAlarmeChauffage, HIGH); MonTimer1.oscillate(LedChauffage, 300, LOW);
          }
        else
          {
            digitalWrite(Chauffage, HIGH); digitalWrite(LedAlarmeChauffage, LOW); digitalWrite(LedChauffage, HIGH);
          }
    }

    else    // Température de nuit 24,5°C
    {
      EtatChauff = "Nuit";
        if (TempEau > 24.5)
          {
          digitalWrite(Chauffage, LOW); digitalWrite(LedAlarmeChauffage, HIGH); MonTimer1.oscillate(LedChauffage, 300, LOW); 
          } 
          else
          {
            digitalWrite(Chauffage, HIGH); digitalWrite(LedAlarmeChauffage, LOW); digitalWrite(LedChauffage, HIGH);
          }
    }
   }
  }
]

et la photo ( :slight_smile: )

belle facade, mais tu veux que l'on voit quoi?
donc photo du montage des sondes avec un petit schéma si besoin.

elles sont cablées en mode "normal" alim 5v avec résistance de tirage de 4.7k sur un CI de ma fabrication.

Pas de soucis de ce côté là. D'ailleurs ça a fonctionné très bien pendant qq mois jusqu'à cette fameuse modif de programme sur les niveaux.

Et plus moyen de les faire fonctionner avec l'ancien programme, ni un autre.

À ta place je les démonterai pour les tester une par une sur un autre circuit avec un programme tout simple ...

Le programme ne peut pas détruire les sondes (sauf commande autodestruction mais elle ne figure pas dans le data sheet)

ce qui m'inquiète c'est que je n'arrive même pas à lire l'adresse des sondes avec un programme Dallas....

je vais les tester sur une autre carte arduino, je verrai bien

merci

Je pencherai sur un problème de câblage, de soudure (tu as peut-être arraché un fil en ouvrant le boîtier)... peut être la broche d'entrée des DS qui a été soumise à une surtension ...
Fais le test sur une autre carte, une seule sonde avec sa résistance ...

ok je fais ca demain

bonne nuit

Bonjour EGT59,

Voici un programme de test des DS18B20 qui scanne le bus OnWire.

/* Test des Sondes DS18B20 sur la Pin 6
   Modif JNM du 17/08/2017
*/

#include <OneWire.h>
#include <DallasTemperature.h>
byte OneWirePin = 6;                    // sondes DS18B20 sur pin 6

OneWire  oneWire(OneWirePin);           // bus pour com avec les sondes
DallasTemperature sensors(&oneWire);
byte addr[8];                           // pour reconnaissance adresses des sondes

// Déclaration des variables des sondes de temperature
float temp[10];
byte  nbrSondes = 0;                    // 0 sonde au démarrage

// Relever les adresses des Sondes et les mettre dans le tableau
DeviceAddress Sonde0 = { 0x28, 0xFF, 0x2A, 0x85, 0xA6, 0x16, 0x03, 0xD6 }; //adresse propre à chaque sonde
DeviceAddress Sonde1 = { 0x28, 0xFF, 0x46, 0xA3, 0xA5, 0x16, 0x05, 0xA6 }; //
DeviceAddress Sonde2 = { 0x28, 0xFF, 0x05, 0x25, 0xA6, 0x16, 0x04, 0x6B }; //
DeviceAddress Sonde3 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde4 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde5 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde6 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde7 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde8 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //
DeviceAddress Sonde9 = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //

// Initialisation
void setup()
{
  Serial.begin(9600);
  sensors.begin();
  // Recherche le nombres de sondes disponible
  nbrSondes = sensors.getDeviceCount();
  Serial.println();
  Serial.print("Nombre de capteurs trouves sur le BUS = ");
  Serial.println(nbrSondes);
  Serial.println(" aux adresses: ");
  for (byte s = 0; s <= nbrSondes; s++)
  {
    if (!oneWire.search(addr))
    {
      Serial.println("Pas d'autres sondes trouvées.");
      oneWire.reset_search();
      delay(250);
      return;
    }
    Serial.print("Sonde Numéro : ");
    Serial.print(s);
    Serial.print(" à l'adresse  {");
    for (byte i = 0; i < 8; i++)
    {
      Serial.print("0x");
      Serial.print(addr[i], HEX);
      if (i < 7)
      {
        Serial.print(", ");
      }
    }
    Serial.println("}");
  }
  // Fixe la résolution des capteurs à 10 bits (choix entre 9 et 12)
  sensors.setResolution(Sonde0, 10);
  sensors.setResolution(Sonde1, 10);
  sensors.setResolution(Sonde2, 10);
  sensors.setResolution(Sonde3, 10);
  sensors.setResolution(Sonde4, 10);
  sensors.setResolution(Sonde5, 10);
  sensors.setResolution(Sonde6, 10);
  sensors.setResolution(Sonde7, 10);
  sensors.setResolution(Sonde8, 10);
  sensors.setResolution(Sonde9, 10);
  Serial.println("Fin du set up.");
}

// Programme principale
void loop()
{
  Serial.println();
  Serial.println("Lecture des temperatures en cours...");
  sensors.requestTemperatures();
  temp[0] = printTemperature(Sonde0, 0);
  temp[1] = printTemperature(Sonde1, 1);
  temp[2] = printTemperature(Sonde2, 2);
  temp[3] = printTemperature(Sonde3, 3);
  temp[4] = printTemperature(Sonde4, 4);
  temp[5] = printTemperature(Sonde5, 5);
  temp[6] = printTemperature(Sonde6, 6);
  temp[7] = printTemperature(Sonde7, 7);
  temp[8] = printTemperature(Sonde8, 8);
  temp[9] = printTemperature(Sonde9, 9);
  delay(5000);
}


// Affichage des Températures
float printTemperature(DeviceAddress deviceAddress, byte cptSondes)
{
  float tempC = sensors.getTempC(deviceAddress);//lecture des sondes
  if (tempC == -127.00)                         //Vérifications si erreurs
  {
    if (cptSondes < nbrSondes)
    {
      Serial.print("Problème de sonde numéro : ");
      Serial.println(cptSondes);
    }
    tempC = 0;
  }
  else                                          //affichage temperature
  {
    Serial.print("Sonde numéro : ");
    Serial.print(cptSondes);
    Serial.print(" mésuré à : ");
    Serial.print(tempC);
    Serial.println(" °C.");
  }
  return tempC;
}

Il recherche 10 sondes avec adresse et température.

Bon test,
Jean-Nono

Bonjour,

J'ai déjà testé avec un autre programme qui ne trouve rien mais pas acquit de conscience j'ai essayé e tien mais il ne trouve rien non plus;

Je vais testé les sondes sur une autre carte en faisant un montage provisoire

Merci pour ton aide

Re

Bonne nouvelle : les sondes fonctionnent avec une autre carte.

Il ne me reste pus qu'à trouver la "panne": soudure, fil, ect.....

Bonjour,

Verdict (après quelques heures de recherche): une sonde HS (fonctionnement aléatoire).

Bonne journée.

Re

Pour votre information :

Il faut se méfier des sondes vendues waterproof.

Cette sonde était sous 12 cm d'eau à 25°C depuis 6 mois.

Elle est complètement oxydée.

Bonne journée à tous.

Effectivement ... Avec cette oxydation ça ne pouvait pas bien fonctionner

La sonde en elle même n'est pas en cause (de l'expérience que j'en ai, les DS sont robustes, j'en ai dans de l'eau tempérée ou dans l'air entre 60 et 80C depuis des années et aucune souci)

Vu le prix des sondes étanches .. Je les fabrique moi meme ... Petit tube en acier inoxydable ou en cuivre que je rempli de résine epoxy genre araldite.

:confused: oxydée ou cramée?

Si la puce à cramée, elle a pu endommager la carte arduino, ce qui expliquerait qu'elle ne marche plus.
En tout cas c'est HS, pas de chance!

Bonsoir,

Je reviens vers vous car j'ai des informations, par l'intermédiaire de Bernard Bouvier vendeur sur la baie, concernant l'étanchéité des sondes DS18B20 :

"Bonjour,
Mon fournisseur m'a donné une réponse qui concerne le problème que vous avez rencontré:
La sonde est totalement étanche pour une immersion sur toute la hauteur du tube en inox de façon durable.
La sonde est totalement étanche au projection de liquide et de poussière ou pour une immersion plus profonde, ponctuelle.
Pour une immersion au delà de la hauteur du tube sur le long terme, il est recommandé de renforcer l'étanchéité mais cela ne pourra jamais garantir que le liquide ne finira pas par s'infiltrer.
Bien cordialement.
Bernard."

Qu'en pensez vous ?

J'ai eu aussi beaucoup de problème avec l’étanchéité de ces sondes. Je vais tester je pense celle avec un cable silicone et le manchon inox sertis. Plus chère mais j'espère plus fiable.

Bonsoir,

Je te conseille quand même de renforcer l'étanchéité au niveau de l'insertion du câble dans le tube par de la gaine thermorétractable.

On ne sait jamais