.. note:: Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés. **Pourquoi rejoindre ?** - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe. - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences. - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus. - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents. - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances. 👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui ! .. _2.2.3_py_pi5: 2.2.3 DHT-11 =============== Introduction --------------- Le capteur de température et d'humidité numérique DHT11 est un capteur composite qui contient une sortie de signal numérique calibrée de température et d'humidité. La technologie de collecte de modules numériques dédiés et la technologie de détection de température et d'humidité sont appliquées pour garantir que le produit possède une haute fiabilité et une excellente stabilité. Les capteurs incluent un capteur résistif d'élément humide et un capteur de température NTC et ils sont connectés à un microcontrôleur 8 bits haute performance. Composants Nécessaires ------------------------ Pour ce projet, nous avons besoin des composants suivants : .. image:: ../img/list_2.2.3_dht-11.png Il est très pratique d'acheter un kit complet, voici le lien : .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nom - ÉLÉMENTS DANS CE KIT - LIEN * - Kit Raphael - 337 - |link_Raphael_kit| Vous pouvez également les acheter séparément via les liens ci-dessous. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCTION DES COMPOSANTS - LIEN D'ACHAT * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_humiture_sensor` - |link_humiture_buy| Schéma Électrique ---------------------- .. image:: ../img/image326.png Procédures Expérimentales ------------------------- **Étape 1 :** Construire le circuit. .. image:: ../img/image207.png **Étape 2 :** Aller dans le dossier du code. .. raw:: html .. code-block:: cd ~/raphael-kit/python_pi5/ **Étape 3 :** Exécuter le fichier exécutable. .. raw:: html .. code-block:: sudo python3 2.2.3_DHT.py Après l'exécution du code, le programme affichera la température et l'humidité détectées par le DHT11 sur l'écran de l'ordinateur. .. warning:: Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc` **Code** .. note:: Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez accéder au chemin du code source comme ``raphael-kit/python_pi5``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet. .. raw:: html .. code-block:: python from gpiozero import OutputDevice, InputDevice import time class DHT11(): MAX_DELAY_COUINT = 100 BIT_1_DELAY_COUNT = 10 BITS_LEN = 40 def __init__(self, pin, pull_up=False): self._pin = pin self._pull_up = pull_up def read_data(self): bit_count = 0 delay_count = 0 bits = "" # -------------- send start -------------- gpio = OutputDevice(self._pin) gpio.off() time.sleep(0.02) gpio.close() gpio = InputDevice(self._pin, pull_up=self._pull_up) # -------------- wait response -------------- while gpio.value == 1: pass # -------------- read data -------------- while bit_count < self.BITS_LEN: while gpio.value == 0: pass # st = time.time() while gpio.value == 1: delay_count += 1 # break if delay_count > self.MAX_DELAY_COUINT: break if delay_count > self.BIT_1_DELAY_COUNT: bits += "1" else: bits += "0" delay_count = 0 bit_count += 1 # -------------- verify -------------- humidity_integer = int(bits[0:8], 2) humidity_decimal = int(bits[8:16], 2) temperature_integer = int(bits[16:24], 2) temperature_decimal = int(bits[24:32], 2) check_sum = int(bits[32:40], 2) _sum = humidity_integer + humidity_decimal + temperature_integer + temperature_decimal # print(bits) # print(humidity_integer, humidity_decimal, temperature_integer, temperature_decimal) # print(f'sum:{_sum}, check_sum:{check_sum}') # print() if check_sum != _sum: humidity = 0.0 temperature = 0.0 else: humidity = float(f'{humidity_integer}.{humidity_decimal}') temperature = float(f'{temperature_integer}.{temperature_decimal}') # -------------- return -------------- return humidity, temperature if __name__ == '__main__': dht11 = DHT11(17) while True: humidity, temperature = dht11.read_data() print(f"{time.time():.3f} temperature:{temperature}°C humidity: {humidity}%") time.sleep(2) **Explication du Code** .. code-block:: python def read_data(self): bit_count = 0 delay_count = 0 bits = "" # -------------- send start -------------- gpio = OutputDevice(self._pin) gpio.off() time.sleep(0.02) gpio.close() gpio = InputDevice(self._pin, pull_up=self._pull_up) #... Cette fonction est utilisée pour implémenter les fonctions du DHT11. Elle stocke les données détectées dans le tableau bits[]. Le DHT11 transmet des données de 40 bits à la fois. Les 16 premiers bits sont liés à l'humidité, les 16 bits du milieu sont liés à la température, et les huit derniers bits sont utilisés pour la vérification. Le format des données est le suivant : **8 bits de données entières d'humidité** + **8 bits de données décimales d'humidité** + **8 bits de données entières de température** + **8 bits de données décimales de température** + **8 bits de bit de contrôle**. Lorsque la validité est détectée via le bit de contrôle, la fonction renvoie deux résultats : 1. erreur ; 2. humidité et température. .. code-block:: python _sum = humidity_integer + humidity_decimal + temperature_integer + temperature_decimal if check_sum != _sum: humidity = 0.0 temperature = 0.0 else: humidity = float(f'{humidity_integer}.{humidity_decimal}') temperature = float(f'{temperature_integer}.{temperature_decimal}') Par exemple, si les données reçues sont 00101011 (valeur de 8 bits de l'entier d'humidité) 00000000 (valeur de 8 bits de la décimale d'humidité) 00111100 (valeur de 8 bits de l'entier de température) 00000000 (valeur de 8 bits de la décimale de température) 01100111 (bit de contrôle) **Calcul :** 00101011+00000000+00111100+00000000=01100111. Si le résultat final est égal aux données du bit de contrôle, la transmission des données est anormale : retour False. Si le résultat final est égal aux données du bit de contrôle, les données reçues sont correctes, alors il y aura un retour de ``humidity`` et ``temperature`` et l'affichage "Humidité = 43%, Température = 60℃".