Electronique > Les capteurs

Sonde de température DS18B20

Dans cet article, nous allons voir comment mesurer la température grâce à une sonde de température DS18B20 et afficher le résultat sur un afficheur LCD.

La sonde de température.

Nous allons utiliser une sonde de température numérique DS18B20 :

  • Numérique : elle retourne une valeur numérique représentant la température
  • Bus 1-Wire. Elle a 3 fils : VCC, GND, DATA.
  • On la trouve sous différent format : boitier TO-92 (type transistor), sonde étanche..
  • La plage de mesure est de -55°C à + 125°C
  • La précision est réglable (de 9 à 12 bits). Plus la précision est grande, plus le délai de prise de mesure est important (à 12 bits : 750ms). 
    Précision en bits 9 10 11 12
    Précision en température 0,5°C 0,25°C 0,125°C 0,0625°C
    Délai de mesure 93,75 ms 187,5 ms 375 ms 750 ms
  • Le fil rouge correspond au VCC (+5V)
  • le fil noir correspond au GND
  • le fil bleu ou jaune correspond à la donnée (Data ou DQ)

La liaison 1-wire

La liaison 1 wire est un bus qui permet la communication entre circuit (par exemple une sonde de température avec microprocesseur). Il fonctionne sur le principe maitre / esclave.

  • Chaque circuit possède une adresse pour pouvoir communiquer.
  • Un seul maitre communique avec 1 ou plusieurs esclaves.
  • Branchement en série, parallèle ou étoile

Le schéma.

Voici le schéma de la partie Sonde. Pour soucis de clareté, la partie LCD a été volontairement tronquée.

Pour plus d'information sur le branchement du LCD, je vous invite à consulter l'article 9/ l'afficheur LCD.

Le branchement

Le programme.

On va avoir besoin des librairies :

N'oubliez pas de redémarrer votre IDE, pour prendre en compte les nouvelles librairies.

//on charge les librairies
#include "OneWire.h"
#include "DallasTemperature.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

// On définit sur quel broche on a branché le capteur de température.
#define ONE_WIRE_BUS 6

// On définit l'adresse de notre LCD (0x3F), puis le nombre de caractère par ligne (16).
// Puis le nombre de ligne (2).
LiquidCrystal_I2C lcd(0x3f, 16, 2);

// On définit le OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Et on le passe en réfence de la librairie Dallas temperature
DallasTemperature sensors(&oneWire);


void setup() {
  // On initialise le LCD
  lcd.begin();

  // On allume le rétroéclairage
  lcd.backlight();
  lcd.clear();

  // on initialise la librairie Dallas
  sensors.begin();
}

void loop() {
  //On demande la température
  sensors.requestTemperatures();
  
  // On affiche le résultat sur le LCD.
  lcd.clear();
  lcd.print("Mesure de temp :");
  lcd.setCursor(0,1);
  lcd.print(sensors.getTempCByIndex(0));
  // Symbole degré
  lcd.write(223);
  lcd.print("C");

  // on attend 1 seconde
  delay(1000); 
}

Bonus température Mini / Maxi.

Voici une modification du programme précédent pour afficher les températures mini / maxi.

//on charge les librairies
#include "OneWire.h"
#include "DallasTemperature.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

// On définit sur quel broche on a branché le capteur de température.
#define ONE_WIRE_BUS 6

// On définit l'adresse de notre LCD (0x3F), puis le nombre de caractère par ligne (16).
// Puis le nombre de ligne (2).
LiquidCrystal_I2C lcd(0x3f, 16, 2);

// On définit le OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Et on le passe en réfence de la librairie Dallas temperature
DallasTemperature sensors(&oneWire);

// On définit les variables
float tmin,tmax,tnow,tlast;

// Flèche haut
byte upArrow[8]={
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100
};

// Flèche bas
byte downArrow[8]={
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100
};

 
void setup() {
  // On initialise le LCD
  lcd.begin();

  // On allume le rétroéclairage
  lcd.backlight();
  lcd.clear();
  lcd.createChar(0, upArrow);
  lcd.createChar(1, downArrow);

  // on initialise la librairie Dallas
  sensors.begin();

  // on initialise la température max et min.
  tmin = 125;
  tmax = -55;
  tlast = 0;
}

void loop() {
  //On demande la température
  sensors.requestTemperatures();

  tnow = sensors.getTempCByIndex(0);
  if(tnow!=tlast) {
    tlast=tnow;
    if(tnow<tmin)
      tmin=tnow;
    if(tnow>tmax)
      tmax=tnow;
  
    // On affiche le résultat sur le LCD.
    lcd.clear();
    lcd.print("    ");
    lcd.print(tnow);
    lcd.write(223);
    lcd.print("C");

    // Température mini
    lcd.setCursor(0,1);
    lcd.write(1);
    lcd.print(tmin);
    lcd.write(223);
  
    lcd.print(" ");

    // Température maxi
    lcd.write(0);
    lcd.print(tmax);
    lcd.write(223);
  }
  
  // on attend 1 seconde
  delay(1000); 
}