Mesures de température

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

Copyright © 2015 Alex-design.fr All rights reserved.