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.
Le branchement se fait à l'aide de trois pins :
- une pin VCC
- une pin 0V
- une pin data
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 :
Le diagramme du "start signal" :
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 :
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 :
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 :
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 :
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