Lecture DHT22 instable

Bonjour,

Je gratte depuis plusieurs jours afin de résoudre un problème lié à l'instabilité de du capteur de température et d'humidité DHT22.

Je souhaite mettre en place une sonde extérieure (dont certains connaissent déjà lié à un sujet sur le pont diviseur de tension et que je remercie) à base d'un ESP12F (ESP8266-12F) qui fonctionne en deep sleep avec un réveil toutes les 5 minutes pour lire les informations de la sonde DHT22 et les envoyer à Jeedom.

Hors après contrôle de mes remontées d'informations celles-ci sont instables ( voir courbe ci-dessous). J'ai d'autres sondes en fonctionnement, sur un ESP8266 qui fonctionne très bien mais qui fonctionnent en continue (sans le mode deep sleep).

Voici les pistes que j'ai étudiées et supprimées :

  • Condensateur (prévu dans la datasheet mais déjà présent sur mes sondes)
  • changer de sonde
  • respect du délai minimum pour lire la sonde

Il me reste me reste une dernière piste qui est d'alimenter en énergie la sonde de manière indépendante de l'ESP12F, mais cela ne fonctionne pas. (je pense lié à l'indépendance des deux sources d'énergie sachant que nous avons un condensateur et une résistance liés au DHT22 qui sont liés à l'ESP12F)

Vous trouverez ci-dessous le graphique afin d'imager mes propos et mon code.

//---------------------Library----------------------

#include "DHT.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

// ----------------------Sensor manage ------------------------
#define DHTPIN 5
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

// ----------------------------------WIFI---------------------------
...
// -------------------Variable----------------------

float temp_dh; //DHT temperature
float hum;
float temp_hic; //Relative temperature
const int sleepTimeS = 300;

// ---------------Variable Jeedom ------------------------
...
//************************************
//      SETUP
//************************************

void setup() {
//  Serial.begin(115200);
  dht.begin();  
// -------------WIFI--------------------
  
  delay(100);
  WiFi.hostname("ESP-Weather");
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
   while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Connecting..");
    delay(500);
   }
   Serial.println("WiFi OK");  
   Serial.println(WiFi.localIP()); 
   delay(500);
//-------------------DHT22------------------------
  
  //Read Data
  hum = dht.readHumidity(); //humidité
  temp_dh = dht.readTemperature(); // Température
  temp_hic = dht.computeHeatIndex(temp_dh, hum, false); //Temperature relative
  //Return if no data
  if ( isnan(temp_dh) || isnan(hum)) { // On test si le module répond
    }
  else{ // on envoie les données à Jeedom
    HTTPClient http;
...
}
//---------------------Batterie----------------------
  unsigned int raw_bat = analogRead(A0);

...
Serial.print("Shutdown");
ESP.deepSleep(sleepTimeS * 1000000);
  } // Fin du SETUP

//************************************
//      FIN SETUP
//************************************

void loop(){
}

Capture1.PNG

Avez-vous déjà rencontré ce genre de soucis ?

Capture1.PNG

hello
as tu testé ( à chaque réveil) de faire une lecture de la sonde "pour rien" avant d'en faire une que tu prends en compte?

Je suis sur un projet similaire avec un ESP32 en deepsleep et un DHT22 (en intérieur) : je vais regarder ce que j'obtiens.

@dfgh : Non, mais effectivement c'est un bon test.
@lesept : OK, merci.

Alors voici quelques valeurs, prises à des intervalles d'une minute :

Temperature : 20.9C Humidite : 43.1%
Temperature : 21.1C Humidite : 43.8%
Temperature : 21.2C Humidite : 43.0%
Temperature : 21.2C Humidite : 43.2%
Temperature : 21.2C Humidite : 43.0%
Temperature : 21.3C Humidite : 43.0%
Temperature : 21.3C Humidite : 42.9%
Temperature : 21.2C Humidite : 42.6%
Temperature : 21.3C Humidite : 42.8%
Temperature : 21.3C Humidite : 42.5%
Temperature : 21.4C Humidite : 42.8%
Temperature : 21.5C Humidite : 43.4%

Clairement, je n'ai pas de si grandes variations que toi.

@lesept : Effectivement, c'est plutôt stable chez toi... Tu peux me donner un peu plus d'explications sur ton montage et ton code, que je puisse comprendre un peu les différences ?

Le code est assez long, je vais extraire les parties qui concernent le DHT22. Souviens toi que c’est pour ESP32, il y a des bibliothèques spécifiques. Il y a aussi un accéléromètre et des écrans…

Les définitions :

/*
 *   Temperature sensor (DHT22)
 *   Connects to VCC, GND, pin 26
 */
#define DHT_PIN 26
#include "DHTesp.h"
DHTesp dht;

Le programme principal :

void setup() {
  Serial.begin(115200);
  if (DEBUG) Serial << "Waking up" << endl;
  // Init for first use then go to sleep
  if (!bootCount) FirstInit (); // Goes to sleep so nothing executed after that

  bootCount++;
  bool AcceleroSuccess = InitSensorsDisplays ();
  // Get reason for wakeup (1 : accelero, 3 : timer, 4 : touch)
  byte WakeupReason = wakeup_reason();
  if (DEBUG) Serial << "Wake up reason " << WakeupReason << endl;
  switch (WakeupReason) {
    case 1 : {
      if (DEBUG) Serial << " Wake up by motion" << endl;
      if (DEBUG) PrintTime ();
      if (DEBUG) Serial << "Previous orientation " << OrientationOld << endl;
      ProcessAccelero (AcceleroSuccess);
      break; }
    case 3 :
      if (DEBUG) Serial << "Wake up by timer" << endl;
      if (DEBUG) PrintTime ();
      VerifyDisplaysOrientation (Orientation);
      break;
    default :
      break;
  }
  // Prepare for deep sleep
  GoodNight (); // Nothing executed after that (ever)!
}

void loop() {}

Rien d’intéressant là-dedans pour toi. L’initialisation e fait ici :

/*
     Sensors and displays initialization
*/
bool InitSensorsDisplays () {
  // Sensors
  dht.setup(DHT_PIN, DHTesp::DHT22);
  bool AcceleroSuccess = InitAccelero ();
  // Displays

  return AcceleroSuccess;
}

Et la mesure se fait ici :

void SetDisplaysOrientation (byte Orientation) {
  // Get temperature and humidity from DHT22
  float temperature = dht.getTemperature();
  float humidite = dht.getHumidity();
  Serial.print ("Temperature : ");
  Serial.print(temperature, 1);
  Serial.print ("C\tHumidite : ");
  Serial.print(humidite, 1);
  Serial.println("%");
}

Je vois effectivement que tu n’utilises pas la même librairie que moi, et certaines personnes expliquent sur internet que l’instabilité pourrait venir aussi de la librairie, donc cela me fait quelques choses à tester, surtout que la tienne fonctionne avec un ESP8266 :wink:

Je vois effectivement que tu n'utilises pas la même librairie que moi, et certaines personnes expliquent sur internet que l'instabilité pourrait venir aussi de la librairie,

C'est possible.

Le DHT22 est un circuit assez rapide et pour le lire il ne faut pas perdre de temps dans des fioritures.
L'ESP8266 est bien plus rapide qu'un avr mais ce n'est pas suffisant il faut aussi que le programme soit optimisé et que les fonctions pour lire l'état d'une sortie ne soit pas trop lambine.

Bon, je viens de faire le test d'une lecture de la sonde au préalable. Le résultat est mieux, mais pas suffisant, surtout que j'arrive à avoir des écarts très important (voir graphique). Je pourrais lisser cela avec un peu de code, mais ce n'est pas l'objectif.
Je vais tenter avec ta librairie pour voir cela.

Bon, après changement de librairie le résultat n'est pas mieux. Je vais tenter de reprendre l'utilisation d'un alimentation différente comme j'avais pu le lire. Malheureusement après cela, je ne vois pas d'autre solution...

Tu devrais reprendre au début, par exemple en testant un exemple du net, comme celui-ci

Est-ce que ça ne viendrait pas de la tension d'alimentation du capteur qui serait trop faible ? La datasheet indique 3.3 - 6V, donc si tu lui donnes un peu moins de 3.3V, ça peut poser des problèmes.

C’est ce que je vais faire. Je me laisse 2-3 nouvelles pistes :

  • Changement de GPIO
  • Ajout d’une nouvelle alimentation pour le DHT22 en 3.3V
  • Tenter avec une autre alimentation.

Ajout d'une nouvelle alimentation pour le DHT22 en 3.3V

Ou 5V

Salut,

68tjs:
Le DHT22 est un circuit assez rapide et pour le lire il ne faut pas perdre de temps dans des fioritures.
L'ESP8266 est bien plus rapide qu'un avr mais ce n'est pas suffisant il faut aussi que le programme soit optimisé et que les fonctions pour lire l'état d'une sortie ne soit pas trop lambine.

Je doute que ce soit ca, car il y a un checksum pour validé les valeurs lue.
Chez moi, les temperatures sont vraiment stables : je regarderai aussi du coté de l'alimentation, si je me souvient bien, le DHT22 est très chatouilleux et renvoie rapidement n'importe quoi lorsqu'on descend en dessous de 3W.

Je doute que ce soit ca, car il y a un checksum pour validé les valeurs lue.

Normalement tu devrai avoir raison si la bibliothèque gère la somme de contrôle et si l'utilisateur gère aussi cette information. Une des premières bibliothèques disponible pour les micros avr, assez pourrie par ailleurs, laissait ce soin à l'utilisateur.
Je ne connais pas la série des ESP, j'ai seulement réagit à l'information qui disait que des bibliothèques sont meilleures que d'autres et avec un CI comme le DHT22 je le conçois parfaitement.

Et bien, j'ai effectivement le fin mot de l'histoire : la tension.
Alors de manière étonnante, j'ai vérifié à nouveau, mais j'ai bien une tension de 3.33V à la sortie de mon alimentation( Shield 18650 Wemos).
J'ai branché ma sonde DHT22 directement à la sortie de ma batterie 18650 qui fournie généralement entre du 4.2V et du 3.4V, donc je devrais être bon.

Merci de votre aide et dispo si vous avez des remarques.