Sondes de température DS18B20

@ 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

Je viens de m'apercevoir de quelque chose en vérifiant ma connexion sur la broche 19 de ma MEGA :

si je déconnecte le câble de la broche 19 et que je le reconnecte, la première lecture est bonne 24.9° et les suivantes sont fausses -127°. J'ai fait plusieurs fois la manip et j'ai toujours le même résultat.

Est ce qu'un reset "propre" entre deux mesures est nécessaire? et si oui par quel code ?

Salut ! je prends en cours!
A tu regarder cela [PARTAGE] DS18B20 Datasheet en francais. Sonde T°. - Tutoriels et cours - Arduino Forum

Les sondes sont elles raccordé par des câbles? Quelle est La distance de câble et le type de câble. Voir son passage ?si il passe a proximité de gaines de puissance.

A plus!

Bonjour

J'ai trouvé mon erreur !!!!!!!!! :slight_smile:

C'est l'instruction de delai pour la lecture qui était mal placée.

Je l'ai mise APRES le gettempérature.

Et là nickel

Voilà 1 heure que ça tourne et plus de -127

Merci à tous ceux qui m'ont aidé.

:wink:

Bonjour,

J'ai une petite question concernant le programme que duino nano a posté :

//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;

A quoi sert le ,1 dans l'instruction ds.write(0x44, 1).

Si c'est lier à l'utilisation du mode parasite, peut-on le supprimer?

Merci de m'éclairer,

cf la documentation technique du composant

DS18B20 FUNCTION COMMANDS
After the bus master has used a ROM command to address the DS18B20 with which it wishes to communicate, the master can issue one of the DS18B20 function commands. These commands allow the master to write to and read from the DS18B20’s scratchpad memory, initiate temperature conversions and determine the power supply mode. The DS18B20 function commands, which are described below, are summarized in Table 3 and illustrated by the flowchart in Figure 12.
CONVERT T [44h]
This command initiates a single temperature conversion. Following the conversion, the resulting thermal data is stored in the 2-byte temperature register in the scratchpad memory and the DS18B20 returns to its low-power idle state. If the device is being used in parasite power mode, within 10μs (max) after this command is issued the master must enable a strong pullup on the 1-Wire bus for the duration of the conversion (tCONV) as described in the Powering the DS18B20 section. If the DS18B20 is powered by an external supply, the master can issue read time slots after the Convert T command and the DS18B20 will respond by transmitting a 0 while the temperature conversion is in progress and a 1 when the conversion is done. In parasite power mode this notification technique cannot be used since the bus is pulled high by the strong pullup during the conversion.

ok

Merci