[TUTORIEL] Mise en oeuvre du capteur DS18b20 sur Arduino

Informations et questions sur les composants tiers de la boutique (émetteur/récepteur RF, capteurs...)

[TUTORIEL] Mise en oeuvre du capteur DS18b20 sur Arduino

Message non lude Stéphane » Ven 2 Mar 2012 17:40

Bonjour,

Le DS18b20 est un capteur de température précis à plus ou moins 0.5°C, et opérant entre -55°C et +125°C.
Très prisé dans le monde Arduino, il diffère des autres capteurs habituellement utilisés par le fait qu'il communique de manière logique avec les équipements. En effet, là où on récupèrera une tension analogique avec certains capteurs, ici, on utilisera un protocole de communication pour discuter avec lui.

Ce protocole est le 1-Wire, créé par Dallas Semiconductor, également manufacteur du DS18b20.
Pour simplifier l'utilisation de ce protocole pour les utilisateurs Arduino, une librairie nommée OneWire a été écrite ici.

Dans l'exemple qui va suivre nous utiliserons un shield Deuligne de chez Snootlab, pour afficher la valeur retournée par le DS18b20.
Nous interrogerons le capteur à intervalles réguliers, et afficherons la température qu'il retourne.

Le matériel nécessaire à ce petit montage est :

Arduino Uno (x1)
Shield Deuligne (x1)
Résistance de 4,7kOhms (x1)
Capteur DS18b20 (x1)

Voici l'instantané de câblage sous Fritzing :
ds18b20_bb.png
ds18b20_bb.png (33.56 Kio) Vu 8918 fois


Et voici le code correspondant :
Code: Tout sélectionner
/*
Code by Sn00tlab 2012

This code is used to provide an example of using the temperature sensor DS18B20
With the Deuligne shield (lcd shield) from Sn00tlab

The OneWire lib is available on this website :
http://www.pjrc.com/teensy/td_libs_OneWire.html

The Deuligne lib is from :
www.snootlab.com
contact@snootlab.com

Share it, improve it, it's free !
*/
#include <OneWire.h>
#include "Wire.h"
#include <Deuligne.h>



OneWire  ds(2);      // Sensor DS18b20 on pin 2
Deuligne lcd;      // lcd object declaration

void setup (void)
{
  Serial.begin(9600);
   lcd.init();
   lcd.clear();    // Clear Display
   lcd.backLight(true); // Backlight ON
}



void loop(void)
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
 
  lcd.setCursor(0,0);      //set up at first row and first column
  lcd.print("Temp en Celsius");
  lcd.setCursor(0,1);        //set up at second row and first column
 
  if ( !ds.search(addr))   
    //search for next object on Onewire bus. For the first found, continue loop, if none found, restart from 0
  {
    ds.reset_search();
    delay(250);
    return;
  }
 
  if (OneWire::crc8(addr, 7) != addr[7]) //Check if there is no errors on transmission
  {
      Serial.println("CRC invalide...");
      return;
  }
 
 if(addr[0] == 0x10)      //Check if it's a DS18b20 on the bus or not
      {
        type_s = 1;
      } else type_s=0;
     
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
 
  delay(1000);     
 
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad


  for ( i = 0; i < 9; i++)
  {           // we need 9 bytes
    data[i] = ds.read();
  }
 
  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10)
    {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
   
  }
  celsius = (float)raw / 16.0;
 
  lcd.print("     ");      // print the measured temperature in the middle of the second line
  lcd.print(celsius);
 
 
}


Voilà, amusez-vous bien avec ce petit capteur, et n'hésitez pas à poser des questions et à nous faire partager vos montages !
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Retourner vers Composants tiers

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités