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.
La sonde de température à 3 fils :
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.
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;
}