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 :
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 !