Panier d’achat

Aucun produit dans le panier.

Capteur de Température DS18B20 Avec Sonde 1M/2M

35.00 د.م.40.00 د.م.


  • Composants essentiels : DS18B20, avec grande précision et une bonne stabilité.
  • Ligne de transfert numérique, ce qui améliore considérablement le système anti-interférences.
  • Boîtier en laiton nickelé, résistant à l’eau et à la corrosion.
  • Convient pour les mesures de température en milieux liquides.
UGS : CM023 Catégories : , Étiquettes : , , ,

Tuoriel: Mesurer une température avec un capteur 1-Wire DS18B20 et une carte Arduino


Pour les utilisateurs de la version « sonde », le fil rouge représente l’alimentation, le fil noir représente la masse et le fil jaune représente la broche de données.

Le montage

Le montage du capteur avec une carte Arduino est relativement simple à mettre en oeuvre.

Pour réaliser ce montage, il va nous falloir :

  • Une carte Arduino UNO (et son câble USB),

  • Une résistance de 4.7K ohms, code couleur jaune – violet – rouge,

  • Un ou plusieurs capteurs DS18B20,

  • Une plaque d’essai et des fils pour câbler notre montage.

Schéma du montage pour capteur DS18B20 1-Wire Arduino.

Schéma du montage

On commence le montage en reliant ensemble la masse des capteurs avec la masse GND de la carte Arduino. On fait ensuite de même avec l’alimentation 5V de la carte Arduino et l’alimentation des capteurs.

Il ne reste alors plus qu’à relier la broche de données des capteurs à une broche de la carte Arduino. Pour cet article, j’utilise la broche D10 de la carte Arduino, mais vous pouvez utiliser n’importe quelle autre broche si vous le souhaitez.

Pour finir le montage, il convient de placer une résistance de 4.7K ohms entre l’alimentation 5V de la carte Arduino et la broche de données du bus 1-Wire.

N.B. La valeur de cette résistance est importante. Ce doit être une résistance de 4.7K ohms. Une résistance plus grande limitera le bon fonctionnement des capteurs 1-Wire et une résistance plus faible endommagera les capteurs 1-Wire.


Lire un ou plusieurs capteurs par recherche

Commençons par le cas d’usage le plus simple : vous avec un unique capteur DS18B20 sur votre bus 1-Wire.

/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>

Tout d’abord on commence notre code en important la bibliothèque de code OneWire.

N.B. Cette bibliothèque de code n’est pas fournie de base avec le logiciel Arduino, il vous faudra l’installer par vous même en suivant les instructions dans le lien un peu plus haut.

/* Broche du bus 1-Wire */ const byte BROCHE_ONEWIRE = 7; /* Code de retour de la fonction getTemperature() */ enum DS18B20_RCODES { READ_OK, // Lecture ok NO_SENSOR_FOUND, // Pas de capteur INVALID_ADDRESS, // Adresse reçue invalide INVALID_SENSOR // Capteur invalide (pas un DS18B20) };

On déclare ensuite deux constantes. Une première constante pour le numéro de broche de notre bus 1-Wire. Et une seconde constante (une énumération de constantes pour être exact) contenant les divers codes d’erreurs que la fonction de lecture de la température peut retourner.

/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);

On crée ensuite notre objet OneWire qui permettra de communiquer avec les capteurs.

PS Plusieurs bus 1-Wire peuvent être créés en parallèle sur différentes broches. N’hésitez donc pas à faire plusieurs bus pour chaque type de périphérique 1-Wire utilisé. Cela vous rendra la vie plus facile.

/** Fonction setup() **/
void setup() {

/* Initialisation du port série */
Serial.begin(115200);
}

Vient ensuite la fonction setup() qui ne fait qu’initialiser le port série pour que l’on puisse avoir un retour de la température lue.

N.B. Le (ou les) bus 1-Wire s’initialise(nt) d’eux même lors de la création de l’objet OneWire.

/** Fonction loop() **/
void loop() {
float temperature;

/* Lit la température ambiante à ~1Hz */
if (getTemperature(&temperature, true) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur"));
return;
}

/* Affiche la température */
Serial.print(F("Temperature : "));
Serial.print(temperature, 2);
Serial.write(176); // Caractère degré
Serial.write('C');
Serial.println();
}

Vient ensuite la fonction loop() qui permet de lire la température du capteur et de l’afficher sur le port série.

/**

* Fonction de lecture de la température via un capteur DS18B20.

* Plus d'informations visite: MEGMa et/ou notre page Facebook.

*/

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) {
ds.reset_search();
}

/* Recherche le prochain capteur 1-Wire disponible */
if (!ds.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 */
ds.reset();
ds.select(addr);

/* Lance une prise de mesure de température et attend la fin de la mesure */
ds.write(0x44, 1);
delay(800);

/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds.reset();
ds.select(addr);
ds.write(0xBE);

/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}

/* Calcul de la température en degré Celsius */
*temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;

// Pas d'erreur
return READ_OK;
}

Vient ensuite le gros du code : la fonction getTemperature().

Celle-ci prend en argument un pointeur vers une variable de type float qui servira à stocker la température lue, ainsi qu’un booléen permettant de savoir s’il est nécessaire de redémarrer la recherche de capteurs du début. En retour, la fonction retourne un code d’erreur.

L’algorithme de cette fonction est comme suit :

  • Si le booléen reset_search est vrai, on recommence la recherche de capteur de zéro. Ce booléen doit être à true lors de la lecture du premier capteur.

  • Ensuite on cherche un capteur sur le bus 1-Wire.

  • On vérifie que l’adresse reçue est correcte et qu’il s’agit bien d’un DS18B20.

    PS Comme vous pouvez le voir, le fait d’avoir un bus 1-Wire par type de capteurs permet de simplifier énormément le code.

  • On sélectionne le capteur trouvé et on lui envoie la commande magique 0x44 qui déclenche une prise de mesure.

  • On attend 800 millisecondes le temps que la mesure se fasse.

  • On resélectionne le capteur et cette fois on lui envoie la commande 0xBE pour lire le scratchpad.

  • On lit le scratchpad et on calcul la valeur de la température.

Le code complet avec commentaires :

/**
* Exemple de code pour lire un unique capteur DS18B20 sur un bus 1-Wire.
*/

/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>

/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 7;

/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
READ_OK, // Lecture ok
NO_SENSOR_FOUND, // Pas de capteur
INVALID_ADDRESS, // Adresse reçue invalide
INVALID_SENSOR // Capteur invalide (pas un DS18B20)
};

/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);

/**
* Fonction de lecture de la température via un capteur DS18B20.
*/
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) {
ds.reset_search();
}

/* Recherche le prochain capteur 1-Wire disponible */
if (!ds.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 */
ds.reset();
ds.select(addr);

/* Lance une prise de mesure de température et attend la fin de la mesure */
ds.write(0x44, 1);
delay(800);

/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds.reset();
ds.select(addr);
ds.write(0xBE);

/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}

/* Calcul de la température en degré Celsius */
*temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;

// Pas d'erreur
return READ_OK;
}

/** Fonction setup() **/
void setup() {

/* Initialisation du port série */
Serial.begin(115200);
}

Passons maintenant au second cas d’usage ultra classique : vous avez plusieurs capteurs sur un même bus 1-Wire.

N.B. Dans cette version du code, l’ordre de lecture des capteurs est matériellement fixé par les adresses des divers capteurs. On verra dans le chapitre suivant comment fixer soi-même l’ordre de lecture.

/** Fonction loop() **/
void loop() {
float temperature[3];

/* Lit les températures des trois capteurs */
if (getTemperature(&temperature[0], true) != READ_OK) {
Serial.println(F(« Erreur de lecture du capteur 1 »));
return;
}
if (getTemperature(&temperature[1], false) != READ_OK) {
Serial.println(F(« Erreur de lecture du capteur 2 »));
return;
}
if (getTemperature(&temperature[2], false) != READ_OK) {
Serial.println(F(« Erreur de lecture du capteur 3 »));
return;
}

/* Affiche les températures */
Serial.print(F(« Temperatures : « ));
Serial.print(temperature[0], 2);
Serial.write(176); // Caractère degré
Serial.print(F(« C, « ));
Serial.print(temperature[1], 2);
Serial.write(176); // Caractère degré
Serial.print(F(« C, « ));
Serial.print(temperature[2], 2);
Serial.write(176); // Caractère degré
Serial.println(‘C’);
}

Pour lire plusieurs capteurs de suite, il suffit de passer true en second argument lors du premier appel à getTemperature() puis false pour les appels suivants. Cela aura pour effet de redémarrer la recherche de capteur lors de la lecture du premier capteur. L’ordre de lecture des capteurs restera ainsi toujours le même.

Le code complet avec commentaires :

/**
* Exemple de code pour lire plusieurs capteurs DS18B20 sur un même bus 1-Wire.

* Visite MEGMA Micro-Electroniques Générales au Maroc */
*/

/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>

/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 7;

/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
READ_OK,
NO_SENSOR_FOUND,
INVALID_ADDRESS,
INVALID_SENSOR
};

/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);

/**
* Fonction de lecture de la température via un capteur DS18B20.
*/
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) {
ds.reset_search();
}

/* Recherche le prochain capteur 1-Wire disponible */
if (!ds.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 */
ds.reset();
ds.select(addr);

/* Lance une prise de mesure de température et attend la fin de la mesure */
ds.write(0x44, 1);
delay(800);

/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds.reset();
ds.select(addr);
ds.write(0xBE);

/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}

/* Calcul de la température en degré Celsius */
*temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;

// Pas d'erreur
return READ_OK;
}

/** Fonction setup() **/
void setup() {

/* Initialisation du port série */
Serial.begin(115200);
}

/** Fonction loop() **/
void loop() {
float temperature[3];

/* Lit les températures des trois capteurs */
if (getTemperature(&temperature[0], true) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur 1"));
return;
}
if (getTemperature(&temperature[1], false) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur 2"));
return;
}
if (getTemperature(&temperature[2], false) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur 3"));
return;
}

/* Affiche les températures */
Serial.print(F("Temperatures : "));
Serial.print(temperature[0], 2);
Serial.write(176); // Caractère degré
Serial.print(F("C, "));
Serial.print(temperature[1], 2);
Serial.write(176); // Caractère degré
Serial.print(F("C, "));
Serial.print(temperature[2], 2);
Serial.write(176); // Caractère degré
Serial.println('C');
}

Plus d’information visite notre page Facebook.


Langueur

1M, 2M

Avis

Il n’y a pas encore d’avis.

Soyez le premier à laisser votre avis sur “Capteur de Température DS18B20 Avec Sonde 1M/2M”

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

Tous les résultats de recherche
×