Différences entre versions de « Arduino DS18B20 »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 48 : Ligne 48 :
 
OneWire oneWire(ONE_WIRE_PIN);
 
OneWire oneWire(ONE_WIRE_PIN);
 
// Création d'une instance de DallasTemperature pour "comprendre" le DS18B20
 
// Création d'une instance de DallasTemperature pour "comprendre" le DS18B20
DallasTemperature sensor(&oneWire);
+
DallasTemperature sensors(&oneWire);
 
// Les différentes résolutions de lecture de la température
 
// Les différentes résolutions de lecture de la température
 
int resolutions[] = { 9, 10, 11, 12 };
 
int resolutions[] = { 9, 10, 11, 12 };
Ligne 57 : Ligne 57 :
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
   // On démarre la communication avec le capteur
 
   // On démarre la communication avec le capteur
   sensor.begin();
+
   sensors.begin();
 +
  // On compte le nombre de capteur
 +
  deviceNumber();
 +
  isParasitePower();
 
}
 
}
  
 
void loop(void)
 
void loop(void)
 
{  
 
{  
 +
  Serial.println(F("-----------------"));
 
   // On itére sur le tableau des résolutions
 
   // On itére sur le tableau des résolutions
 
   for(unsigned int i=0; i < 4; i++){
 
   for(unsigned int i=0; i < 4; i++){
 
     // On applique la résolution
 
     // On applique la résolution
     sensor.setResolution(resolutions[i]);
+
     sensors.setResolution(resolutions[i]);
 
     // On lit la température
 
     // On lit la température
 
     readTemp();
 
     readTemp();
 
   }
 
   }
  Serial.println(F("-----------------"));
+
   // On attend 2 seconde
   // On attend 1 seconde
+
   delay(2000);
   delay(1000);
 
 
}
 
}
  
 
void readTemp(){
 
void readTemp(){
 
   // On demande au capteur de faire une lecture de la température
 
   // On demande au capteur de faire une lecture de la température
   sensor.requestTemperatures();  
+
   sensors.requestTemperatures();  
 
   Serial.print(F("Temperature is "));
 
   Serial.print(F("Temperature is "));
 
   // On récupére la valeur
 
   // On récupére la valeur
   Serial.print(sensor.getTempCByIndex(0));  
+
   Serial.print(sensors.getTempC(9));  
 
   Serial.print(F(" at "));
 
   Serial.print(F(" at "));
 
   // On affiche la résolution du capteur
 
   // On affiche la résolution du capteur
   Serial.print(sensor.getResolution());
+
   Serial.print(sensors.getResolution());
 
   Serial.println(F(" bits "));
 
   Serial.println(F(" bits "));
 +
}
 +
 +
void deviceNumber(){
 +
  Serial.print(F("Searching devices... "));
 +
  // Compte les capteur OneWire sur le PIN
 +
  Serial.print(F("Found "));
 +
  Serial.print(sensors.getDeviceCount());
 +
  Serial.println(F(" devices."));
 +
}
 +
 +
bool isParasitePower(){
 +
  Serial.print(F("Parasite power is: "));
 +
  // Vérification de l'utilisation du mode parasite
 +
  if (sensors.isParasitePowerMode()){
 +
    Serial.println(F("ON"));
 +
  } else {
 +
    Serial.println(F("OFF"));
 +
  }
 
}
 
}
 
</source>
 
</source>
 +
 
== Résultat ==
 
== Résultat ==
 
On peut voire qu'un arrondi est effectué automatiquement par le capteur plus la résolution est faible.
 
On peut voire qu'un arrondi est effectué automatiquement par le capteur plus la résolution est faible.
 
[[Fichier:Arduino ds18b20 temp reading serial.png|centré|400px]]
 
[[Fichier:Arduino ds18b20 temp reading serial.png|centré|400px]]

Version du 4 octobre 2016 à 19:06

Partie électronique

Le composant

Le DS18B20 peut être trouvé au format TO-92 ou déjà monté sur une platine.

DS18B20.jpg
DS18B20 mounted.jpg
Format TO-92 Sur une platine avec la résistance de pull-up

Ce composant utilise le protocole 1-Wire propriétaire à Dallas, la firme qui le fabrique. L'avantage de ce protocole est de n'utiliser qu'un fil pour la communication (avec la masse) et que sur ce fil peuvent être connecté plusieurs sondes de la marque Dallas (jusqu'à 127 exactement).

Un autre avantage est que ce composant possède un registre qui permet de modifier la précision de la valeur renvoyée.

Mode Résolution Temps de conversion
9 bits 0.5°C 93.75 ms
10 bits 0.25°C 187.5 ms
11 bits 0.125°C 375 ms
12 bits 0.0625°C 750 ms

Le montage

Le montage suivant prévoit une résistance de pull-up sur le lien 1-Wire. Si vous utilisez la version avec la platine, la résistance est déjà présente, il ne reste plus qu'à brancher la broche data directement à l'Arduino.

DS18B20 diagram.jpg

Partie logicielle

Import des librairies

Avant de continuer, il faut importer la librairie nécessaire à l'utilisation du protocole 1-Wire ainsi que du capteur Dallas DS18B20.

Arduino IDE 1Wire install.png
Arduino IDE DallasTemperature install.png
Librairie OneWire Librairie DallasTemperature

Récupérer la température

Tout d'abord un code qui permet de récupérer la température

#include <OneWire.h>
#include <DallasTemperature.h>

// La patte de l'Arduino sur laquelle est branchée la patte "data" du DS18B20
#define ONE_WIRE_PIN 2
// Créer une instance du protocole 1-Wire pour communiquer avec le DS18B20
OneWire oneWire(ONE_WIRE_PIN);
// Création d'une instance de DallasTemperature pour "comprendre" le DS18B20
DallasTemperature sensors(&oneWire);
// Les différentes résolutions de lecture de la température
int resolutions[] = { 9, 10, 11, 12 };

void setup(void)
{
  // Démarrage du port série
  Serial.begin(9600);
  // On démarre la communication avec le capteur
  sensors.begin();
  // On compte le nombre de capteur
  deviceNumber();
  isParasitePower();
}

void loop(void)
{ 
  Serial.println(F("-----------------"));
  // On itére sur le tableau des résolutions
  for(unsigned int i=0; i < 4; i++){
    // On applique la résolution
    sensors.setResolution(resolutions[i]);
    // On lit la température
    readTemp();
  }
  // On attend 2 seconde
  delay(2000);
}

void readTemp(){
  // On demande au capteur de faire une lecture de la température
  sensors.requestTemperatures(); 
  Serial.print(F("Temperature is "));
  // On récupére la valeur
  Serial.print(sensors.getTempC(9)); 
  Serial.print(F(" at "));
  // On affiche la résolution du capteur
  Serial.print(sensors.getResolution());
  Serial.println(F(" bits "));
}

void deviceNumber(){
  Serial.print(F("Searching devices... "));
  // Compte les capteur OneWire sur le PIN
  Serial.print(F("Found "));
  Serial.print(sensors.getDeviceCount());
  Serial.println(F(" devices."));
}

bool isParasitePower(){
  Serial.print(F("Parasite power is: ")); 
  // Vérification de l'utilisation du mode parasite
  if (sensors.isParasitePowerMode()){
    Serial.println(F("ON"));
  } else {
    Serial.println(F("OFF"));
  }
}

Résultat

On peut voire qu'un arrondi est effectué automatiquement par le capteur plus la résolution est faible.

Arduino ds18b20 temp reading serial.png