.. note:: Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés. **Pourquoi nous rejoindre ?** - **Support d'experts** : Résolvez vos problèmes après-vente et surmontez les défis techniques grâce à l'aide de notre communauté et de notre équipe. - **Apprendre et Partager** : Échangez des astuces et tutoriels pour améliorer vos compétences. - **Aperçus exclusifs** : Profitez d'un accès anticipé aux annonces de nouveaux produits et d'aperçus en avant-première. - **Réductions spéciales** : Bénéficiez de réductions exclusives sur nos nouveaux produits. - **Promotions et concours** : Participez à des concours et profitez de promotions festives. 👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui ! .. _py_pi5_fan: 3.1.4 Ventilateur intelligent ============================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Selon la version de votre kit, identifiez si vous disposez du **ADC0834** ou du **MCP3008** et suivez la section correspondante. Introduction --------------- Dans ce projet, nous utiliserons des moteurs, des boutons et des thermistances pour créer un ventilateur intelligent manuel et automatique dont la vitesse est réglable. Composants requis --------------------- Pour ce projet, nous avons besoin des composants suivants. .. image:: ../python_pi5/img/4.1.10_smart_fan_list.png :width: 800 :align: center .. C'est certainement pratique d'acheter un kit complet. Voici le lien : .. .. list-table:: .. :widths: 20 20 20 .. :header-rows: 1 .. * - Nom .. - COMPOSANTS DANS CE KIT .. - LIEN .. * - Kit Raphael .. - 337 .. - |link_Raphael_kit| .. Vous pouvez également les acheter séparément à partir des liens ci-dessous. .. .. list-table:: .. :widths: 30 20 .. :header-rows: 1 .. * - INTRODUCTION DES COMPOSANTS .. - LIEN D'ACHAT .. * - :ref:`gpio_extension_board` .. - |link_gpio_board_buy| .. * - :ref:`breadboard` .. - |link_breadboard_buy| .. * - :ref:`wires` .. - |link_wires_buy| .. * - :ref:`resistor` .. - |link_resistor_buy| .. * - :ref:`power_module` .. - \- .. * - :ref:`thermistor` .. - |link_thermistor_buy| .. * - :ref:`l293d` .. - \- .. * - :ref:`adc0834` .. - \- .. * - :ref:`button` .. - |link_button_buy| .. * - :ref:`motor` .. - |link_motor_buy| Schéma de câblage --------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 GPIO5 Pin 29 21 5 GPIO6 Pin 31 22 6 GPIO13 Pin 33 23 13 ============ ======== ======== === .. image:: ../python_pi5/img/4.1.10_smart_fan_schematic.png :align: center Procédure expérimentale --------------------------- **Étape 1 :** Construisez le circuit. .. image:: ../python_pi5/img/4.1.10_smart_fan_circuit.png .. note:: Le module d'alimentation peut être utilisé avec une pile 9V et la connexion pour pile 9V fournie dans le kit. Insérez le cavalier du module d'alimentation dans les bandes de bus 5V de la plaque d'expérimentation. .. image:: ../python_pi5/img/4.1.10_smart_fan_battery.jpeg :align: center **Étape 2 :** Accédez au dossier du code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Étape 3 :** Exécutez le programme. .. raw:: html .. code-block:: sudo python3 3.1.4_SmartFan.py Lorsque le code est exécuté, démarrez le ventilateur en appuyant sur le bouton. Chaque appui ajuste la vitesse d'un cran vers le haut ou vers le bas. Il existe **5** niveaux de vitesse : **0~4**. Lorsque le ventilateur est réglé à la 4\ :sup:`ème` vitesse et que vous appuyez à nouveau, le ventilateur s'arrête avec une vitesse de **0**. Dès que la température augmente ou diminue de plus de 2°C, la vitesse augmente ou diminue automatiquement d'un niveau. Code -------- .. note:: Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre dans le répertoire source comme ``davinci-kit-for-raspberry-pi/python-pi5``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet. .. raw:: html .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math # Initialisation des broches GPIO pour le bouton et le contrôle du moteur BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Initialisation du module ADC0834 pour la détection de température ADC0834.setup() # Initialisation des variables pour suivre le niveau de vitesse du moteur et les températures level = 0 currentTemp = 0 markTemp = 0 def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ # Lire la valeur analogique depuis le module ADC0834 analogVal = ADC0834.getResult() # Conversion de la valeur analogique en tension puis en résistance Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Calcul de la température en Celsius temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273,15 + 25))) Cel = temp - 273,15 return Cel def motor_run(level): """ Adjusts the motor speed based on the specified level. Args: level (int): Desired motor speed level. Returns: int: Adjusted motor speed level. """ # Arrêter le moteur si le niveau est 0 if level == 0: motor.stop() return 0 # Limiter le niveau à 4 pour la vitesse maximale if level >= 4: level = 4 # Définir la vitesse du moteur motor.forward(speed=float(level / 4)) return level def changeLevel(): """ Changes the motor speed level when the button is pressed and updates the reference temperature. """ global level, currentTemp, markTemp print("Button pressed") # Passer à travers les niveaux 0-4 level = (level + 1) % 5 # Mettre à jour la température de référence markTemp = currentTemp # Lier l'événement de pression du bouton à la fonction changeLevel BtnPin.when_pressed = changeLevel def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp # Définir la température de référence initiale markTemp = temperature() while True: # Lire en continu la température actuelle currentTemp = temperature() # Ajuster le niveau du moteur en fonction de la différence de température if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Faire tourner le moteur au niveau ajusté level = motor_run(level) # Exécuter la fonction principale et gérer l'interruption par clavier try: main() except KeyboardInterrupt: # Arrêter le moteur lorsque le script est interrompu motor.stop() Explication du Code ---------------------- #. Importe les classes pour gérer un moteur et un bouton, ainsi que la fonction `sleep` pour introduire des pauses. Le script importe également la bibliothèque ADC0834 pour la détection de température et la bibliothèque mathématique `math` pour effectuer des calculs. .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math #. Configure le bouton sur la broche GPIO 22 et initialise le moteur avec des broches GPIO spécifiques pour le contrôle. Initialise le module ADC0834 pour la mesure de la température. Définit également des variables pour suivre le niveau de vitesse du moteur et les températures. .. code-block:: python # Initialisation des broches GPIO pour le bouton et le contrôle du moteur BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Initialisation du module ADC0834 pour la détection de température ADC0834.setup() # Initialisation des variables pour suivre le niveau de vitesse du moteur et les températures level = 0 currentTemp = 0 markTemp = 0 #. Définit une fonction pour lire et calculer la température à partir du capteur, en convertissant la valeur lue en degrés Celsius. .. code-block:: python def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ # Lire la valeur analogique depuis le module ADC0834 analogVal = ADC0834.getResult() # Convertir la valeur analogique en tension, puis en résistance Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Calculer la température en Celsius temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25))) Cel = temp - 273.15 return Cel #. Introduit une fonction pour ajuster la vitesse du moteur en fonction du niveau spécifié. .. code-block:: python def motor_run(level): """ Adjusts the motor speed based on the specified level. Args: level (int): Desired motor speed level. Returns: int: Adjusted motor speed level. """ # Arrête le moteur si le niveau est 0 if level == 0: motor.stop() return 0 # Limite le niveau à 4 pour la vitesse maximale if level >= 4: level = 4 # Définit la vitesse du moteur motor.forward(speed=float(level / 4)) return level #. Implémente une fonction pour changer le niveau de vitesse du moteur manuellement à l'aide d'un bouton, et lie cette fonction à l'événement de pression du bouton. .. code-block:: python def changeLevel(): """ Changes the motor speed level when the button is pressed and updates the reference temperature. """ global level, currentTemp, markTemp print("Button pressed") # Parcourt les niveaux 0-4 level = (level + 1) % 5 # Met à jour la température de référence markTemp = currentTemp # Lie l'événement de pression du bouton à la fonction changeLevel BtnPin.when_pressed = changeLevel #. La fonction principale, conçue pour ajuster continuellement la vitesse du moteur en réponse aux variations de température, est implémentée ici. .. code-block:: python def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp # Définit la température de référence initiale markTemp = temperature() while True: # Lit en continu la température actuelle currentTemp = temperature() # Ajuste le niveau du moteur en fonction de la différence de température if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Fait tourner le moteur au niveau ajusté level = motor_run(level) #. Exécute la fonction principale et garantit que le moteur s'arrête si le script est interrompu. .. code-block:: python # Exécute la fonction principale et gère l'interruption par clavier try: main() except KeyboardInterrupt: # Arrête le moteur lorsque le script est interrompu motor.stop()