Go Down

Topic: Sondes de température DS18B20 (Read 2623 times) previous topic - next topic

EGT59

Mar 06, 2017, 10:40 pm Last Edit: Jun 13, 2017, 01:43 pm by EGT59
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.......?

Code: [Select]

#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


dfgh

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

Artouste

J'ai un petit soucis avec mes sondes de température DS18B20.
bonsoir
DS18B20 alimenté comment ?
en "mode parasitic" ou en "standard"

EGT59

bsr

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

Artouste

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  

Artouste

bsr

Alimentées en std avec une résistance de 4K7 comme préconisé
Donc en "trois fils" et pas en deux ?

EGT59

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à.

dfgh

#7
Mar 06, 2017, 10:59 pm Last Edit: Mar 06, 2017, 11:00 pm by dfgh

@ 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.

EGT59


J-M-L

-127 c'est pas une T°, ça veut dire erreur de lecture...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

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

dfgh


EGT59

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é

dfgh

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)

EGT59

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

Go Up