.. note:: Ciao, benvenuto nella comunità Facebook degli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci l'uso di Raspberry Pi, Arduino e ESP32 con altri appassionati. **Perché unirsi?** - **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti. - **Sconti Esclusivi**: Approfitta di sconti speciali sui nostri prodotti più recenti. - **Promozioni e Omaggi Festivi**: Partecipa a promozioni festive e a giveaway. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _py_pi5_fan: 3.1.4 Ventilatore Intelligente =================================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left A seconda della versione del kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente. Introduzione --------------- In questo progetto, utilizzeremo motori, pulsanti e termistori per creare un ventilatore intelligente manuale + automatico, con velocità regolabile. Componenti Necessari ------------------------ In questo progetto, avremo bisogno dei seguenti componenti. .. image:: ../python_pi5/img/4.1.10_smart_fan_list.png :width: 800 :align: center .. È decisamente conveniente acquistare un kit completo, ecco il link: .. .. list-table:: .. :widths: 20 20 20 .. :header-rows: 1 .. * - Nome .. - ELEMENTI NEL KIT .. - LINK .. * - Kit Raphael .. - 337 .. - |link_Raphael_kit| .. Puoi anche acquistarli separatamente dai link sottostanti. .. .. list-table:: .. :widths: 30 20 .. :header-rows: 1 .. * - INTRODUZIONE AI COMPONENTI .. - LINK PER ACQUISTO .. * - :ref:`scheda_di_espansione_gpio` .. - |link_gpio_board_buy| .. * - :ref:`breadboard` .. - |link_breadboard_buy| .. * - :ref:`cavi` .. - |link_wires_buy| .. * - :ref:`resistore` .. - |link_resistor_buy| .. * - :ref:`modulo_di_alimentazione` .. - \- .. * - :ref:`termistore` .. - |link_thermistor_buy| .. * - :ref:`l293d` .. - \- .. * - :ref:`adc0834` .. - \- .. * - :ref:`pulsante` .. - |link_button_buy| .. * - :ref:`motore` .. - |link_motor_buy| Diagramma Schematico ----------------------- ============ ======== ======== === 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 Procedure Sperimentali -------------------------- **Passo 1:** Assembla il circuito. .. image:: ../python_pi5/img/4.1.10_smart_fan_circuit.png .. note:: Il modulo di alimentazione può utilizzare una batteria da 9V con il connettore a clip incluso nel kit. Inserisci il ponticello del modulo di alimentazione nelle strisce bus a 5V della breadboard. .. image:: ../python_pi5/img/4.1.10_smart_fan_battery.jpeg :align: center **Passo 2**: Accedi alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Passo 3**: Esegui il codice. .. raw:: html .. code-block:: sudo python3 3.1.4_SmartFan.py Quando il codice viene eseguito, avvia il ventilatore premendo il pulsante. Ogni volta che premi, la velocità aumenta o diminuisce di un livello. Ci sono **5** livelli di velocità: **0~4**. Quando è impostato al 4º livello di velocità e premi il pulsante, il ventilatore si ferma con una velocità di **0**. Se la temperatura aumenta o diminuisce di oltre 2°C, la velocità aumenta o diminuisce automaticamente di 1 livello. Codice --------- .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Arrestare** il codice qui sotto. Tuttavia, prima di farlo, devi accedere al percorso sorgente come ``davinci-kit-for-raspberry-pi/python-pi5``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto. .. raw:: html .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math # Inizializza i pin GPIO per il pulsante e il controllo del motore BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Configura il modulo ADC0834 per il sensore di temperatura ADC0834.setup() # Inizializza le variabili per tracciare il livello di velocità del motore e le temperature level = 0 currentTemp = 0 markTemp = 0 def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ # Legge il valore analogico dal modulo ADC0834 analogVal = ADC0834.getResult() # Converte il valore analogico in tensione e poi in resistenza Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Calcola la temperatura in gradi 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. """ # Ferma il motore se il livello è 0 if level == 0: motor.stop() return 0 # Imposta il limite massimo di velocità a 4 if level >= 4: level = 4 # Imposta la velocità del motore 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") # Cicla tra i livelli 0-4 level = (level + 1) % 5 # Aggiorna la temperatura di riferimento markTemp = currentTemp # Associa l'evento di pressione del pulsante alla funzione changeLevel BtnPin.when_pressed = changeLevel def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp # Imposta la temperatura di riferimento iniziale markTemp = temperature() while True: # Legge continuamente la temperatura corrente currentTemp = temperature() # Regola il livello del motore in base alla differenza di temperatura if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Esegui il motore al livello regolato level = motor_run(level) # Esegue la funzione principale e gestisce KeyboardInterrupt try: main() except KeyboardInterrupt: # Ferma il motore quando lo script viene interrotto motor.stop() Spiegazione del Codice ------------------------ #. Importa le classi per gestire un motore e un pulsante, e la funzione sleep per introdurre delle pause. Inoltre, importa la libreria ADC0834 per il rilevamento della temperatura e la libreria math per i calcoli matematici. .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math #. Configura il pulsante sul pin GPIO 22 e imposta il motore con specifici pin GPIO per il controllo. Inizializza il modulo ADC0834 per la misurazione della temperatura. Inizializza inoltre le variabili per monitorare il livello di velocità del motore e le temperature. .. code-block:: python # Inizializza i pin GPIO per il controllo del pulsante e del motore BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Configura il modulo ADC0834 per il rilevamento della temperatura ADC0834.setup() # Inizializza le variabili per tracciare il livello di velocità del motore e le temperature level = 0 currentTemp = 0 markTemp = 0 #. Definisce una funzione per leggere e calcolare la temperatura dal sensore, convertendo il valore letto in gradi Celsius. .. code-block:: python def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ # Legge il valore analogico dal modulo ADC0834 analogVal = ADC0834.getResult() # Converte il valore analogico in tensione e poi in resistenza Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Calcola la temperatura in gradi Celsius temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25))) Cel = temp - 273.15 return Cel #. Introduce una funzione per regolare la velocità del motore in base al livello specificato. .. 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. """ # Ferma il motore se il livello è 0 if level == 0: motor.stop() return 0 # Limita il livello a 4 per la velocità massima if level >= 4: level = 4 # Imposta la velocità del motore motor.forward(speed=float(level / 4)) return level #. Implementa una funzione per cambiare manualmente il livello di velocità del motore utilizzando un pulsante e collega questa funzione all’evento di pressione del pulsante. .. 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") # Cicla attraverso i livelli 0-4 level = (level + 1) % 5 # Aggiorna la temperatura di riferimento markTemp = currentTemp # Collega l’evento di pressione del pulsante alla funzione changeLevel BtnPin.when_pressed = changeLevel #. La funzione principale è progettata per regolare continuamente la velocità del motore in risposta alle variazioni di temperatura. .. code-block:: python def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp # Imposta la temperatura di riferimento iniziale markTemp = temperature() while True: # Legge continuamente la temperatura corrente currentTemp = temperature() # Regola il livello del motore in base alla differenza di temperatura if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Esegui il motore al livello regolato level = motor_run(level) #. Esegue la funzione principale e assicura che il motore si fermi se lo script viene interrotto. .. code-block:: python # Esegue la funzione principale e gestisce KeyboardInterrupt try: main() except KeyboardInterrupt: # Ferma il motore quando lo script viene interrotto motor.stop()