Problème mesure T° négative DHT22

bonjour à tous,
je m'initie à arduino depuis peu et je ne cache pas que je transpire ...
mon 1er projet a été une CNC 3 axes qui fonctionne aujourd'hui très bien.
Et le 2ème, une simple mesure de T° avec un DHT22 et arduino uno R3 et je galère !
Impossible de lire une T° négative, dès que j'expose la DHT22 <0°c le moniteur série du soft arduino me retourne une valeur vers 400°c alors qu'il fait -18°C dans le congel, les T° positives sont bien retranscrites, juste une correction de -0,7°C.
J'ai 3 sondes DHT22 sur 3 pins différentes (4, 5 et 6), le problème est identique.
J'utilise la biblio DHT.h
voici le code avec les 3 sondes DHT22, dispo sur le net et modifié pour mon essai avec 3 sondes
Je ne sais pas pourquoi elles ne veulent pas afficher les T° négatives ... GRrrrrr ....

#include <DHT.h>

#define brocheDeBranchementDHTJaune 4    // La ligne de communication du DHT22 sera donc branchée sur la pin D6 de l'Arduino
#define brocheDeBranchementDHTBleu 5
#define brocheDeBranchementDHTBlanc 6
#define typeDeDHT DHT22             // Ici, le type de DHT utilisé est un DHT22 (que vous pouvez changer en DHT11, DHT21, ou autre, le cas échéant)

// Instanciation de la librairie DHT
DHT dhtJaune(brocheDeBranchementDHTJaune, typeDeDHT);
DHT dhtBleu(brocheDeBranchementDHTBleu, typeDeDHT);
DHT dhtBlanc(brocheDeBranchementDHTBlanc, typeDeDHT);


// ========================
// Initialisation programme
// ========================
void setup () {
  // Initialisation de la liaison série (pour retourner les infos au moniteur série de l'ordi)
  Serial.begin(9600);
  Serial.println("Programme de test du DHT22");
  Serial.println("==========================");
  Serial.println();

  // Initialisation du DHT22;
  dhtJaune.begin();
  dhtBleu.begin();
  dhtBlanc.begin();


}
 
// =================
// Boucle principale
// =================
void loop () {
  
  // Lecture des données
  float temperatureEnCelsiusJaune = dhtJaune.readTemperature();   // Lecture de la température, exprimée en degrés Celsius
  float temperatureEnCelsiusBleu = dhtBleu.readTemperature();
  float temperatureEnCelsiusBlanc = dhtBlanc.readTemperature();


  // Vérification si données bien reçues
  if (isnan(temperatureEnCelsiusJaune)) 
    Serial.println("Aucune valeur retournée par le DHT22 Jaune. Est-il bien branché ?"); {
  if (isnan(temperatureEnCelsiusBleu)) 
    Serial.println("Aucune valeur retournée par le DHT22 Bleu. Est-il bien branché ?"); 
  if (isnan(temperatureEnCelsiusBlanc)) 
    Serial.println("Aucune valeur retournée par le DHT22 Blanc. Est-il bien branché ?"); 
  }
  
  // Affichage des valeurs
  Serial.print("T° Jaune = "); Serial.print(temperatureEnCelsiusJaune); Serial.print(" °C, ");
  Serial.print("T° Bleu = "); Serial.print(temperatureEnCelsiusBleu); Serial.print(" °C, ");
  Serial.print("T° Blanc = "); Serial.print(temperatureEnCelsiusBlanc); Serial.println(" °C");

  // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
  delay(2000);
  return;         // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
}

Essaye avec la bibliothèque DHT_Unified_Sensor :

et cet exemple :

Merci,
je viens de réinstaller la biblio " 1.4.6 Bump version in library.properties" pour être sûr de ne pas avoir fait d'erreur (je l'avais déjà installée) puis versé le code proposé en enlevant, pour le moment, l'inutile.
La sonde est dans le congélateur (-18°C), emballé dans une petite poche antistatique, et au début j'ai ça dans le moniteur,

*------------------------------------*
*Temperature Sensor*
*Sensor Type: DHT22*
*Driver Ver:  1*
*Unique ID:   -1*
*Max Value:   125.00°C*
*Min Value:   -40.00°C*
*Resolution:  0.10°C*
*------------------------------------*
*Humidity Sensor*
*Sensor Type: DHT22*
*Driver Ver:  1*
*Unique ID:   -1*
*Max Value:   100.00%*
*Min Value:   0.00%*
*Resolution:  0.10%*
*------------------------------------*

puis quand la température devient négative,

Temperature: 1.20°C
Temperature: 1.10°C
Temperature: 1.00°C
Temperature: 0.80°C
Temperature: 0.70°C
Temperature: 0.50°C
Temperature: 0.30°C
Temperature: 0.10°C
Temperature: 0.00°C
Temperature: 409.40°C
Temperature: 409.30°C
Temperature: 409.20°C
Temperature: 409.00°C
Temperature: 408.90°C
Temperature: 408.70°C
Temperature: 408.60°C

après un certain temps, ça descend encore ...


18:32:50.950 -> Temperature: 394.10°C
18:32:52.979 -> Temperature: 394.00°C
18:32:54.965 -> Temperature: 394.00°C
18:32:56.955 -> Temperature: 394.00°C
18:32:59.003 -> Temperature: 393.90°C
18:33:01.012 -> Temperature: 393.90°C
18:33:02.995 -> Temperature: 393.90°C
18:33:05.006 -> Temperature: 393.90°C
18:33:07.014 -> Temperature: 393.90°C

puis tant à stabiliser vers,

18:37:42.132 -> Temperature: 391.80°C
18:37:44.174 -> Temperature: 391.80°C
18:37:46.150 -> Temperature: 391.80°C
18:37:48.149 -> Temperature: 391.80°C
18:37:50.198 -> Temperature: 391.80°C
18:37:52.163 -> Temperature: 391.70°C

je ne comprends pas pourquoi ?

(source)
Ici, il est dit qu'il existe des contrefaçons de ces capteurs : ce pourrait être des DHT11, vendus pour des DHT22. Or le DHT11 ne serait pas conçu pour lire des températures négatives.

Ici, il semble que le calcul de la température soit mal fait : DHT12 - Evaluating negative temperatures · Issue #165 · adafruit/DHT-sensor-library · GitHub

Essaye avec la bibliothèque DHT-sensor-library d'Adafruit, en appliquant la correction indiquée : je pense qu'il faut changer ces lignes

    case DHT22:
    case DHT21:
      f = ((word)(data[2] & 0x7F)) << 8 | data[3];
      f *= 0.1;
      if (data[2] & 0x80) {
        f *= -1;
      }
      if (S) {
        f = convertCtoF(f);
      }

qui se trouvent dans le fichier DHT.cpp de la bibliothèque (lignes 110 à 121).
Remplacer par :

case DHT22:
case DHT21:
f = (int16_t)(data[2] << 8 | data[3])*0.1;
if (S) {
f = convertCtoF(f);
}

Bonjour,
si j'ai bien compris, il fallait modifier le fichier DHT.h dans le répertoire DHT_sensor_library et remplacer

case DHT22:
    case DHT21:
      f = ((word)(data[2] & 0x7F)) << 8 | data[3];
      f *= 0.1;
      if (data[2] & 0x80) {
        f *= -1;
      }
      if (S) {
        f = convertCtoF(f);
      }

par ça,

case DHT22:
case DHT21:
f = (int16_t)(data[2] << 8 | data[3])*0.1;
if (S) {
f = convertCtoF(f);
}

et simplement faire "save" ou autre chose ?

Mais ça ne change rien, la température est toujours à environ 391°C pour environ -18°C

La modif est bien vue car en changeant dans la formule ```
f = (int16_t)(data[2] << 8 | data[3])*0.1;

0.1 par 0.01 sur une T°>0°C j'ai bien un rapport de 10 dans le moniteur.

D'autres idées ?

pas dans DHT.h

Visiblement ce fix ne marche pas. Vu que tu n'es pas le seul à avoir ce problème et que personne n'a de solution qui fonctionne, je te conseille de changer de capteur

BME280 par exemple :

Température :

  • Température de service : -40 ... +85°C
  • Résolution mesure de température : 0.01°C
  • Précision de la mesure de température : +/-1°C

et une CTN ferait l'affaire entre -20°C et +50°C ?
Comment linéariser sur cette plage de 70°C ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.