[Résolu] DS18B20 + DHT22

Bonjour,

Débutant dans la programmation Arduino, j’essaie de faire cohabiter les capteurs DHT22 et DS18B20. J’ai bien des valeurs dans le moniteur série, par contre je ne comprends pas pourquoi au lieu d’avoir un enchainement température-humidité-température etc. j’ai plutôt température-humidité-humidité-température.

(Comme vous le remarquerez, j’ai fusionné deux codes existants trouvés sur la toile)

#include <OneWire.h> // Inclusion de la librairie OneWire
#include "DHT.h" // Inclusion de la librairie DHT
 
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
#define DHTPIN 2 // Broche utilisée pour la sonde hygro
#define DHTTYPE DHT22   // DHT 22  (AM2302)

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
DHT dht(DHTPIN, DHTTYPE); 
 
// 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;
}
 

void setup() {
  Serial.begin(9600); // Initialisation du port série
  dht.begin(); 
}
 

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();
  }
 
 float h = dht.readHumidity();
 
 if (isnan(h)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
 
 Serial.print("Humidite: "); 
  Serial.print(h);
  Serial.println(" %");
 delay(1500);
  
}

Ce qui donne :

Temperature : 21.56°C
Humidite: 49.30 %
Humidite: 49.30 %
Temperature : 21.56°C
Humidite: 49.30 %
Humidite: 49.30 %

En vous remerciant pour votre aide.

Je ne peux pas parler du bus Onewire je ne l'ai jamais utilisé. Par contre je me suis penché sur le DHT22. Il esiste de nombreuses bibliothèques pour le gérer. Beaucoup portent le même nom, où as-tu récupéré la tienne ?

C'est la librairie Adafruit par "ladyada". Le code est récupéré de l'exemple présent dans le répertoire de la librairie.

La plus fonctionnelle , à mes yeux, est celle de Rob Tillaert que l'on trouve sur le playground. http://playground.arduino.cc/Main/DHTLib

Merci, je vais m'y intéresser.

J’ai remplacé la librairie, à l’utilisation c’est effectivement plus simple.
Mais le problème reste le même. Donc c’est à priori du côté DS18B20 / 1wire que ça coince.

Finalement en creusant et réorganisant mon code, j’ai résolu mon problème. J’ai récupéré le contenu de la fonction getTemperature() pour le placer dans le void loop() :

#include <OneWire.h>
#include <dht.h>
 
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire

#define DHT22_PIN 2 // Broche utilisée pour la sonde hygro

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
dht DHT; // Création de l'objet DHT
 
 
 
void setup() {
  Serial.begin(9600); // Initialisation du port série
}
 

void loop() {
  float temp; // Température du DS18B20
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
  
  // Lecture de la température
  
  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return;         // Retourne une erreur
  }
   
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return; // Si ce n'est pas le cas on retourne une erreur
 
  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return;         // 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;
    
  // Affiche la température
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.write(176); // caractère °
  Serial.write('C');
  Serial.println();
  
  // Lecture de l'humidité
  int chk = DHT.read22(DHT22_PIN);

  Serial.print("Humidite : ");
  Serial.print(DHT.humidity, 1);
  Serial.println(" %RH \n");
  
  delay(10000); // pause 10 sec
  
}