La sonde de température DS18B20
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 résistance de 4.7 kΩ
- Quelques fils de connexion
- La sonde DS18B20
2/ Le schéma
- 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
#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
5.1/ Le matériel
5.2/ Le schéma
Câblage de l'écran
- 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
#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
6.2/ Le programme
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
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
- 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
#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
#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 <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
- 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
Sonde de température DS18B20 étanche
3.64 €
Sonde de température digitale étanche.
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.
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é).