.. note::
Ciao, benvenuto nella community di SunFounder per gli appassionati di Raspberry Pi, Arduino ed ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto Esperto**: Risolvi i problemi post-vendita e affronta le sfide tecniche con l'aiuto della nostra community e del nostro team.
- **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni l'accesso anticipato agli annunci di nuovi prodotti e alle anteprime esclusive.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri ultimi prodotti.
- **Promozioni e Giveaway Festivi**: Partecipa ai giveaway e alle promozioni festive.
👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!
.. _4.1.10_py_pi5:
4.1.7 Ventilatore Intelligente
================================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
A seconda della versione del tuo kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente.
Introduzione
---------------------
In questo progetto, utilizzeremo motori, pulsanti e termistori per
realizzare un ventilatore intelligente manuale + automatico, con
velocità del vento regolabile.
Componenti Necessari
------------------------------
In questo progetto, ci servono i seguenti componenti.
.. image:: ../python_pi5/img/4.1.10_smart_fan_list.png
:width: 800
:align: center
È sicuramente 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 acquistare i componenti separatamente dai link qui sotto.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE AI COMPONENTI
- LINK D'ACQUISTO
* - :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_power_module`
- \-
* - :ref:`cpn_thermistor`
- |link_thermistor_buy|
* - :ref:`cpn_l293d`
- \-
* - :ref:`cpn_adc0834`
- \-
* - :ref:`cpn_button`
- |link_button_buy|
* - :ref:`cpn_motor`
- |link_motor_buy|
Schema Elettrico
------------------------
============ ======== ======== ===
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:** Costruisci il circuito.
.. image:: ../python_pi5/img/4.1.10_smart_fan_circuit.png
.. note::
Il modulo di alimentazione può essere alimentato con una batteria da 9V tramite il connettore incluso nel kit. Inserisci il ponticello del modulo di alimentazione nelle strisce di bus da 5V della breadboard.
.. image:: ../python_pi5/img/4.1.10_smart_fan_battery.jpeg
:align: center
**Passo 2**: Entra nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Passo 3**: Esegui.
.. raw:: html
.. code-block::
sudo python3 4.1.10_SmartFan_zero.py
Durante l'esecuzione del codice, avvia il ventilatore premendo il pulsante.
Ogni volta che lo premi, la velocità aumenta o diminuisce di 1 livello. Ci
sono **5** livelli di velocità : **0~4**. Quando è impostato sul 4\ :sup:`th`
livello e premi il pulsante, il ventilatore si ferma con una velocità di vento
pari a **0**.
Una volta che la temperatura aumenta o diminuisce di più di 2℃, la velocitÃ
si regola automaticamente aumentando o diminuendo di 1 livello.
Codice
--------
.. note::
Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto.
Ma prima devi accedere al percorso del codice sorgente come ``raphael-kit/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 controllo del pulsante e del motore
BtnPin = Button(22)
motor = Motor(forward=5, backward=6, enable=13)
# Inizializza il modulo ADC0834 per il rilevamento della temperatura
ADC0834.setup()
# Inizializza le variabili per tenere traccia del livello di velocità del motore e delle 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
# 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
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
# 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 attuale
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
# Esegue il motore al livello regolato
level = motor_run(level)
# Esegue la funzione principale e gestisce l'interruzione da tastiera
try:
main()
except KeyboardInterrupt:
# Ferma il motore quando lo script viene interrotto
motor.stop()
Spiegazione del Codice
--------------------------
#. Importa le classi per la gestione di un motore e di un pulsante, e la funzione sleep per introdurre 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 pin GPIO specifici per il controllo. Inizializza il modulo ADC0834 per la misurazione della temperatura. Inoltre, inizializza 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)
# Inizializza il modulo ADC0834 per il rilevamento della temperatura
ADC0834.setup()
# Inizializza le variabili per tenere traccia del livello di velocità del motore e delle temperature
level = 0
currentTemp = 0
markTemp = 0
#. Definisce una funzione per leggere e calcolare la temperatura dal sensore, convertendo il valore rilevato 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 associa 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
# Associa 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, deve ancora essere implementata.
.. 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 attuale
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
# Esegue il motore al livello regolato
level = motor_run(level)
#. Esegue la funzione principale e garantisce che il motore si fermi se lo script viene interrotto.
.. code-block:: python
# Esegui la funzione principale e gestisci l'interruzione da tastiera
try:
main()
except KeyboardInterrupt:
# Ferma il motore quando lo script viene interrotto
motor.stop()