pages

30 avr. 2016

DHT22 pour mesurer température et humidité

Le DS18B20 permet la lecture de la température, le circuit DHT22 permet lui de mesurer la température et également le taux d'humidité avec de bonnes performances.

Mesure température et humidité avec le DHT22



DHT22 ou AM2302 : Présentation


On le trouve également sous la référence AM2302, le datasheet peut être téléchargé par ex ICI.

dht22 ou am2302

Le branchement se fait à l'aide de trois pins :
  • une pin VCC
  • une pin 0V
  • une pin data
Cela ressemble au circuit DS18B20 mais la pin data n'est pas compatible I2C, c'est un format propriétaire qui est utilisé pour le dialogue avec le microcontrôleur.

Les principales caractéristiques sont :
  • tension d'alimentation : 3,3V à 6V
  • plage de mesure : humidité 0 à 100%, température -40°C à +80°C
  • résolution : humidité 0,1%, température 0,1°C
  • précision : humidité ± 2%, température ± 0,5°C
  • intensité 50µA en attente et 1,5mA en mesure

DHT22 ou AM2302 : Interface


Comme indiqué précédemment le dialogue est caractéristique car il se base sur des impulsions de largeur variable pour un "1" ou un "0".

A chaque demande du microcontrôleur le circuit répond par un bit de présence et 40 bits de données suivant l'ordre :

  • 8 bits entier pour mesure humidité 
  • 8 bits décimal pour mesure humidité
  • 8 bits entier pour mesure température
  • 8 bits décimal pour mesure température
  • 8 bits pour le CRC

Ex : 00000010  00001110    00000001  10010101    10100110
        |________________|    |________________|    |_______|
          16 bits humidité           16 bits température          CRC

soit : 0000001000001110 = 526
et    : 0000000110010101 = 405

Pour obtenir les valeurs d'humidité et de température il suffit de diviser par 10 les valeurs transmises par le circuit DHT22 soit dans notre exemple :

Humidité = 52,6 %
Température = 40,5 °C

Le CRC lui est égal à : 00000001 + 00001110 + 00000001 + 10100110 = 10100110

Un test sur le bit 7 de l'entier température est nécessaire pour déterminer si la température est négative ou positive, il est égal à 1 si la température est inférieure à 0°C.

Maintenant regardons le protocole utilisé pour transmettre les valeurs d'humidité et de température.

Cela ressemble au protocole "1wire" mais il n'est pas compatible avec celui ci, il faut donc étudier et écrire nos propres fonctions pour utiliser ce circuit.

Le diagramme d'une communication complète :

dht22 communication


Le diagramme du "start signal" :

dht22 séquence start

Le microcontrôleur impose un niveau bas pendant 1mS minimum puis un niveau haut pendant 40µS et il positionne la pin en entrée avant de lire le niveau imposé par le DHT22.

Si celui ci est présent il impose un niveau bas pendant 80µS sinon le bus reste au niveau haut, le test est donc effectué sur ce niveau bas. Avant la partie données un niveau haut 80µS est imposé par le circuit DHT22.



Le diagramme de lecture des données :

dht 22 format data

Un bit à zéro donne un niveau haut de 26µS environ et un bit à un donne un niveau haut de 70µS environ.
Le test est donc effectué sur la durée du niveau haut.

Description des fonctions utilisées 



Maintenant il reste à écrire les fonctions en tenant compte des contraintes au niveau temps.

J'ai choisi d'écrire une fonction pour générer et détecter le "start signal" et une fonction pour lire, par groupe de 8 bits, les données transmises par le circuit.

L'organigramme de la fonction "start_dht22" est représenté ci dessous :

dht22 organigramme start




Ce qui traduit en C (MPLABX) donne ceci :

 unsigned char start_dht22()
{
    //unsigned char resultat=0;
    TRISCbits.RC2=0;    // pin en sortie
    Sdht22=0;
    my_delais(2);
    Sdht22=1;
    __delay_us(40);
    TRISCbits.RC2=1;    // pin dht22 en entree
    //while (Edht22);
    __delay_us(10);
    if (!Edht22)
    {
        while(!Edht22);
        if (Edht22)
        {
            while(Edht22);
            __delay_us(1);
            //resultat=1;
            return 1;
        }
    }
    else if(Edht22)
    {
        return 0;
    }
}



L'organigramme de la fonction "lect_dht22" est représenté ci dessous :


dht22 organigramme lecture


La fonction en C (MPLABX) :

 unsigned char lec_dht22()
{
    unsigned char data_dht22=0;
    TRISCbits.RC2=1;    // pin dht22 en entree
    for (int i=0;i<8;i++)
    {
        while(!Edht22);
        __delay_us(40);
        if(Edht22) data_dht22 |= 1<<(7-i);
        while(Edht22);
    }
    return data_dht22;
}

MPLABX et XC8 : Programme de démonstration en C

Comme d'habitude le test est effectué sur notre platine à base de 18F4525.

Le programme de test test_dht22.zip contient les différents fichiers.

Et nous obtenons sur l'afficheur ceci :

dht22 affichage sur lcd


Attention ces fonctions ne sont utilisables que pour faire des tests car il n'y a aucune sécurité. Par exemple si la connexion "data" est coupée le programme risque de ne plus sortir d'une des fonctions.

Aucun commentaire:

Enregistrer un commentaire