Outils pour utilisateurs

Outils du site


Vous n'êtes pas autorisé à effectuer cette action.
arduino:mesurer_des_temperatures_avec_deux_capteurs_ds18b20

Mesurer des températures avec des capteurs DS18B20

Objectif

L'objectif de ce montage est de mesurer simultanément deux températures avec des capteurs DS18B20.

Par exemple, en sciences physiques, on pourra visualiser “en direct” la courbe de solidification (ou de fusion) de l'eau en même temps que celle de l'eau salée.
En ajoutant un troisième capteur, on pourrait aussi superposer celle du cyclohexane.



Nous verrons aussi comment faire communiquer la carte Arduino avec Regressi pour exploiter les données acquises.



Pour une utilisation au lycée, le montage et le code sont donnés. Pour les plus réticents à utiliser un microcontrôleur, vous pouvez passer directement à la partie Acquisition des températures avec Regressi sur cette page.



Présentation du capteur de température

Le capteur de température DS18B20 permet de mesurer avec une assez bonne précision des températures allant de -55°C à +125°C.

C'est un capteur numérique de température .

Ce capteur communique avec l’Arduino grâce à un bus 1-Wire ou (OneWire).

Sur un bus 1-Wire, il est possible de connecter plusieurs capteurs de température. Pour éviter tout risque de conflit, chaque capteur dispose d'une adresse unique attribuée lors de sa fabrication.

Exemple : l'adresse de notre capteur est 0x28, 0x44, 0x62, 0x79, 0x97, 0x05, 0x03, 0x51

Pour déterminer l'adresse d'un capteur 1-Wire, on peut utiliser le scanner sur le site du carnetdumaker.net avec le montage ci-dessous.



Montage

Sur ce schéma le capteur est représenté en format transistor mais au lycée nous l'utiliserons au format sonde étanche.

Au lycée, il ne sera pas nécessaire de faire le montage, il est prêt à l'emploi sur un shield.

Code

Le code permet d'afficher sur l'écran LCD les deux températures mesurer à l'aide des sondes DS18B20 et de les envoyer sur la liaison série pour être lus par Regressi.

Pour simplifier le code, nous utiliserons plusieurs bibliothèques :

  • DallasTemperature.h pour les capteur de température ;
  • OneWire.h pour le bus 1-Wire ;
  • LiquidCrystal_I2C.h pour l'écran LCD.

Ces bibliothèques ne sont pas incluses de base dans le logiciel Arduino, il faudra les installer au préalable. (voir à la fin)

Le code Arduino pour deux capteurs DS18B20 (non Grove) sur un même bus 1-Wire :

Cliquez pour afficher le code

Cliquez pour masquer le code

/**
 * Mesures de températures avec deux capteurs DS18B20 sur un même bus 1-Wire.
 */
 
#include <OneWire.h>
#include <DallasTemperature.h>
 
/* Broche du bus 1-Wire */
 
#define ONE_WIRE_BUS 7  // Broche numérique 7, à modifier si nécessaire
 
/* Création de l'objet OneWire et sensors */
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
/* Adresses des capteurs de température */
 
DeviceAddress thermometre_1 = {0x28, 0x44, 0x62, 0x79, 0x97, 0x05, 0x03, 0x51}; // courbe bleue
DeviceAddress thermometre_2 = {0x28, 0xE1, 0x37, 0x79, 0x97, 0x08, 0x03, 0x28}; // courbe rouge
 
/* résolution */
 
int resolution = 12;  // nombre de bits
/*
9 bits   0.5 °C     93.75 ms
10 bits  0.25 °C    187.5 ms
11 bits  0.125 °C   375 ms
12 bits  0.0625 °C  750 ms */
 
/* Ecran LCD */
 
#include <LiquidCrystal_I2C.h>   // inclure la bibliothèque I2C
LiquidCrystal_I2C lcd(0x27,16,2);   // adresse i2c , nombre de colonnes, nombre de lignes de l'écran
 
/* Pour faire des mesures à intervalle régulier */
 
unsigned long tempsPrecedent = 0;
float intervalle = 1000;   // durée entre deux mesures en ms (à modifier si nécessaire)
 
void setup() {
 
  Serial.begin(115200);  // choix de la vitesse
 
  sensors.begin();
  sensors.setResolution(thermometre_1, resolution);
  sensors.setResolution(thermometre_2, resolution);
 
   /* Ecran LCD  */
 
  lcd.init();   // initialisation du LCD
  lcd.backlight();   // active le rétroéclairage 
}
 
void loop(){
  unsigned long tempsCourant = millis();  // cette variable contient le nombre de millisecondes depuis que le programme courant a démarré. 
 
  if (tempsCourant - tempsPrecedent >= intervalle) {
      tempsPrecedent = tempsCourant;
 
      /* Demande la température aux capteurs */
 
      sensors.requestTemperatures(); 
      float temperature_1 = sensors.getTempC(thermometre_1);  // obtenir la température 1 en degré
      float temperature_2 = sensors.getTempC(thermometre_2);  // obtenir la température 2 en degré
 
      /* envoie les températures sur la liaison série  */
 
      Serial.print(temperature_1, 1);
      Serial.print(",");   // les données sont séparées par des virgules.
      Serial.print(temperature_2, 1);
      Serial.println();
 
      /* Affiche les températures sur l'écran lcd */
 
      lcd.setCursor(0,0);   // mettre le curseur à la première colonne, première ligne
      lcd.print("T1 = ");  
      lcd.print(temperature_1, 1);
      lcd.print((char)223);   // symbole °
      lcd.print("C"); 
 
      lcd.setCursor(0,1);   // mettre le curseur à la première colonne, deuxième ligne
      lcd.print("T2 = ");  
      lcd.print(temperature_2, 1);
      lcd.print((char)223);   // symbole °
      lcd.print("C");         
  }
}


Le code Arduino pour trois capteurs DS18B20 Grove :

Cliquez pour afficher le code

Cliquez pour masquer le code

/**
 * Mesures de températures avec trois capteurs DS18B20 GROVE
 */
 
#include <OneWire.h>
#include <DallasTemperature.h>
 
/* Création de l'objet OneWire et sensors */
 
//OneWire oneWire(ONE_WIRE_BUS);
 
OneWire capteur1(6);   // Broche numérique 6, à modifier si nécessaire
OneWire capteur2(7);   // Broche numérique 7, à modifier si nécessaire
OneWire capteur3(8);   // Broche numérique 8, à modifier si nécessaire
 
DallasTemperature sensors1(&capteur1);
DallasTemperature sensors2(&capteur2); 
DallasTemperature sensors3(&capteur3);
 
/* Adresses des capteurs de température */
 
DeviceAddress thermometre_1 = {0x28, 0xFB, 0xFA, 0x40, 0x0B, 0x00, 0x00, 0xAE}; // courbe bleue
DeviceAddress thermometre_2 = {0x28, 0xFF, 0x7E, 0x41, 0x0B, 0x00, 0x00, 0x29}; // courbe rouge
DeviceAddress thermometre_3 = {0x28, 0x3E, 0xAE, 0x42, 0x0B, 0x00, 0x00, 0x57}; // courbe verte
 
/* résolution */
 
int resolution = 12;  // nombre de bits
/*
9 bits   0.5 °C     93.75 ms
10 bits  0.25 °C    187.5 ms
11 bits  0.125 °C   375 ms
12 bits  0.0625 °C  750 ms */
 
/* Ecran LCD GROVE */
 
#include "rgb_lcd.h"
rgb_lcd lcd;
 
/* Pour faire des mesures à intervalle régulier */
 
unsigned long tempsPrecedent = 0;
float intervalle = 3000;   // durée entre deux mesures en ms (à modifier si nécessaire)
 
void setup() {
 
  Serial.begin(115200);  // choix de la vitesse
 
  sensors1.begin();
  sensors1.setResolution(thermometre_1, resolution);
  sensors2.begin();
  sensors2.setResolution(thermometre_2, resolution);
  sensors3.begin();
  sensors3.setResolution(thermometre_3, resolution);
 
   /* Ecran LCD  */
 
  // Définir le nombre de colonnes et de lignes de l'écran LCD
    lcd.begin(16, 2); 
}
 
void loop(){
  unsigned long tempsCourant = millis();  // cette variable contient le nombre de millisecondes depuis que le programme courant a démarré. 
 
  if (tempsCourant - tempsPrecedent >= intervalle) {
      tempsPrecedent = tempsCourant;
 
      /* Demande la température aux capteurs */
 
      sensors1.requestTemperatures(); 
      float temperature_1 = sensors1.getTempC(thermometre_1);  // obtenir la température 1 en degré
      sensors2.requestTemperatures(); 
      float temperature_2 = sensors2.getTempC(thermometre_2);  // obtenir la température 2 en degré
      sensors3.requestTemperatures();
      float temperature_3 = sensors3.getTempC(thermometre_3);  // obtenir la température 2 en degré
 
      /* envoie les températures sur la liaison série  */
 
      Serial.print(temperature_1, 1);
      Serial.print(",");   // les données sont séparées par des virgules.
      Serial.print(temperature_2, 1);
      Serial.print(",");   // les données sont séparées par des virgules.
      Serial.print(temperature_3, 1);
      Serial.println();
 
      /* Affiche les températures sur l'écran lcd */
 
      lcd.setCursor(0,0);   // mettre le curseur à la première colonne, première ligne
      lcd.print("T1=");  
      lcd.print(temperature_1, 1);
      //lcd.print((char)223);   // symbole °
      //lcd.print("C"); 
 
      lcd.setCursor(0,1);   // mettre le curseur à la première colonne, deuxième ligne
      lcd.print("T2=");  
      lcd.print(temperature_2, 1);
      //lcd.print((char)223);   // symbole °
      //lcd.print("C"); 
 
      lcd.setCursor(9,0);   // mettre le curseur à la première colonne, première ligne
      lcd.print("T3=");  
      lcd.print(temperature_3, 1);
      //lcd.print((char)223);   // symbole °
      //lcd.print("C");         
  }
}



Affichage des températures

En plus de l'écran LCD, les températures mesurées peuvent être affichées sur le moniteur série ou sur le traceur série.





Acquisition des températures avec Regressi

Il est possible d'acquérir les mesures de température directement dans Regressi avec une version récente (4.5.7).

  • Dans le menu Fichier → Nouveau → Arduino / micro:bit :




  • Avec le bouton Options, régler les paramètres de la liaison série pour que Regressi communique avec la carte Arduino.



  • Cliquer sur le bouton Acquisition pour obtenir les mesures. Le graphique s'affiche automatiquement.
  • Cliquer sur Stop pour arrêter l'acquisition.



  • Cliquer sur traitements pour envoyer les données dans Regressi.



  • Vous pouvez maintenant traiter ces données avec les fonctions habituelles de Regressi.




Exemple de courbes de fusion obtenues au lycée




Courbes de fusion obtenues avec 3 capteurs





Rappel sur l'installation d'une bibliothèque

Par exemple, pour installer la bibliothèque DallasTemperature.h :

  • Ouvrez l’IDE Arduino et aller dans Croquis –> Inclure une bibliothèque –> Gérer les bibliothèques ;



  • Sélectionner puis installer la bibliothèque indiquée ci-dessous.

arduino/mesurer_des_temperatures_avec_deux_capteurs_ds18b20.txt · Dernière modification : 02/01/2024 15:38 de Stéphane LAURENT

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki