Le DS18B20 est un capteur de température à un fil très précis qui peut être utilisé pour construire un thermomètre de précision. Il est facile à utiliser et peut être connecté à un affichage série USB pour afficher les données de température. Ce guide explique comment construire un thermomètre de précision basé sur le capteur de température DS18B20 et comment le connecter à un affichage série USB pour afficher les données de température.
Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
1. Présentation
Ce programme réalise un thermomètre de précision avec affichage du résultat dans la fenêtre Terminal série, à l’aide d’un capteur de température One-wire de type DS18B20. Une mesure est effectuée toutes les secondes.
Ce programme utilise les fonctionnalités suivantes :
- la connexion série vers le PC
- un ou plusieurs capteurs One Wire
Pour plus détails voir notamment :
- Technologie One Wire (ou « 1-wire »)
- Capteur de température « One-Wire » série DS1820
- Librairie One Wire pour capteur température type DS18B20
2. Matériel Nécessaire
2.1 L’espace de développement Arduino
- … pour éditer, compiler le programme et programmer la carte Arduino.
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919588_839_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
2.2 Le matériel suivant pour réaliser le montage associé
- une plaque d’essai pour montage sans soudures,
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919590_941_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
- des straps,
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919592_999_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
- un seul capteur de température One Wire type DS18B20 :
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919595_544_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
Trouvé ici (2 Euros) : http://www.watterott.com/en/DS18B20
Présenté ici : Capteur de température « One-Wire » série DS1820
3. Instructions de montage
- Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1)
- Connecter sur la broche 2 la broche de données du capteur One Wire
4. Le schéma théorique du montage
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919596_336_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
Le schéma théorique du montage
5. Le circuit du montage
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919605_525_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
Le schéma du montage à réaliser
6. Explication du programme
6.1 Structure globale du programme
Ce programme simple comprend :
- une entête déclarative
- une partie « configuration » qui ne sera exécutée qu’une fois (fonction setup( ) )
- une partie constituée d’une boucle sans fin que le programme répètera à l’infini ( fonction loop( ) ) : c’est le coeur du programme.
6.2 Déroulement du programme
Le programme se déroule de la façon suivante :
- Après avoir pris en compte les instructions de la partie déclarative,
- puis après avoir exécuté la partie configuration ( fonction setup( ) ),
- le programme bouclera sans fin ( fonction loop ( ) ), exécutant de façon répétée le code compris dans la boucle sans fin.
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919607_568_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
Le déroulement du programme
7. Au niveau de la partie déclarative :
Inclusion des librairies utilisées
- On inclut les librairies des fonctionnalités utilisées :
- Inclusion de la librairie pour les capteurs One Wire:
#include <OneWire.h> // librairie pour servomoteur
Déclaration de constantes utiles
- On déclare les constantes utiles dans le programme :
Déclaration des constantes de broches
- Déclaration des constantes pour les broches utilisées dans le programme :
const int broche_OneWire=2; //declaration constante de broche
Déclaration des variables globales
- Déclaration des variables globales du programmes :
-
- Déclaration des variables globales utilisées pour la communication One Wire
byte data[12]; Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire byte adresse[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire
Déclarations des objets utiles pour les fonctionnalités utilisées
- Déclaration des objets utiles pour les fonctionnalités utilisées :
- Déclaration d’un objet One Wire
OneWire capteur(broche_OneWire); // crée un objet One Wire sur la broche voulue
8. Au niveau de la fonction d’initialisation setup( ) :
Initialisation des fonctionnalités utilisées :
- On initialise les différentes fonctionnalités utilisées :
- Initialisation de la communication série avec le PC
Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission
-
- Initialisation du capteur One-Wire DS18B20
// --- initialisation du capteur DS18B20 ------ capteurInit(); // appel de la fonction d'initialisation du capteur - au début seulement // prise en compte du premier capteur trouvé // incluant affichage messages de détection du capteur dans moniteur série
9. Au niveau de la boucle principale, la fonction loop ( ) :
- On réalise une mesure de la température à l’aide de la fonction capteurMesureTemp()(voir ci-dessous) et on affiche le résultat avec 2 virgules :
ma_tempetf=capteurMesureTemp(); // appel de la fonction de mesure - renvoie une valeur float Serial.print ("Temperature = "); Serial.print (ma_tempetf,2); Serial.println (" Degres Celsius. ");
- Le programme recommence en boucle les instructions de la fonction loop( ).
Se reporter aux commentaires présents dans le programme pour plus de détails.
10. Autres Fonctions du programme :
- Une fonction rassemble toute la procédure d’initialisation du capteur DS18B20. C’est un petit peu long… mais on a rien sans rien…
void capteurInit(void) // fonction qui ne reçoit rien et ne renvoie rien { // XXXXXXXXXXXXXXXXXXXXXX Détection du capteur présent sur la broche XXXXXXXXXXXXXXXXXXXXXXX Serial.println("**** Detection du capteur **** "); while (capteur.search(adresse)== false) // tant qu'aucun nouveau capteur est détecté { // la fonction search renvoie la valeur FAUX si aucun élément 1-wire est trouvé. Serial.println("Aucun capteur 1-wire present sur la broche ! "); // affiche message + saut de ligne delay (1000); // pause 1 seconde } //la suite est exécutée seulement si un capteur est détecté // la fonction search renvoie la valeur VRAI si un élément 1-wire est trouvé. // Stocke son code d'adresse 16 bits dans le tableau adresse[8] // adresse envoyé à la fonction correspond à l'adresse de début du tableau adresse[8] déclaré ... Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : "); //--- affichage des 64 bits d'adresse au format hexadécimal for(int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets if (adresse[i]<16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal Serial.print(adresse[i], HEX); // affiche 1 à 1 les 8 octets du tableau adresse au format hexadécimal Serial.print(" "); } Serial.println(); //---- test du type de capteur ---- // le type du capteur est donné par le 1er octet du code adresse 64 bits // Valeur 0x28 pour capteur type DS18B20, 0x10 pour type DS18S20, 0x22 pour type DS1820 if (adresse[0]==0x28) { Serial.println ("Type du capteur present : Capteur temperature DS18B20."); } else { Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20."); } //----- contrôle du code CRC ---- // le dernier octet de l'adresse 64bits est un code de contrôle CRC // à l'aide de la fonction crc8 on peut vérifier si ce code est valide if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits // le code CRC de l'adresse 64 bits est le 8ème octet de l'adresse (index 7 du tableau) { Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !"); } else { Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !"); } //------- message final détection ---- Serial.println("----- fin de la recherche du capteur ----"); Serial.println(""); } //----------- fin de la fonction d'initialisation du capteur ----------
- Une seconde fonction rassemble toute la procédure de mesure de la température à l’aide du capteur DS18B20 :
//-------------- fonction de mesure de la température --------------- float capteurMesureTemp(void) { //fonction qui renvoie résultat float et ne reçoit rien //-------- variable locale de la fonction ---------- int tempet=0; // variable pour resultat brute de la mesure float tempetf=0.0; // variable pour resultat à virgule de la mesure // XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX // Serial.println("**** Acquisition d'une mesure de la temperature **** "); // avant chaque nouvelle instruction, il faut : // * initialiser le bus 1-wire // * sélectionner le capteur détecté // * envoyer l'instruction //--------- lancer une mesure -------- capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée //-------- pause d'une seconde ----- delay(1000); // au moins 750 ms // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire //---------- passer en mode LECTURE ------------- capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur // ----------- lire les 9 octets de la RAM (appelé Scratchpad) ---- for ( int i = 0; i < 9; i++) { // 9 octets de RAM stockés dans 9 octets data[i] = capteur.read(); // lecture de l'octet de rang i stocké dans tableau data } //----- caclul de la température mesurée (enfin!) --------- data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles tempet=data[1]; // bits de poids fort tempet=tempet<<8; tempet=tempet+data[0]; // bits de poids faible // --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20 tempetf=float(tempet)*6.25; tempetf=tempetf/100.0; return (tempetf); } // --------------- fin de la fonction de mesure de la température ----------
11. Mise en oeuvre du programme
11.1 Préparation du montage et programmation de la carte Arduino :
- Commencer par réaliser le montage indiqué sur plaque d’expérimentation
- Ensuite, programmer la carte Arduino avec ce programme (en bas de page) selon la procédure habituelle
11.2 Préparation du Terminal côté PC dans le logiciel Arduino
- Côté PC, il faut ouvrir la fenêtre terminal de l’IDE Arduino : pour ce faire, un simple clic sur le bouton « Sérial Monitor ».
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919610_830_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
- La fenêtre « Terminal » s’ouvre alors :
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919612_604_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
- Il faut alors régler le débit de communication sur la même valeur que celle utilisée par le programme avec lequel nous allons programmer la carte Arduino :
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/1681919615_41_Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
11.3 Fonctionnement
- Dans le moniteur série, un message initial indique que le capteur est bien détecté et que son adresse est valide. Ensuite, la valeur de la température s’affiche de façon répétée.
![Thermomètre de précision basé sur un capteur de température One-wire de type DS18B20 (affichage série USB)](https://www.mon-club-elec.fr/wp-content/uploads/www.mon-club-elec.fr/wp-content/uploads/2023/04/Thermometre-de-precision-base-sur-un-capteur-de-temperature-One-wire.gif)
12. Le programme complet en langage Arduino :
A copier/coller directement dans l’éditeur Arduino
// --- Programme Arduino --- // Copyright X. HINAULT - Créé le 11/04/2010 // www.mon-club-elec.fr // Code sous licence GNU GPL : // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // // --- Que fait ce programme ? --- /* réalise un thermomètre de précision avec affichage du résultat dans la fenêtre Terminal série, à l'aide d'un capteur de température One-wire de type DS18B20. Une mesure est effectuée toute les secondes. */ // --- Fonctionnalités utilisées --- // Utilise la connexion série vers le PC // Utilise un ou plusieurs capteurs One Wire // --- Circuit à réaliser --- // Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1) // Connecter sur la broche 2 la broche de données du capteur One Wire //**************** Entête déclarative ******* // A ce niveau sont déclarées les librairies, les constantes, les variables... // --- Inclusion des librairies utilisées --- #include <OneWire.h> // librairie pour capteur OneWire // --- Déclaration des constantes --- //---- code des instructions du capteur const int modeLecture=0xBE; const int lancerMesure=0x44; // --- constantes des broches --- const int broche_OneWire=2; //declaration constante de broche // --- Déclaration des variables globales --- byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire byte adresse[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire float ma_tempetf=0.0; // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- OneWire capteur(broche_OneWire); // crée un objet One Wire sur la broche voulue //**************** FONCTION SETUP = Code d'initialisation ***** // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter au démarrage --- Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission // --- initialisation du capteur DS18B20 ------ capteurInit(); // appel de la fonction d'initialisation du capteur - au début seulement // prise en compte du premier capteur trouvé } // fin de la fonction setup() // ******************************************************************************** //*************** FONCTION LOOP = Boucle sans fin = coeur du programme ************* // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() ma_tempetf=capteurMesureTemp(); // appel de la fonction de mesure - renvoie une valeur float Serial.print ("Temperature = "); Serial.print (ma_tempetf,2); Serial.println (" Degres Celsius. "); } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** //*************** Autres Fonctions du programme ************* //************************** fonction d'initialisation du capteur **************** void capteurInit(void) // fonction qui ne reçoit rien et ne renvoie rien { // XXXXXXXXXXXXXXXXXXXXXX Détection du capteur présent sur la broche XXXXXXXXXXXXXXXXXXXXXXX Serial.println("**** Detection du capteur **** "); while (capteur.search(adresse)== false) // tant qu'aucun nouveau capteur est détecté { // la fonction search renvoie la valeur FAUX si aucun élément 1-wire est trouvé. Serial.println("Aucun capteur 1-wire present sur la broche ! "); // affiche message + saut de ligne delay (1000); // pause 1 seconde } //la suite est exécutée seulement si un capteur est détecté // la fonction search renvoie la valeur VRAI si un élément 1-wire est trouvé. // Stocke son code d'adresse 16 bits dans le tableau adresse[8] // adresse envoyé à la fonction correspond à l'adresse de début du tableau adresse[8] déclaré ... Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : "); //--- affichage des 64 bits d'adresse au format hexadécimal for(int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets if (adresse[i]<16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal Serial.print(adresse[i], HEX); // affiche 1 à 1 les 8 octets du tableau adresse au format hexadécimal Serial.print(" "); } Serial.println(); //---- test du type de capteur ---- // le type du capteur est donné par le 1er octet du code adresse 64 bits // Valeur 0x28 pour capteur type DS18B20, 0x10 pour type DS18S20, 0x22 pour type DS1820 if (adresse[0]==0x28) { Serial.println ("Type du capteur present : Capteur temperature DS18B20."); } else { Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20."); } //----- contrôle du code CRC ---- // le dernier octet de l'adresse 64bits est un code de contrôle CRC // à l'aide de la fonction crc8 on peut vérifier si ce code est valide if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits // le code CRC de l'adresse 64 bits est le 8ème octet de l'adresse (index 7 du tableau) { Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !"); } else { Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !"); } //------- message final détection ---- Serial.println("----- fin de la recherche du capteur ----"); Serial.println(""); } //----------- fin de la fonction d'initialisation du capteur ---------- //-------------- fonction de mesure de la température --------------- float capteurMesureTemp(void) { //fonction qui renvoie résultat float et ne reçoit rien //-------- variable locale de la fonction ---------- int tempet=0; // variable pour resultat brute de la mesure float tempetf=0.0; // variable pour resultat à virgule de la mesure // XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX // Serial.println("**** Acquisition d'une mesure de la temperature **** "); // avant chaque nouvelle instruction, il faut : // * initialiser le bus 1-wire // * sélectionner le capteur détecté // * envoyer l'instruction //--------- lancer une mesure -------- capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée //-------- pause d'une seconde ----- delay(1000); // au moins 750 ms // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire //---------- passer en mode LECTURE ------------- capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur // ----------- lire les 9 octets de la RAM (appelé Scratchpad) ---- for ( int i = 0; i < 9; i++) { // 9 octets de RAM stockés dans 9 octets data[i] = capteur.read(); // lecture de l'octet de rang i stocké dans tableau data } //----- caclul de la température mesurée (enfin!) --------- data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles tempet=data[1]; // bits de poids fort tempet=tempet<<8; tempet=tempet+data[0]; // bits de poids faible // --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20 tempetf=float(tempet)*6.25; tempetf=tempetf/100.0; return (tempetf); } // --------------- fin de la fonction de mesure de la température ---------- // --- Fin programme ---
Articles Liés
- Mesure de la température à l'aide d'un capteur One-wire de type DS18B20
La mesure de la température est une tâche importante dans de nombreux domaines, allant de…
- Détection des capteurs de température DS18B20 "One-Wire" (-55°/+125° sur 12 bits) connectés à la carte Arduino
Les capteurs de température DS18B20 "One-Wire" sont des capteurs de température très précis et fiables…
- Mesure de distance à l'aide d'un capteur GP2D12 et affichage dans moniteur série
La mesure de distance est une fonctionnalité très utile dans de nombreuses applications. Dans cet…