capteur d'humiditée qui sature

Bonjour,

dans un topic précédent j’expliquai les problèmes de librairies que j’avais avec le DTH 22 :

désormais c’est réglé et je peut lire la température et l’humiditée.
c’est pour cela que je choisi d’ouvrir ce nouveau post afin de ne pas tout mélanger.

La lecture ne pose plus problème mais la valeur de l’humiditée sature à 48.7 %
et ne monte pas plus haut.
En dessous ça fonctione correctement mais une foi à 48.7 il faut plusieurs minutes pour que la valeur commence à redescendre.

dht22_test.ino
LIBRARY VERSION: 0.1.22

Type,	status,	Humidity (%),	Temperature (C)	Time (us)
DHT22, 	Checksum error,	42.3,	23.5,	5384
DHT22, 	Checksum error,	41.9,	23.5,	5252
DHT22, 	Checksum error,	41.9,	23.5,	5248
DHT22, 	Checksum error,	48.7,	24.2,	5388
DHT22, 	Checksum error,	48.7,	25.9,	5352
DHT22, 	Checksum error,	48.7,	26.7,	5392
DHT22, 	Checksum error,	48.7,	26.4,	5300
DHT22, 	Checksum error,	48.7,	26.3,	5348
DHT22, 	Checksum error,	48.7,	26.2,	5296
DHT22, 	Checksum error,	48.7,	26.0,	5352

le code est celui fourni en exemple avec la librairie :

//
//    FILE: dht22_test.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.03
// PURPOSE: DHT library test sketch for DHT22 && Arduino
//     URL:
// HISTORY:
// 0.1.03 extended stats for all errors
// 0.1.02 added counters for error-regression testing.
// 0.1.01
// 0.1.00 initial version
//
// Released to the public domain
//

#include <dht.h>

dht DHT;

#define DHT22_PIN 5

struct
{
    uint32_t total;
    uint32_t ok;
    uint32_t crc_error;
    uint32_t time_out;
    uint32_t connect;
    uint32_t ack_l;
    uint32_t ack_h;
    uint32_t unknown;
} stat = { 0,0,0,0,0,0,0,0};

void setup()
{
    Serial.begin(115200);
    Serial.println("dht22_test.ino");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT_LIB_VERSION);
    Serial.println();
    Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)\tTime (us)");
}

void loop()
{
    // READ DATA
    Serial.print("DHT22, \t");

    uint32_t start = micros();
    int chk = DHT.read22(DHT22_PIN);
    uint32_t stop = micros();

    stat.total++;
    switch (chk)
    {
    case DHTLIB_OK:
        stat.ok++;
        Serial.print("OK,\t");
        break;
    case DHTLIB_ERROR_CHECKSUM:
        stat.crc_error++;
        Serial.print("Checksum error,\t");
        break;
    case DHTLIB_ERROR_TIMEOUT:
        stat.time_out++;
        Serial.print("Time out error,\t");
        break;
    case DHTLIB_ERROR_CONNECT:
        stat.connect++;
        Serial.print("Connect error,\t");
        break;
    case DHTLIB_ERROR_ACK_L:
        stat.ack_l++;
        Serial.print("Ack Low error,\t");
        break;
    case DHTLIB_ERROR_ACK_H:
        stat.ack_h++;
        Serial.print("Ack High error,\t");
        break;
    default:
        stat.unknown++;
        Serial.print("Unknown error,\t");
        break;
    }
    // DISPLAY DATA
    Serial.print(DHT.humidity, 1);
    Serial.print(",\t");
    Serial.print(DHT.temperature, 1);
    Serial.print(",\t");
    Serial.print(stop - start);
    Serial.println();

    if (stat.total % 20 == 0)
    {
        Serial.println("\nTOT\tOK\tCRC\tTO\tCON\tACK_L\tACK_H\tUNK");
        Serial.print(stat.total);
        Serial.print("\t");
        Serial.print(stat.ok);
        Serial.print("\t");
        Serial.print(stat.crc_error);
        Serial.print("\t");
        Serial.print(stat.time_out);
        Serial.print("\t");
        Serial.print(stat.connect);
        Serial.print("\t");
        Serial.print(stat.ack_l);
        Serial.print("\t");
        Serial.print(stat.ack_h);
        Serial.print("\t");
        Serial.print(stat.unknown);
        Serial.println("\n");
    }
    delay(2000);
}
//
// END OF FILE
//

et la librairie est celle de Rob Tillaart disponible ici :

http://www.cjoint.com/doc/17_07/GGbsXZuoOo8_Arduino-master.zip

est ce que vous savez d’ou viens le problème ?

bonne journée,
cordialement,

siera

"Checksum error" --> ça ne sent pas très bon... pas la peine d'imprimer la valeur si l'appel de la lecture a retourné une erreur...

Bonjour,

Il y a bien une résistance de pullup sur la pin data ?

J-M-L:
"Checksum error" --> ça ne sent pas très bon..

C'est le moins que l'on puisse dire.

Ces circuits DHT11,22, 32.......... sont des circuits rapides. Le fabricant en est conscient et à la réponse humidité/ température il a ajouté quelques bits qui constituent la somme de contrôle afin qu'à la réception on puisse vérifier l'intégrité de la réponse.

Donc si la bibliothèque au moment de ce contrôle d'intégrité déclenche une alarme "Checksum error"" ce n'est pas la peine d'aller plus loin : le message reçu est faux, il faut trouver l'origine de l'erreur.

Les DHTxx utilisent en sortie un montage dit à "collecteur ouvert".
En pratique cela signifie que le collecteur du transistor de sortie est dans le vide : il n'est raccordé à rien.
C'est à l'utilisateur à terminer le montage en chargeant le collecteur avec une résistance reliée à l'alimentation.

Souvent la résistance de pull-up interne au microcontrôleur est suffisante pour garantir une bonne transmission.
Elle est activée d'office dans la bibliothèque.
Cette résistance de pull-up interne fait 50 kohms au nominal mais peut faire entre 30k et 70kohms selon le lot de fabrication.
Peut-être que tu as eu malchance d'être tombé sur un lot avec des résistances trop élevées.
Dans ce cas tu suis le conseil de Kamill et tu place entre la sortie Data et le Vcc une résistance autour de 10 k

Bonjour,

merci à tous de vos réponses !

Pour la résistance pullup j'en ai déja une de 4.7 K comme préconisé dans un tuto.
j'ai éssayé avec et sans, résultat : il n'y à aucune différence.

Pour ce qui est du "Checksum error" dans le topic précédent dont je donne le lien ici :

dans un topic précédent j'expliquai les problèmes de librairies que j'avais avec le DTH 22 :

https://forum.arduino.cc/index.php?topic=485781.0

J'avais émis l'hypothèse qu'il y ai une érreur dans la bibliothèque (une inversion) car toutes les valeurs retournées "Checksum error" était normale et les valeurs retournée "OK" était délirante.

avez vous une idée de test que je puisse faire pour déterminer d'ou viens le problème ?

bonne soirée,
cordialement,

Siera

avez vous une idée de test que je puisse faire pour déterminer d'ou viens le problème ?

Non car cette bibliothèque est réputée pour fonctionner.

Elle n'est pas difficile à comprendre.
Le DHT22 est aussi connu sous le nom AM2302
J'ai déjà mis sa datasheet en pièce jointe ces derniers jours

La réponse du DHT22 est une suite de couples 0/1, que ce soit pour l'acknoledge qui suit la prise de ligne ou les bits correspondant à l'humidité et à la température.
Un bit d'information est constitué d'un couple 0 suivi d'un 1 --> c'est un codage on envoie 2 éléments pour n'obtenir au final qu'un bit.
C'est une succession de boucles while qui détecte les 0 puis les 1.
Ensuite pour savoir si le couple reçu représente un 1 ou un 0 il faut déterminer si le 1 est plus long ou plus court que le 0.

C'est très simple, il n'y a qu'une astuce : pour minimiser les risques de mauvaise détection, et donc les CheckSum Error, les premiers bits de l'humidité qui, par principe sont des 0, sont affectés directement à 0.

La version de Rob utilise les registres et la dénomination des Entrée/Sortie Atmel pour lire sur une sortie car c'est plus de 10 fois plus rapide.
Les conditions dans les boucles while peuvent paraitre "ésotériques" pour quelqu'un qui ne maîtrise pas les registres et la manipulation réalisée par Arduino pour passer de la dénomination Atmel à la dénomination de 1 à n.

Pour comprendre le fonctionnement de la bibliothèque tu peux lire le fichier cpp de la version Adafruit qui utilise des digitalRead(n) moins performants mais plus facile à comprendre.