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(){
}
@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 :
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
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.
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.