Aujourd’hui je vous ai préparé un article qui va vous faire monter en température
On va parler du DS18B20 !
–
J’avais complètement zappé de faire un tutoriel sur ce composant tout
ce qui a de plus classique, je me rattrape donc avec cet article
Le DS18B20 est un capteur de température du fabricant Dallas, il
communique via un bus 1-Wire (du même fabricant) et possède une
précision de 12 bits sur une plage de -55°C à +125°C.
Si vous voulez les détails voici le datasheet de la bête :
http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf
–
Le hardware requis pour ce tutoriel :
Une carte arduino,
Une protoboard,
Une résistance de 4K7,
Un capteur Dallas DS18B20,
Des fils
Pourquoi la résistance de 4K7 me direz vous ?
Tout simplement parce que c’est précisé dans le datasheet du fabricant,
et qu’en bon électronicien le fabricant a toujours raison
Au passage vous aurez besoin du pinout du DS18B20 :
Remarque : Dans ce tutoriel je vais alimenter le DS18B20 normalement et mode non parasite.
Le montage :
Arduino -> DS18B20
D7 -> Data
VCC -> VCC
GND -> GND
Data -> résistance de 4K7 -> VCC
–
Le fonctionnement interne du DS18B20 :
Comme tout module Dallas 1-Wire, le DS18B20 contient un "scratchpad"
qui est une sorte de mémoire tampon sécurisé ou l’on peut venir lire
et/ou écrire.
Voici comment se structure le scratchpad du DS18B20 :
On peut voir que les deux premiers octets contiennent la température
mesurée, c’est sur ces deux octets que nous allons venir lire avec notre
programme.
Le détail de ces deux registres :
Pas facile à comprendre hein
La température étant une valeur à virgule celle ci est stockée sous la
forme d’un flottant avec un exposant, une mantisse et un signe.
Pour avoir la température en degré Celsius il faut appliquer la formule suivante :
temp = ((MSB << 8) + LSB) * 0.0625;
Mais cela ne fera pas tout !
Pour pouvoir lire la température il faut tout d’abord lancer une mesure de température (logique).
Pour ce faire il faut envoyer la commande 0×44, puis faire une demande de lecture du scratchpad (0xBE).
Sauf que …
La conversion analogique -> numérique n’est pas instantanée !
Elle prend même beaucoup de temps ! Presque une seconde !
–
Bien maintenant que nous avons tous les morceaux, il suffit de rassembler les pièces du puzzle !
(J’ai collé le capteur devant mon ventilateur d’ordinateur)
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
On va parler du DS18B20 !
–
J’avais complètement zappé de faire un tutoriel sur ce composant tout
ce qui a de plus classique, je me rattrape donc avec cet article
Le DS18B20 est un capteur de température du fabricant Dallas, il
communique via un bus 1-Wire (du même fabricant) et possède une
précision de 12 bits sur une plage de -55°C à +125°C.
Si vous voulez les détails voici le datasheet de la bête :
http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf
–
Le hardware requis pour ce tutoriel :
Une carte arduino,
Une protoboard,
Une résistance de 4K7,
Un capteur Dallas DS18B20,
Des fils
Pourquoi la résistance de 4K7 me direz vous ?
Tout simplement parce que c’est précisé dans le datasheet du fabricant,
et qu’en bon électronicien le fabricant a toujours raison
Au passage vous aurez besoin du pinout du DS18B20 :
Remarque : Dans ce tutoriel je vais alimenter le DS18B20 normalement et mode non parasite.
Le montage :
Arduino -> DS18B20
D7 -> Data
VCC -> VCC
GND -> GND
Data -> résistance de 4K7 -> VCC
–
Le fonctionnement interne du DS18B20 :
Comme tout module Dallas 1-Wire, le DS18B20 contient un "scratchpad"
qui est une sorte de mémoire tampon sécurisé ou l’on peut venir lire
et/ou écrire.
Voici comment se structure le scratchpad du DS18B20 :
On peut voir que les deux premiers octets contiennent la température
mesurée, c’est sur ces deux octets que nous allons venir lire avec notre
programme.
Le détail de ces deux registres :
Pas facile à comprendre hein
La température étant une valeur à virgule celle ci est stockée sous la
forme d’un flottant avec un exposant, une mantisse et un signe.
Pour avoir la température en degré Celsius il faut appliquer la formule suivante :
temp = ((MSB << 8) + LSB) * 0.0625;
Mais cela ne fera pas tout !
Pour pouvoir lire la température il faut tout d’abord lancer une mesure de température (logique).
Pour ce faire il faut envoyer la commande 0×44, puis faire une demande de lecture du scratchpad (0xBE).
Sauf que …
La conversion analogique -> numérique n’est pas instantanée !
Elle prend même beaucoup de temps ! Presque une seconde !
–
Bien maintenant que nous avons tous les morceaux, il suffit de rassembler les pièces du puzzle !
- Code:
#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();
}
}
(J’ai collé le capteur devant mon ventilateur d’ordinateur)
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C
Temperature : 34.63°C