La sonde de température DS18B20

La sonde DS18B20, existe aussi en Etanche

Introduction


Dans ce tutoriel, nous allons apprendre à utiliser la sonde de température DS18B20 à l'aide d'un microcontrôleur de type UNO.
 Le but final, sera d'afficher sur le moniteur série de l'IDE ARDUINO la valeur de la température en °C.
 
POUR ALLER PLUS LOIN :
- Affichage de la température sur un écran LCD 16x2
- Contrôle de deux températures à des endroits différents à l'aide des modules radio NRF24L01

1/ Le matériel

- Une carte de type UNO
                  
- Une bread board
 
- Une résistance de 4.7 kΩ
 
- Quelques fils de connexion
 
- La sonde DS18B20





























2/ Le schéma

- Connecter la PIN 1 et la PIN 3 (méplat de la sonde face à vous et en partant de la gauche) à la masse .
 
- Ajouter une résistance de 4.7 kΩ sur la PIN 2 et connecter sur celle-ci à la PIN digitale n°2 de la carte ARDUINO©.
 
- A la patte de l'autre extrémité de la résistance, la relier au 5V de la carte.












3/ Le programme

/*Tutoriel sur le capteur de température et d'humidité DHT22. La sonde est disponible sur notre site internet www.ihm3d.com */
 
#include <OneWire.h> //Librairie  OneWire
#include <DallasTemperature.h> //Librairie du capteur
 
unsigned long previousMillis = 0;//variable delay sans arrêt du programme
 
const long interval = 1000;// variable delay sans arrêt du programme qui prevoit une lecture de 1 seconde par mesure
 
OneWire oneWire(2); //PIN digital de la sonde sur la pin 2 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie
 
void setup(void) {
 
  Serial.begin(9600); //définition de la vitesse et de l'ouverture du port série
  sensors.begin(); //Sonde activée
  sensors.getAddress(sensorDeviceAddress, 0); //Adresse de la sonde à 0
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions
 
  Serial.print ln("Bienvenue sur les tutoriels de IHM-3D");
 
  delay (2000);
}
 
void loop(void) {
 
  unsigned long currentMillis = millis();// inclure une variable de temps par rapport à millis()
 
  if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
 
    sensors.requestTemperatures(); //Demande la température aux capteurs
    Serial.print("Température de la pièce ");
    Serial.print(sensors.getTempCByIndex(0)); //Information récupérée sur l'adresse 0 de la sonde
    Serial.println(" DEGES ");
 
  }
}

4/ Le résultat final

5/ Pour aller plus loin

IHM-3D vous proposes d'utiliser l'exemple vu précédemment et d'afficher la température sur un écran lcd 16x2. Pour aller encore plus loin, nous utiliserons plusieurs sondes configurées sans fils à l'aide des modules radio NRF24L01. De ce fait nous aurons deux sondes situées à des endroits différents qui enverront leurs données à un micro contrôleur.

5.1/ Le matériel

Dans cette première partie, nous ajoutons un écran LCD 16x2. Il vient simplement se greffer sur le même montage vu précédemment.

5.2/ Le schéma

Câblage de l'écran

L'écran en partant de gauche à droite:
 
- Première broche de l'écran connectée sur la masse de la carte.
- Deuxième broche au 5V de la carte.
- Troisième broche sur la PIN de commande du potentiomètre.
- Quatrième broche sur la PIN 12 de la carte.
- Cinquième broche à la masse de la carte.
- Sixième broche sur la PIN 11 de la carte.
- Onzième broche sur la PIN 5 de la carte.
- Douzième  broche sur la PIN 4 de la carte.
- Treizième broche sur PIN 3 de la carte.
- Quatorzième broche sur la PIN 2 de la carte.
- Quinzième broche reliée a à une résistance de  220 kΩ puis, sur le 5V de la carte.
- Seizième broche à la masse de la carte.
 
Le deux broches restantes du potentiomètre sont relié sur la masse et le 5V de la carte. Il est utile pour régler le contraste de l'écran comme vous le souhaitez. La PIN digitale de la sonde est reliée à la PIN 7 de la carte.

5.3/ Le programme

/*Tutoriel sur le capteur de température et d'humidité DHT22. La sonde et l'écran sont disponible sur notre site internet www.ihm3d.com */
 
#include <OneWire.h> //Librairie OneWire
#include <DallasTemperature.h> //Librairie du capteur
#include <LiquidCrystal.h>  //bibliothèque de l'écran lcd
LiquidCrystal lcd(12,11,5,4,3,2);//Affectation des broches de l'écran
 
unsigned long previousMillis = 0;//variable delay sans arrêt du programme
 
const long interval = 1000;// variable delay sans arrêt du programme qui prevoit une lecture de 1 seconde par mesure
  
OneWire oneWire(7); //PIN digital de la sonde sur la pin 2 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie
 
void setup(void) {
 
  lcd.begin (16, 2);//initialisation de l'écran
  lcd.setCursor(0, 0);// au caractère 0 de la ligne 0
  lcd.print("   BIENVENUE    ");
  lcd.setCursor(0, 1);//au caractère 0 de la ligne 1
  lcd.print("  TUTO IHM 3D   ");
  delay(3000);//affichage pendant 3secondes
  lcd.clear();//rafraichissement de l'écran
 
  sensors.begin(); //Sonde activée
  sensors.getAddress(sensorDeviceAddress, 0); //Adresse de la sonde à 0
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions
}
 
void loop(void) {
 
  unsigned long currentMillis = millis();// inclure une varibale de temps par rapport à millis()
 
  if (currentMillis - previousMillis >= interval) {
 
    previousMillis = currentMillis;
 
    sensors.requestTemperatures(); //Demande la température aux capteurs
    lcd.setCursor (0, 0);//au caractére 3 de la ligne 0
    lcd.print ("  TEMPERATURE   ");
    lcd.setCursor (2, 1); //au caractére 2 de la ligne 1
   
    lcd.print(sensors.getTempCByIndex(0)); //Information récupérée sur l'adresse 0 de la sonde
    lcd.setCursor (9, 1);//au caractére 9 de la ligne 1
    lcd.print ("DEGRES");
  }
}
/*****************************FIN DU PROGRAMME**********************************/

5.4/ Le résultat final

6/ Pour aller encore plus loin

Nous avons vu comment afficher une température sur le moniteur série, afficher la température sur un écran LCD. C'est bien...mais ce qui serait vraiment pratique, c'est de pouvoir consulter plusieurs températures à l'aide d'un terminal dédié sans être relié physiquement aux sondes. Vous voulez connaître la température d'une serre de culture ou d'une dépendance tout prés de chez vous? Ou simplement connaître la température des pièces de chez vous? Suivez bien ce prochain chapitre et cela sera possible à moindre coût. Je rappelle que tout les composants utilisés dans les tutoriels sont disponible dans la boutique de notre site.

6.1/ Connaître l'adressage de la sonde

Pour utiliser plusieurs sondes en même temps, il est préférable de connaître l'adresse dédiée de chaque sondes. Nous allons utiliser le même montage que le premier du tutoriel. C'est à dire la sonde connectée sur la PIN 2 de la carte ARDUINO©.  Passons directement au programme.

6.2/ Le programme

#include <OneWire.h>
 
const int broche_OneWire = 2;
byte stockage[8];
int compt = 0;
OneWire  capteur(broche_OneWire);
 
void setup()   {
 
  Serial.begin(115200);
 
  Serial.println ("Bienvenue sur les tutoriels d'IHM 3D");
  Serial.println ("Retrouver l'adressage d'une sonde DS18B20");
  Serial.println ("==========================================");
  delay (1000);
 
  Serial.println ("L'adresse de la sonde connectée sur la PIN 2 est:");
 
  while (capteur.search(stockage) == true);
  {
    for (int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets
 
      if (stockage[i] < 16)
      Serial.print('0');
      Serial.print ("");
      Serial.print(stockage[i], HEX);
      Serial.print(" ");
    }
  }
}
void loop() {
}

6.3/ Le résultat final

Bien penser à paramétrer la vitesse de son moniteur série sur 115200 Bauds.

6.4/ Matériel pour récupérer deux valeurs de température par radio grâce aux modules NRF24L01

- 2 cartes UNO
 
- 1 carte NANO
 
- 2 résistances de 4.7 kΩ
 
- 3 modules NRF24L01
 
- 2 sondes DS18B20
 
- Bread boards















Bien penser au repérage des adresses des sondes

6.5/ Le schéma

Pour commencer, je vous proposes de visualiser le synoptique suivant pour bien comprendre le système.

Les esclaves 1 & 2 reçoivent la température des sondes. Ils transmettent celles-ci via les modules radio NRF24L01 à la carte maître. Depuis un ordinateur, je pourrais visualiser les températures des esclaves 1&2. Passons aux choses sérieuses!


La maître

- Pour commencer, câblez la carte ARDUINO© qui va recevoir les données que délivreront les sondes de température. On l'appellera la MAITRE.
- Le module radio NRF24L01 s'alimente en 3.3 Volts. Il communique avec le microcontrôleur en SPI.

Si vous utilisez une carte MEGA pensez à câbler les broches du module radio sur la carte comme suit:
MOSI en 51
MISO en 52
SCK en 53 .

L'esclave 1

L'esclave 2

En image

6.6/ Les programmes

Le maître

/*Bienvenue sur les tutoriels d'IHM 3D, vous pouvez parcourir notre site internet à l'adresse www.ihm3d.fr */
 
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>
 
RF24 radio(9, 10);
RF24Network network(radio);
const uint16_t this_node = 000;
 
struct payload_t
{
  byte senderID;
  float sens1;
};
 
void setup(void)
{
  Serial.begin(9600);
  Serial.println("Bienvenue sur les tutoriels d'IHM 3D");
  SPI.begin();
  radio.begin();
  network.begin( 88,  this_node);
}
void loop(void)
{
  network.update();
  while ( network.available())
  {
    RF24NetworkHeader header;
    payload_t payload;
    network.read(header, &payload, sizeof(payload));
    Serial.print(payload.sens1, payload.senderID);
 
    Serial.println(" DEGRES");
  }
}
/************************FIN DU PROGRAMME**********************/

L'esclave 1

/*Bienvenue sur les tutoriels d'IHM 3D. Vous pouvez retrouver tous les composants utilisés pour ce tutoriel sur le site d'IHM 3D dans la rubrique BOUTIQUE*/
                                  
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
 
#define ONE_WIRE_BUS 2
 
int numbers[6];
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Sonda0 = { 0x28, 0x61, 0x64, 0x12, 0x2F, 0x80, 0x28, 0xDE };
 
RF24 radio(9,10);
RF24Network network(radio);
const uint16_t this_node = 021;
const uint16_t other_node = 000;
 
const unsigned long interval = 2000;
unsigned long last_sent;
unsigned long packets_sent;
 
struct payload_t
{
  byte senderID;
  float sens1;
};
 
void setup()
{
Serial.begin(9600);
 
sensors.begin();
sensors.setResolution(Sonda0, 12);
Serial.println("Bienvenue sur les tutoriels d'IHM 3D");
SPI.begin();
radio.begin();
network.begin(88, this_node);
}
 
void loop(void) {
 
sensors.requestTemperatures();
delay(3000);
 
Serial.print("DS18B20 : ");
Serial.print(" ");
Serial.print(sensors.getTempC(Sonda0));
Serial.println(" C");
 
float sizeofpayload;
network.update();
 
unsigned long now = millis();
 
if ( now - last_sent >= interval )
{
last_sent = now;
 
byte senderID = 2;
float sens1 = (sensors.getTempC(Sonda0));
payload_t payload = {senderID,sens1};
RF24NetworkHeader header(/other_node);
bool ok1 = network.write(header,&payload,sizeof(payload));
}
}
/*****************************FIN DU PROGRAMME**********************************/

L'esclave 2

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
 
#define ONE_WIRE_BUS 2
 
int numbers[6];
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Sonda0 = { 0x28, 0x61, 0x64, 0x12, 0x2E, 0x49, 0x12, 0xB3 };
 
RF24 radio(9, 10);
RF24Network network(radio);
const uint16_t this_node = 001;
const uint16_t other_node = 000;
 
const unsigned long interval = 2000;
unsigned long last_sent;
unsigned long packets_sent;
 
struct payload_t
{
  byte senderID;
  float sens1;
};
 
void setup()
{
  Serial.begin(9600);
 
  sensors.begin();
  sensors.setResolution(Sonda0, 12);
  Serial.println("Bienvenue sur les tutoriels d'IHM 3D");
  SPI.begin();
  radio.begin();
  network.begin(88, this_node);
}
 
void loop(void) {
  sensors.requestTemperatures();
  delay(3000);
  Serial.print("DS18B20 : ");
  Serial.print(" ");
  Serial.print(sensors.getTempC(Sonda0));
  Serial.println(" C");
 
  float sizeofpayload;
  network.update();
 
  unsigned long now = millis();
 
  if ( now - last_sent >= interval )
  {
    last_sent = now;
 
    byte senderID = 1;
    float sens1 = (sensors.getTempC(Sonda0));
   
    payload_t payload = {senderID, sens1};
    RF24NetworkHeader header(other_node);
    bool ok1 = network.write(header, &payload, sizeof(payload));
  }
}
/*************************FIN DU PROGRAMME**************************************/

6.7/ Le résultat final

Remarques

 -  Pour avoir plus de portée (jusqu'à 1000m en terrain dégagé), vous pouvez utiliser les modules radio NRF24L01 équipés d'une antenne et d'un amplificateur pour quelques euros de plus (photo ci dessous à gauche).
 - En ce qui concerne la sonde de température DS18B20, elle existe en version étanche, avec une longueur de câble d'environ 1 mètre.
 
Ces modules sont disponible sur notre boutique.






Conclusion

Ce document tutoriel est maintenant terminé. N'hésitez pas à parcourir le site d'IHM-3D et de découvrir ses activités, et de poser vos questions à l'adresse située en pied de page.

Sonde de température DS18B20

2.17 €
Sonde de température

Plus...

Sonde de température DS18B20 étanche

3.64 €
Sonde de température digitale étanche.

Plus...

Module Radio NRF24L01 2.5 Ghz (lot de 2)

4.26 €
Connecté jusqu'à 127 module à vos micros-contrôleurs. Attention, il s'alimente en 3.3V.

Plus...

Module Radio NRF24L01 2.5 Ghz PA + LNA (lot de 2)

8.33€
Ce module posséde une antenne et un amplificateur SMA pour une plus longue portée (1000 mètres en terrain dégagé).

Plus...