Mesures de température

Mesures de température

Sonde DS18B20 de température (en version étanche).

Il faut

100% Complete

Principe de fonctionnement

Le capteur DS18B20 est un capteur 1-Wire, cela signifie qu'il communique avec une carte maître au moyen d'un bus 1-Wire. Plusieurs capteurs peuvent être reliés sur un même bus 1-Wire. Chaque capteur dispose d'une adresse unique gravée lors de la fabrication, ils sont donc tous unique.

Un bus 1-Wire est composé classiquement des trois fils : un fil de masse, un fil d'alimentation (5 volts) et un fil de données. Un seul composant externe est nécessaire pour faire fonctionner un bus 1-Wire : une simple résistance de 4.7K ohms en résistance de tirage à l'alimentation sur la broche de données.

Cablâge

Schéma de Cablage DS18B20

La sonde de température à 3 fils :

  1. Rouge : 5V
  2. Noir : Ground
  3. Jaune : Data

Le fils jaune est donc à brancher sur une entrée numérique de l'arduino.

Attention il y a une résistance de 4.7k à brancher entre le fil rouge et le jaune.

Programme

Source : carnetdumaker

Avant toute chose, il faut installer la librairie "one wire" pour Arduino (si ce n'est pas déjà fait). L'installation se fait soit à partir du dépot GIT, soit par le manager le library dans le logiciel Arduino (Sketch > Include Library > Manage Library) en cherchant "onewire".

Le code (initialisation de la sonde) :

// sonde température DS18B20 *******************************************************************
#include <OneWire.h>          // librairie pour sonde temérature
#define TemperaturePIN 4     // PIN (broche) sur laquelle est branchée la sonde
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
OneWire  capteur(TemperaturePIN);  // crée un objet One Wire sur la broche voulue
enum DS18B20_RCODES {         /* Code de retour de la fonction getTemperature() */
  READ_OK,          // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR    // Capteur invalide (pas un DS18B20)
};

Dans le bloc setup() :

void setup() {

  // --- initialisation du capteur DS18B20 ------
  capteurInit();
}

Dans le bloc loop() :

void loop() {

  // Lecture du capteur de temperature
  afficheTemperature();

}

Plus loin dans le code :

// ----------------------------------------------------------------------------------------
// Initialisation d'un capteur sur la broche.
//
void capteurInit(void) {
  Serial.println("**** Detection du capteur température **** ");
  // Si aucune sonde n'est détecté
  if ( !capteur.search(adresse)) {
    Serial.print("Aucun capteur 1-wire present sur la broche ");
    Serial.println(TemperaturePIN);
    
    delay (1000); // pause 1 seconde
    capteur.reset_search();
    return; // On sort de la fonction
  }
  // 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 ("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] == 0x10) {
    Serial.println("Type du capteur present : Capteur temperature DS18S20.");
  } else 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("");   
}
// ----------------------------------------------------------------------------------------
// Fonction d'affichage de la température.
//
void afficheTemperature(){
  // La temperature renvoyée est en Farenheit
  float temperatureF;
  if (getTemperature(&temperatureF, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur"));
    return;
  }
  // Affichage de la température du capteur
  Serial.print ("Temperature = ");
  Serial.print (temperatureF,2);
  Serial.println ("°C. ");
}
// ----------------------------------------------------------------------------------------
// Fonction de mesure de la température renvoyée par la sonde.
// avant chaque nouvelle instruction, il faut :
//    * initialiser le bus 1-wire
//    * sélectionner le capteur détecté
//    * envoyer l'instruction
// @return : float
byte getTemperature(float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
 
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    capteur.reset_search();
  }
 
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!capteur.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }
 
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }
 
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }
 
  /* Reset le bus 1-Wire et sélectionne le capteur */
  capteur.reset();
  capteur.select(addr);
 
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  capteur.write(0x44, 1);
  delay(800);
 
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  capteur.reset();
  capteur.select(addr);
  capteur.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = capteur.read();
  }
   
  /* Calcul de la température en degré Celsius */
  *temperature = ((data[1] << 8) | data[0]) * 0.0625;
 
  // Pas d'erreur
  return READ_OK;
}

Fonctions utiles de la sonde

Fonctions d'initialisation

Fonctions de communication

Fonction de contrôle des données

Fonction de contrôle de de l'alimentation

Autres projets dans la même section

Powered by eZ Publish™ CMS Open Source Web Content Management. Copyright © 1999-2014 eZ Systems AS (except where otherwise noted). All rights reserved.