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