Gestion des erreurs du DS18B20

Bonjour,

je suis actuellement en train de bidouiller avec un arduino uno et des ds18b20, je m'en sort pas trop mal pour l'instant :grin:, mais je bute sur un problème......

Quand je fait l'acquisition de deux DS18B20 ou plus, si jamais un seul capteur plante dans la mesure, c'est celle du capteur précedent qui notera sa valeur dans 'l"emplacement" du capteur deffectueux. Je sais pas trop si je suis clair =(

Voici mon programme, celui-ci n'est que pour deux capteurs

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 8


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress temp = { 0x28, 0x5E, 0xFC, 0x09, 0x05, 0x00, 0x00, 0x02 };
DeviceAddress temp1 = { 0x28, 0x80, 0x31, 0x0A, 0x05, 0x00, 0x00, 0x93 };


void setup(void)
{
 
  Serial.begin(9600); 
  sensors.begin();
  sensors.setResolution(temp, 12); 
  sensors.setResolution(temp1, 12);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("ERREUR !!! lecture température incorrecte, "); 
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

void loop(void)
{ 
  delay(1000);
  float temp = (sensors.getTempCByIndex(0));
  float temp1 = (sensors.getTempCByIndex(1));
  sensors.requestTemperatures();
  Serial.print(temp);
  Serial.print(",");
  Serial.println(temp1);
  
}

Du coup sur la console le programme m'affiche "temp,temp1"
Jusque là c'est logique, mais si jamais je deconnecte volontairement "temp1", et bien temp va s'afficher à sa place.....

exemple :

temp = 25°C
temp1 = 30°C

si je retire temp1 cela va m'afficher 25,25

Desolé de bien préciser mon soucis mais j'ai peur de mal me faire comprendre :confused:
Mon problème vient-il de :

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("ERREUR !!! lecture température incorrecte, "); 
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

Merci d'avance pour vos réponses :slight_smile:

Lykaa

lykaa:
Bonjour,

je suis actuellement en train de bidouiller avec un arduino uno et des ds18b20, je m'en sort pas trop mal pour l'instant :grin:, mais je bute sur un problème......

Quand je fait l'acquisition de deux DS18B20 ou plus, si jamais un seul capteur plante dans la mesure, c'est celle du capteur précedent qui notera sa valeur dans 'l"emplacement" du capteur deffectueux. Je sais pas trop si je suis clair =(

Voici mon programme, celui-ci n'est que pour deux capteurs

...

Bonjour
l'acquisition de temperature est faite byindex
il faut distinguer 2 choses pour les erreurs

  • une absence de dispo (adresse) sur le bus
  • une erreur d'acquisition d'un dispo present..

D'accord,

donc en fait cela peut venir du fait que je déclare mes capteurs, et que je force mon programme à toujours me donner la valeur de mes capteurs, du coup quand il manque une donnée sur un capteur, il comble le vide avec le resultat d'un autre ?

lykaa:
D'accord,

donc en fait cela peut venir du fait que je déclare mes capteurs, et que je force mon programme à toujours me donner la valeur de mes capteurs, du coup quand il manque une donnée sur un capteur, il comble le vide avec le resultat d'un autre ?

Je n'ai pas là sous la main de quoi "jouer" avec des DS18B20
mais dans la mesure ou tu fait là de l'injection d'adresse 1W en "dur" et pas en "search"
si pour une raison ou une autre une adresse en dur ne repond pas , l'index ne s'incremente pas/plus

Je cerne mieux le problème maintenant, il faut donc que j'écrive mon programme en faisant à chaque tour de boucle une recherche des adresses des capteurs qui sont dispo. Le soucis c'est que je stocke mes mesures sur un fichier txt qui est actuellement de la forme :

time capteur1 capteur2
14:45 25 21
14:46 24 26
........

Si jamais un des deux capteurs plante, cela aura un impact sur l'ecriture des mesures ? Ne peut-on pas simplement dire au programme "si jamais t'as un capteur qui plante, tu ecris à son emplacement "erreur mesure" " ?

dtysryrsy.bmp (114 KB)

Je comprends pas, t'es sûr que tu as mis les codes que tu as vraiment utilisé ? Parce que dans ton code entier printTemperature() n'est jamais appelé, donc il ne risque pas de posé problème ... Ensuite si tu déconnecte un capteur, c'est -127 qui doit figurer dans tes données, pas la température d'avant. De plus l'adresse des DS et les float de stockage portent le même nom, je suis étonné que tu arrives à compiler sans erreur ...

Tu viens de me mettre dans le doute, par précaution je viens de tester à bouveau mon programme (celui dans mon premier message) et toujours le même problème, si je retire un capteur c'est la valeur du precedent qui est écrite :confused:

Est ce que cela vient du fait que je n'utilise pas le mode parasite ? Je viens de tester le programme en enlevant la boucle void printTemperature(DeviceAddress deviceAddress) et j'ai toujours le même problème, je pensais que c'etait cette boucle qui gere l'acquisition des mesures (en plus du "requestTemperature") :astonished:

Après quelques recherches, je viens de trouver un programme qui semble fonctionner si je retire un capteur durant l'acquisition :slight_smile:
Je peaufine le programme ce soir et je reviens vers vous demain je pense pour vous présenter la chose :slight_smile:

De retour!

Après de nombreux tests, mon programme fonctionne enfin :

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_PIN 8
OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensors(&oneWire);


DeviceAddress temp = { 0x28, 0x50, 0x27, 0x1C, 0x05, 0x00, 0x00, 0x86 };
DeviceAddress temp1 = { 0x28, 0x8C, 0xED, 0x1B, 0x05, 0x00, 0x00, 0x26 };

void setup()   
{ 
  Serial.begin(9600);

  sensors.begin();
  sensors.setResolution(temp, 12);
  sensors.setResolution(temp1, 12);
}

void loop()  
{
  delay(1000);
  Serial.print(sensors.getDeviceCount());   
  Serial.print("\t");  
  sensors.requestTemperatures();  
  printTemperature(temp);
  Serial.print("\t");
  printTemperature(temp1);  
  Serial.println();
  
}


void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) 
   {
   Serial.print("erreur");
   } 
   else
   {
   Serial.print("");
   Serial.print(tempC);

   }
}

J'ai été surpris que celui-ci fonctionne comme je le souhaite :astonished:

Parce que dans ton code entier printTemperature() n'est jamais appelé

Tu avais raison, il me fallait utiliser printTemperature dans la boucle loop() et ensuite traiter la boucle d'erreur void printTemperature()....J'ai encore beaucoup à apprendre :stuck_out_tongue:

Merci à vous en tout cas,
bonne journée !

Lykaa