Arduino #2 La sonde de T° DS18B20

Bonsoir,

 

Comme promis, je vais vous présenter un capteur de t° assez facile à et très simple à connecter sur la carte Arduino. Il peut mesurer des t° entre – 35°c et +125°c ce qui nous convient tant pour mesurer la t° dans une ruche que pour faire un termostat.

 

Il s’agit du DS18B20. Fabriqué par la firme Dallas qui fournit une bibliothèque Arduino pour exploiter ses capteurs. Vous trouvez cette bibliothèque ici :

http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip

 

Il vous reste juste à la dézipper et de l’inclure dans le code du programme. #include <OneWire.h>

 

(Attention de relancer le programme après l’installation de la bibliothèque)

 

Si vous désirez tout savoir sur ce capteur voyez la datasheet : http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

 

Maintenant ce qu’il faut :

 

Une arduino

Un DS18B20

Une résistance de 4,7 Kohm (Lors de mes tests j’ai utilisé sans problème une résistance de 10Kohm)

 

Quelques fils

 

Je suis fort paresseux donc je invite à visiter ce lien ou il y a des photos du montage et un code simple de lecture et d’affichage de la t° via la liaison série entre l’Arduino et l’ordinateur. Pourquoi refaire ce qu’un autre a déjà fait ?

 

http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/

 

L’étape suivante sera pour demain. Connecter un écran LCD et lui faire afficher la t°.

 

En attendant voici quelques photos IMG_3648 IMG_3649 IMG_3651 IMG_3652 IMG_3655 IMG_3657 IMG_3658

Le code du programme :

#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();
}

 

}

 

 

2 réflexions sur « Arduino #2 La sonde de T° DS18B20 »

  1. Bonjour Jean Pol, (la 1ere fois je n’étais pas sur le bonne page)

    Je suis en train de réaliser mes premiers tests Arduino
    et je viens de tester ta mesure de température à l’aide d’un DS18B20 (en boucle Loop).

    Je constate 1 mesure sur 2 en erreur. Je recherche donc la cause, et voici mes conclusions :

    Pour le mettre en évidence j’ai ajouté la ligne : « Serial.println( » 1_W non trouve »); voir ci-dessous

    if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search(); // Réinitialise la recherche de module
    Serial.println( » 1_W non trouve »);
    return false; // Retourne une erreur
    }

    D’après moi,
    comme il n’y a qu’un seul DS18B20, il faut réinitialiser la recherche à chaque fois car le programme
    recherche un second DS18B20 et comme il n’y en a pas, il renvoie une erreur.

    Conclusion :
    Avec un seul (ou même plus) DS18B20, il faut mettre « ds.reset_search(); » en début dans la boucle loop.

    Le connais assez bien le DS18B20, je l’ai déjà programmé en assembleur PIC16F84

    Bien à toi
    Géryko

  2. Bonjour Géryko,

    J’ai approuvé sur les deux pages 🙂

    Merci de ton commentaire, je dois avouer que chez moi cela fonctionne ainsi, même avec une seule sonde. Quel temps indiques tu entre chaque lecture ?

    Un de mes projet est de mesurer la t° dans les ruches avec plusieurs sondes. Je ferai cela quand j’en aurai le temps.

    Bonne journée

    Jean-Pol

Répondre à geryko Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.