Sonde de température numérique DS18B20 :
- Le thermomètre numérique DS18B20 offre une mesure de température sur 9 à 12 bits et possède une fonction d'alarme avec des points de déclenchement supérieurs et inférieurs non volatiles et programmables par l'utilisateur.
- Le DS18B20 communique via un bus 1-Wire qui, par définition ne nécessite qu'une seule ligne de données (et la masse) pour la communication avec un micro-contrôleur.
- Il a une plage de température de fonctionnement de -55°C à +125°C et est précis à ± 0,5°C sur la plage de -10°C à +85°C.
- En outre, le DS18B20 peut dériver la puissance directement à partir de la ligne de données ("puissance parasite"), éliminant le besoin d'une alimentation externe.
- Chaque DS18B20 a un unique code sur 64 bits en série, qui permet à de multiples DS18B20 de fonctionner sur le même bus one-Wire.
- Ainsi, un seul micro-contrôleur peut contrôler plusieurs DS18B20 répartis sur une grande surface.
Faible coût :
- 4€ pièce. ici en France
- 9€31 les 10 pièces en chine ici
- 66.98€ les 100 pièces http://stores.ebay.fr/czbelectronic
Un tutoriel pour le Ds18b20 : http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/
Il existe une version étanche de ce capteur :
- environ 11€ l'unité en France ici
- 4,18€ avec un câble de 3 mètres vendeurs chinois ici
- 10PCS Waterproof Digital Thermal Probe or Sensor DS18B20 pour 14.02 € super prix sur Ebay ! http://stores.ebay.fr/czbelectronic
Utilise la bibliothèque OneWire.h
Code de test :
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE);
// Création de l'objet OneWire ds
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(
float
*temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if
(!ds.search(addr)) {
// Recherche un module 1-Wire
ds.reset_search();
// Réinitialise la recherche de module
return
false
;
// Retourne une erreur
}
if
(OneWire::crc8(addr, 7) != addr[7])
// Vérifie que l'adresse a été correctement reçue
return
false
;
// Si le message est corrompu on retourne une erreur
if
(addr[0] != DS18B20)
// Vérifie qu'il s'agit bien d'un DS18B20
return
false
;
// Si ce n'est pas le cas on retourne une erreur
ds.reset();
// On reset le bus 1-Wire
ds.select(addr);
// On sélectionne le DS18B20
ds.write(0x44, 1);
// On lance une prise de mesure de température
delay(800);
// Et on attend la fin de la mesure
ds.reset();
// On reset le bus 1-Wire
ds.select(addr);
// On sélectionne le DS18B20
ds.write(0xBE);
// On envoie une demande de lecture du scratchpad
for
(byte i = 0; i < 9; i++)
// On lit le scratchpad
data[i] = ds.read();
// Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return
true
;
}
// setup()
void
setup() {
Serial.begin(9600);
// Initialisation du port série
}
// loop()
void
loop() {
float
temp;
// Lit la température ambiante à ~1Hz
if
(getTemperature(&temp)) {
// Affiche la température
Serial.print(
"Temperature : "
);
Serial.print(temp);
Serial.write(176);
// caractère °
Serial.write(
'C'
);
Serial.println();
}
}