DS18B20: capteur de température one wire pour arduino.

DS18B20: capteur de température one wire pour arduino.

L’acquisition de température fait partie des possibilités offerte par l’arduino qui intéresse beaucoup de monde, notamment nos ami(e)s domoticien(ne)s. Dans cet article nous allons découvrir l’un des composant les plus connu pour réaliser cette tache, le capteur de température DS18B20.

Caractéristiques du DS18B20.

Ci joint le datasheet de la bête: cliquez ici.

Plage de mesure.

Ce capteur possède une plage de température allant de -55°C à 125°C avec une tolérance comprise entre -0.5°C/+0.5°si celle ci se situe entre -10°C et 80°C (à la page 20, vous pouvez voir la courbe d’erreur en fonction de la température mesurée).

Résolution.

La température peut être codée dans une variable allant de 9 à 12 bits, ce qui offre une résolution de 0.0625°C sur 12 bits. Le prix à payer est un temps d’acquisition plus long, de 93.75ms sur 9 bits, celui ci passe à 750ms sur 12 bits (page 8).

Capteur de température numérique.

L’avantage d’être un capteur numérique est que l’on peut le brancher sur n’importe quelle borne de l’arduino (et non pas uniquement sur l’une des 6 entrées analogique), et qu’il est moins sujet aux parasites.

La technologie one wire (!)

Le one wire (1 wire) permet de pouvoir brancher plusieurs capteurs sur la même broche de l’arduino. En fait chaque capteur possède une adresse unique codée sur 64 bits (rappel sur le codage des variables ici) qui associé à une librairie chargée dans l’arduino, permet de dissocier chacun des DS18X20. Autrement dit, la où il vous fallait une carte arduino UNO complète pour brancher 16 capteurs, avec le DS18B20, vous pourrez tout mettre sur 1 seule entrée Tout Ou Rien (car c’est un capteur numérique, et non pas analogique).

Type de boitier TO92 ou étanche?

Le TO92 est la forme la plus connu de l’ensemble des composants électronique:

DS18B20 en boiter TO92

DS18B20 en boiter TO92

Mais le capteur de température DS18B20 est aussi disponible en « étanche »:

DS18B20 en boitier etanche

DS18B20  étanche

A vous de faire votre choix selon votre utilisation.

Câblage du DS18B20 avec un arduino.

Câblage « standard »

Cablage DS18B20

Figure 4 page 6

L’alimentation de GND et Vdd doit être comprise en 3V et 5.5V.

L’entrée de l’arduino arrive sur la borne DQ.

Une résistance de 4.7kΩ est à insérer entre la borne de l’arduino et un potentiel allant de 3V à Vdd (page 19).

Câblage en « alimentation-parasite »

cablage DS18B20 parasite

Figure 5 page 6

L’intérêt du mode parasite est de pouvoir cabler le capteur avec seulement 2 fils (et non pas 3!). Le principe est d’utiliser le bus pour charger un condensateur à l’intérieur du capteur qui suffit à le faire fonctionner. L’inconvénient de ce mode de fonctionnement est que la commutation du bus doit etre < a 10µsec, d’où l’utilisation d’un MOSFET pour satisfaire ces conditions.

NOTE: A l’heure actuelle, je n’ai jamais testé ce type de montage, et d’après le datasheet on a l’impression qu’il faut 2 bornes sur le micro-processeur (une qui pilote le MOSFET et une près de la résistance). J’essaierai de me pencher la dessus plus tard, ou si vous avez un retour d’expérience la dessus, vous pouvez passer m’en faire part sur le forum.

Programmer un DS18B20 dans un arduino.

Inclure la librairie onewire.

Lien de la librairie onewire: https://mega.nz/#!MFVgVaBR!Y-prjmld8DGEb9FXdgW-wxR_c7y3wzO1U00Qt6B8wiY

OneWire est un protocole de communication permettant d’établir le contact avec plusieurs récepteurs sur un seul fils (1 wire). Afin de nous facilité son utilisation,  une librairie nommée « OneWire » est à notre disposition. Alors commençons par l’installer.

Son installation est très simple. Dans Arduino IDE, cliquez sur Croquis / Inclure Library / Add .zip library

ajouter librairie arduino

Sélectionnez la librairie téléchargée au format .zip. Et voila.

Déroulement d’une séquence d’acquisition.

A la page 10 de la datasheet, on peut voir que l’acquisition de température se fait en 3 étapes:

  1. Initialisation.
  2. Commandes ROM.
  3. Commandes du capteur.

L’initialisation: Elle permet à l’arduino de savoir quels recepteurs sont présent sur le Bus et s’ils sont prêt.

Commandes ROM: La mémoire ROM est la mémoire écrit en « dur » dans le capteur, c’est à dire que ces informations restent inscrite même après en avoir coupé l’alimentation. Il existe 5 commandes concernant la ROM: search ROM, read ROM, match ROM, skip ROM et alarm search.

Commandes du capteur: Apres avoir sélectionné la capteur adéquat, nous pouvons utiliser l’une des 6 commandes (et leur code hexadécimal)pour communiquer avec le DS18B20 qui sont: convert T (44h), write scratchpad (4Eh), read scratchpad (BEh), copy scratchpad (48h), recall E² (B8h) et read supply power (B4h).

Fonctions de base.

Passons en revue les fonctions indispensable pour une première utilisation:

search(byte adresse[8]): A chaque appel de cette fonction, le programme va chercher le premier élément « non scruté » qu’il trouvera et stockera son adresse dans un tableau de 8 octets (figure 6 page 6).

Vous pouvez voir sur la datasheet que l’octet de poids faible (celui le plus à droite) nous renseigne sur la famille du capteur (lorsqu’il est égal à 28h, c’est que le capteur est un DS18B20, lorsqu’il vaut 10h c’est un DS18S20, lorsqu’il vaut 22h alors c’est un DS1822…).Puis les 6 octets suivante sont l’adresse unique du capteur. Enfin le dernier octet sert CRC sert à détecter les erreurs de transmission.

A chaque cycle du programme, la fonction cherchera un capteurs encore inconnu, et lorsqu’il n’y en aura plus, alors en retournera la valeur 0.

reset_search(): Lorsque la fonction search(add) ne trouve plus de nouvelles adresses (donc lorsque search(add)==0), il faut la réinitialiser avec cette fonction.

reset(): Différent de reset_search(), reset() sert à initialiser LE CAPTEUR avant de communiquer avec.

select(adresse[8]): Sert à sélectionner le capteur spécifié afin d’échanger avec.

write(byte commande): Sert à envoyer une commande au récepteur sélectionné précédemment via la fonction select() sous forme d’un octet (récapitulatif des commandes page12, tableau 3).

read(): Sert la lire octet par octet le « scratchpad » du capteur (description du scratchpad figure 7 page 7).

Passons au programme.

Commençons par le programme le plus simple qu’il soit, lire la température d’un seul capteur. Voila le code:

#include <OneWire.h>

// ---------- Initialisation des variables ---------------------

// Variables propres au DS18B20
const int DS18B20_PIN=10;
const int DS18B20_ID=0x28;
// Déclaration de l'objet ds
OneWire ds(DS18B20_PIN); // on pin DS18B20_PIN (a 4.7K resistor is necessary)

// Variables générales
float DS18B20_temperature;
const int SERIAL_PORT=9600;

void setup() {
// Initialisation du port de communication avec le PC
Serial.begin(SERIAL_PORT);
Serial.println("Initialisation du programme");
}

void loop() { 
DS18B20_temperature = getTemperatureDS18b20(); // On lance la fonction d'acquisition de T°
// on affiche la T°
Serial.print("(DS18B20) =>\t temperature: "); 
Serial.println(DS18B20_temperature);
}

/* --------------- Acquisition de la température ----------------------------------- */
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;

//Il n'y a qu'un seul capteur, donc on charge l'unique adresse.
ds.search(addr);

// Cette fonction sert à surveiller si la transmission s'est bien passée
if (OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("getTemperatureDS18b20 : <!> CRC is not valid! <!>");
return false;
}

// On vérifie que l'élément trouvé est bien un DS18B20
if (addr[0] != DS18B20_ID) {
Serial.println("L'équipement trouvé n'est pas un DS18B20");
return false;
}

// Demander au capteur de mémoriser la température et lui laisser 850ms pour le faire (voir datasheet)
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
// Demander au capteur de nous envoyer la température mémorisé
ds.reset();
ds.select(addr);
ds.write(0xBE);

// Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// Puis on converti la température (*0.0625 car la température est stockée sur 12 bits)
temp = ( (data[1] << 8) + data[0] )*0.0625;

return temp;
}

Comme d’habitude, analysons ce code:

Ligne 6: On nomme DS18B20_PIN la broche 10 sur laquelle sera branché le capteur

Ligne 7: Dans les informations que nous recevrons du capteur, il y aura un octet qui spécifiera la famille. Lorsque celui ci sera égal à 28 en valeur héxadécimal, c’est que ce sera un DS18B20.

Ligne 8: Nous créons un « objet » ds comme étant un élément onewire branché sur la pin 10.

Ligne 22: Nous éxécutons la fonction getTeperatureDS18B20() dont nous stockons le résultat dans la variable DS18B20_temperature.

Ligne 29: Nous créons la fonction getTeperatureDS18B20() qui nous renverra un float (nombre à virgule).

Ligne 31: Nous déclarons un tableau de 12 octets nommé data qui nous servira à stocker les données reçus du capteur.

Ligne 32: Un tableau de 8 octets nommé addr qui stockera l’adresse (unique) du capteur.

Ligne 36: ds.search(addr): cette fonction va chercher l’adresse du capteur (rappelons que dans ce montage nous n’avons qu’un seul capteur) sur le réseau 1-wire et la stocker dans le tableau addr.

Lignes 39/40/41: Ces trois lignes servent à controler si la communication entre l’arduino et le capteur s’est bien passée. Si ce n’est pas le cas nous sortons de la fonction.

Lignes 45/46/47: Compare si le 1er octet du tableau addr est égal à la constante DS18B20_ID (initialisée à 0x28 au début du programme, page 6 de la datasheet) ce qui signifie que l’élément trouvé est bien un capteur DS18B20. Si ce n’est pas le cas nous sortons de la fonction.

Lignes 50 à 54: Initialisation d’une demande d’acquisition de température au capteur.

Chaque demande de communication commencera de la même façon, avec un reset, puis la sélection du capteur (qui correspondent au ds.reset() et ds.select(addr).

Puis nous envoyer le code 0x44, qui comme indiqué dans la page 12 de la datasheet, demande au capteur de faire la conversion de température (Attention, cela ne veut pas dire qu’il nous envoie la température, il en fait simplement l’acquisition et la garde dans sa mémoire).

Enfin nous faison un delay(850) pour laisser 0.85 sec au capteur afin qu’il puisse avoir le temps de faire sa conversion (page 8 de la datasheet, notre conversion se fait sur 12 bit, il lui faut donc au minimum 750ms pour la faire).

Ligne 55 à 58: Nous demandons au capteur de nous envoyé la température qu’il vient de mémoriser.

Pour cela on réinitialise la communication avec le reset() puis la selection du capteur.

Puis on envoi la commande 0xBE qui demnde l’envoi de la température (page 12).

Ligne 61 et 62: Le capteur nous envoi 9 octets (dont seul les deux premiers nous indique la température), donc nus utilisons une boucle for pour les stocker un par un dans le tableau Data[].

Ligne 65: La température étant sur 12 bits avec une résolution de 0.0625 (page 3), nous la calculons à cette ligne.

Ligne 67: Nous renvoyons le résultat du calcul.

Voila, avec ce programme, vous pourrez lire la température d’un capteur DS18B20 avec à un arduino.

Prochainement nous verrons comment faire pour lire plusieurs capteurs sur une seule entrée.

Pour toutes vos questions pensez au forum (cliquez ici pour le forum).

Bonne bidouilles!


Lien interne:

Comparatif d’un LM354, DS18B20 et DHT22: Lien de la comparaison ici.


Arduino playground one-wire: http://playground.arduino.cc/Learning/OneWire

Site de Paul Stoffrengen: http://www.pjrc.com/teensy/td_libs_OneWire.html


Mots clé: capteur de température, DS18B20, arduino domotique, DS18B20 arduino.

DS18B20: capteur de température one wire pour arduino.