[RESOLU] Erreur de lecture sur une sonde DS18b20

Bonjour,

J’ai un soucis de lecture avec une sonde DS18b20.

  • la première sonde me donne la température de l’air : c’est celle qui me donne des résultats erronés aléatoirement du genre +1968,4°C , 758, -0.1 …
  • la seconde sonde me donne la température de l’eau : elle fonctionne parfaitement.

J’ai allongé de délai de lecture sans résultat. J’ai également isolé la partie code pour les températures du programme global et j’ai les mêmes erreurs, si j’inverse les sondes idem…

Voici la partie de code pour les températures :

#include <OneWire.h>
#include <config.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 TemperatureEau; // variable de stockage de la température de l'eau 
  float TemperatureAir; // variable de stockage de la température de l'air
 
  const byte BROCHE_ONEWIRE = 19;  // Pin de données des capteurs DS18B20
  
  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 };

 
 // Fonction de démarrage de la prise de mesure de la température via un capteur DS18B20.

void startTemperatureMeasure(const byte addr[]) {
  // addr[] : Adresse du module 1-Wire détecté
  
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
}


  // Fonction de récupération de la prise de mesure de la température via un capteur DS18B20.
 
float readTemperatureMeasure(const byte addr[]) 
{
  byte data[9];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
 
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  return ((data[1] << 8) | data[0]) * 0.0625; 
}
  
  
void setup()

  {
  lcd.begin();
  lcd.clear();
  Wire.begin();
  Serial.begin(9600);
  }

void loop()

  {
 //  AFFICHAGE DES TEMPERATURES RTC - AIR - EAU
  {
  float temperature[1];
  
      //  lecture des températures
  {
  /* Lit les températures des trois capteurs */
  startTemperatureMeasure(SENSOR_ADDRESS_0);
  startTemperatureMeasure(SENSOR_ADDRESS_1);
  delay(800);
  temperature[0] = readTemperatureMeasure(SENSOR_ADDRESS_0);
  temperature[1] = readTemperatureMeasure(SENSOR_ADDRESS_1);
  }

  TemperatureAir = temperature[0];
  TemperatureEau = temperature[1];


    // Affiche les températures

  {
    lcd.setCursor(0,2);
    lcd.print("                ");
    lcd.setCursor(0,2);
    lcd.print("Temp Air: ");
    lcd.print(TemperatureAir, 1);
    lcd.print((char)223), ("C");
    delay(2000);
  }
  {
    lcd.setCursor(0,3);
    lcd.print("                      ");
    lcd.setCursor(0,3);
    lcd.print("Temp Eau: ");
    lcd.print(TemperatureEau, 1);
    lcd.print((char)223), ("C");
  }
  }  
  }

Je commence à sécher sérieusement,

Quelqu’un peut il m’aider?

Merci d’avance,

Eric

Bonjour,

Le tableau temperature est mal dimensionné. Ce doit être: float temperature[2]; Le éléments seront: temperature[0] et temperature[1].

Re

J'ai rectifié l'erreur mais ça ne change rien, j'ai toujours des erreurs aléatoires sur la sonde 0.

Si vous avez une autre idée....

Merc

hello

peux tu tester ce remplacement dans ta loop

 /* Lit les températures des trois capteurs */
  startTemperatureMeasure(SENSOR_ADDRESS_0);
  temperature[0] = readTemperatureMeasure(SENSOR_ADDRESS_0);
  delay(800);
  startTemperatureMeasure(SENSOR_ADDRESS_1);
  temperature[1] = readTemperatureMeasure(SENSOR_ADDRESS_1);
  delay(800);
  }

Bonjour dfgh,

Ok c'est bon, ta modif fonctionne.

Mais comme le but était de ne prendre que 800ms pour les deux mesures, j'ai supprimé le delay entre les deux lectures et ça fonctionne.

Encore merci

@ +