- DHT11 - Spécifications et fonctionnement
- Communication avec le capteur DHT11
- Composants requis
- Schématique
- DHT11 avec explication du code PIC MPLABX
La mesure de la température et de l'humidité est souvent utile dans de nombreuses applications comme la domotique, la surveillance de l'environnement, la station météo, etc. Le capteur de température le plus couramment utilisé à côté du LM35 est le DHT11, nous avons déjà construit de nombreux projets DHT11 en l'interfaçant avec Arduino, avec Raspberry Pi et de nombreuses autres cartes de développement. Dans cet article, nous allons apprendre comment interfacer ce DHT11 avec PIC16F87A qui est un microcontrôleur PIC 8 bits. Nous utiliserons ce microcontrôleur pour lire les valeurs de température et d'humidité en utilisant DHT11 et l'afficher sur un écran LCD. Si vous êtes complètement nouveau dans l'utilisation des microcontrôleurs PIC, vous pouvez utiliser notre série de tutoriels PIC pour apprendre à programmer et à utiliser le microcontrôleur PIC, cela étant dit, commençons.
DHT11 - Spécifications et fonctionnement
Le capteur DHT11 est disponible sous forme de module ou sous forme de capteur. Dans ce tutoriel, nous utilisons le capteur, la seule différence entre les deux est que sous forme de module, le capteur a un condensateur de filtrage et une résistance de tirage attachée à la broche de sortie du capteur. Donc, si vous utilisez le module, vous n'avez pas besoin de les ajouter en externe. Le DHT11 sous forme de capteur est illustré ci-dessous.
Le capteur DHT11 est livré avec un boîtier de couleur bleue ou blanche. À l'intérieur de ce boîtier, nous avons deux composants importants qui nous aident à détecter l'humidité relative et la température. Le premier composant est une paire d'électrodes; la résistance électrique entre ces deux électrodes est décidée par un substrat retenant l'humidité. Ainsi, la résistance mesurée est inversement proportionnelle à l'humidité relative de l'environnement. Plus l'humidité relative sera plus faible sera la valeur de la résistance et vice versa. Notez également que l'humidité relative est différente de l'humidité réelle. L'humidité relative mesure la teneur en eau de l'air par rapport à la température de l'air.
L'autre composant est une thermistance NTC montée en surface. Le terme NTC signifie le coefficient de température négatif, pour l'augmentation de la température la valeur de la résistance diminuera. La sortie du capteur est étalonnée en usine et, par conséquent, en tant que programmeur, nous n'avons pas à nous soucier de l'étalonnage du capteur. La sortie du capteur donnée par la communication 1-Wire, voyons la broche et le schéma de connexion de ce capteur.
Le produit est dans un emballage à une rangée de 4 broches. La 1ère broche est connectée sur le VDD et la 4e broche est connectée sur le GND. La 2ème broche est la broche de données, utilisée à des fins de communication. Cette broche de données nécessite une résistance de rappel de 5k. Cependant, d'autres résistances de traction telles que 4,7k à 10k peuvent également être utilisées. La 3ème broche n'est connectée à rien. Donc, il est ignoré.
La fiche technique fournit des spécifications techniques ainsi que des informations d'interfaçage qui peuvent être vues dans le tableau ci-dessous.
Le tableau ci-dessus montre la plage et la précision des mesures de température et d'humidité. Il peut mesurer la température de 0 à 50 degrés Celsius avec une précision de +/- 2 degrés Celsius et l'humidité relative de 20 à 90% HR avec une précision de +/- 5% HR. La spécification détaillée peut être vue dans le tableau ci-dessous.
Communication avec le capteur DHT11
Comme mentionné précédemment, afin de lire les données de DHT11 avec PIC, nous devons utiliser le protocole de communication à un fil PIC. Les détails sur la façon de procéder peuvent être compris à partir du schéma d'interfaçage du DHT 11 qui peut être trouvé dans sa fiche technique, le même est donné ci-dessous.
DHT11 a besoin d'un signal de démarrage de la MCU pour démarrer la communication. Par conséquent, chaque fois que le MCU doit envoyer un signal de démarrage au capteur DHT11 pour lui demander d'envoyer les valeurs de température et d'humidité. Après avoir terminé le signal de démarrage, le DHT11 envoie un signal de réponse qui comprend les informations de température et d'humidité. La communication de données se fait par le protocole de communication de données à bus unique. La longueur totale des données est de 40 bits et le capteur envoie d'abord le bit de données le plus élevé.
En raison de la résistance de rappel vers le haut, la ligne de données reste toujours au niveau VCC en mode veille. Le MCU doit réduire cette tension de haut en bas pendant une durée minimale de 18 ms. Pendant ce temps, le capteur DHT11 détecte le signal de démarrage et le microcontrôleur rend la ligne de données élevée pendant 20 à 40 us. Ce temps de 20 à 40 us est appelé une période d'attente où le DHT11 commence à répondre. Après cette période d'attente, DHT11 envoie les données à l'unité microcontrôleur.
Format de données du capteur DHT11
Les données se composent de parties décimales et intégrales combinées ensemble. Le capteur suit le format de données ci-dessous -
Données RH intégrales 8 bits + données RH décimales 8 bits + données T intégrales 8 bits + données T décimales 8 bits + somme de contrôle 8 bits.
On peut vérifier les données en vérifiant la valeur de la somme de contrôle avec les données reçues. Cela peut être fait parce que, si tout est correct et si le capteur a transmis des données correctes, alors la somme de contrôle doit être la somme de «données RH intégrales 8 bits + données RH décimales 8 bits + données T intégrales 8 bits + données T décimales 8 bits».
Composants requis
Pour ce projet, les éléments ci-dessous sont nécessaires -
- Configuration de la programmation du microcontrôleur PIC (8 bits).
- Planche à pain
- Bloc d'alimentation 5V 500mA.
- Résistance 4,7k 2 pièces
- Résistance 1k
- PIC16F877A
- Cristal de 20 MHz
- Condensateur 33pF 2 pièces
- LCD 16x2 caractères
- Capteur DHT11
- Fils de cavalier
Schématique
Le schéma de circuit pour l'interface DHT11 avec PIC16F877A est illustré ci-dessous.
Nous avons utilisé un écran LCD 16x2 pour afficher les valeurs de température et d'humidité que nous mesurons à partir de DHT11. L'écran LCD est interfacé en mode 4 fils et le capteur et l'écran LCD sont alimentés par une alimentation externe 5V. J'ai utilisé une maquette pour effectuer toutes les connexions nécessaires et j'ai utilisé un adaptateur externe 5V. Vous pouvez également utiliser cette carte d'alimentation pour maquette pour alimenter votre carte avec 5V.
Une fois le circuit prêt, tout ce que nous avons à faire est de télécharger le code donné au bas de cette page et nous pouvons commencer à lire la température et l'humidité comme indiqué ci-dessous. Si vous voulez savoir comment le code a été écrit et comment il fonctionne, lisez la suite. Vous pouvez également trouver le fonctionnement complet de ce projet dans la vidéo donnée au bas de cette page.
DHT11 avec explication du code PIC MPLABX
Le code a été écrit à l'aide de MPLABX IDE et compilé à l'aide du compilateur XC8, tous deux fournis par Microchip lui-même et pouvant être téléchargés et utilisés gratuitement. Veuillez vous référer aux didacticiels de base pour comprendre les bases de la programmation, seules les trois fonctions importantes nécessaires à la communication avec le capteur DHT11 sont décrites ci-dessous. Les fonctions sont -
void dht11_init (); void find_response (); char read_dht11 ();
La première fonction est utilisée pour le signal de démarrage avec dht11. Comme indiqué précédemment, chaque communication avec DHT11 commence par un signal de démarrage, ici la direction de la broche est d'abord modifiée pour configurer la broche de données comme sortie du microcontrôleur. Ensuite, la ligne de données est tirée vers le bas et continue d'attendre les 18mS. Après cela, la ligne est rendue haute par le microcontrôleur et continue d'attendre jusqu'à 30us. Après ce temps d'attente, la broche de données est définie comme entrée du microcontrôleur pour recevoir les données.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configurez RD0 comme sortie DHT11_Data_Pin = 0; // RD0 envoie 0 au capteur __delay_ms (18); DHT11_Data_Pin = 1; // RD0 envoie 1 au capteur __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configurer RD0 comme entrée }
La fonction suivante est utilisée pour configurer un bit de contrôle en fonction de l'état des broches de données. Il est utilisé pour détecter la réponse du capteur DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Enfin la fonction de lecture dht11; ici, les données sont lues dans un format 8 bits où les données sont renvoyées en utilisant une opération de décalage de bits en fonction de l'état des broches de données.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // Effacer le bit (7-b) } else { data- = (1 << (7 - for_count)); // Définit le bit (7-b) while (DHT11_Data_Pin); } } données de retour; }
Après cela, tout est fait dans la fonction principale. Tout d'abord, l'initialisation du système est effectuée là où l'écran LCD est initialisé et la direction du port des broches LCD est réglée sur la sortie. L'application s'exécute dans la fonction principale
void main () { system_init (); tandis que (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Somme = read_dht11 (); if (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Humidité = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Humidité / 10)% 10)); lcd_data (48 + (Humidité% 10)); données_lcd (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Humidité:"); // lcd_puts (""); données_lcd (48 + ((RH / 10)% 10)); lcd_data (48 + (HR% 10)); lcd_puts ("%"); } else { lcd_puts ("Erreur de somme de contrôle"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Erreur !!!"); lcd_com (0xC0); lcd_puts ("Pas de réponse."); } __delay_ms (1 000); } }
La communication avec le capteur DHT11 se fait à l' intérieur du tout en boucle où le signal de démarrage est transmis au capteur. Après cela, la fonction find_response est déclenchée. Si Check_bit vaut 1, la communication ultérieure est effectuée, sinon l'écran LCD affichera une boîte de dialogue d'erreur.
En fonction des données 40 bits, le read_dht11 est appelé 5 fois (5 fois x 8 bits) et stocké les données selon le format de données fourni dans la fiche technique. L' état de la somme de contrôle est également vérifié et si des erreurs sont trouvées, il sera également notifié sur l'écran LCD. Enfin, les données sont converties et transmises à l'écran LCD 16x2 caractères.
Le code complet pour cette mesure PIC de température et d'humidité peut être téléchargé à partir d'ici. Consultez également la vidéo de démonstration ci-dessous.
J'espère que vous avez compris le projet et aimé construire quelque chose d'utile. Si vous avez des questions, laissez-les dans la section des commentaires ci-dessous ou utilisez nos forums pour d'autres questions techniques.