Nota
¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.
¿Por qué unirte?
Soporte Experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Preestrenos Exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y avances exclusivos.
Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones y Sorteos Festivos: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo!
4.1.7 Ventilador Inteligente
Nota
Dependiendo de la versión de su kit, identifique si tiene ADC0834 o MCP3008 y continúe con la sección correspondiente.
Introducción
En este proyecto, utilizaremos motores, botones y termistores para crear un ventilador inteligente manual y automático cuya velocidad del viento es ajustable.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
- |
|
- |
|
Diagrama Esquemático
Nombre T-Board |
física |
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 |
Procedimientos Experimentales
Paso 1: Construye el circuito.
Nota
El módulo de alimentación puede usar una batería de 9V con el conector de batería de 9V incluido en el kit. Inserta el puente del módulo de alimentación en las tiras de bus de 5V de la placa de pruebas.
Paso 2: Accede a la carpeta del código.
cd ~/raphael-kit/python-pi5
Paso 3: Ejecuta.
sudo python3 4.1.10_SmartFan_zero.py
Cuando el código se ejecuta, inicia el ventilador presionando el botón. Cada vez que presionas, se ajusta una velocidad hacia arriba o hacia abajo. Hay 5 niveles de velocidad: 0~4. Cuando se establece en el nivel 4to y presionas el botón, el ventilador deja de funcionar con una velocidad de viento de 0.
Una vez que la temperatura sube o baja más de 2℃, la velocidad automáticamente aumenta o disminuye en 1 nivel.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python-pi5. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
#!/usr/bin/env python3
from gpiozero import Motor, Button
from time import sleep
import ADC0834
import math
# Inicializar pines GPIO para el botón y control del motor
BtnPin = Button(22)
motor = Motor(forward=5, backward=6, enable=13)
# Inicializar el módulo ADC0834 para la detección de temperatura
ADC0834.setup()
# Inicializar variables para rastrear el nivel de velocidad del motor y las temperaturas
level = 0
currentTemp = 0
markTemp = 0
def temperature():
"""
Reads and calculates the current temperature from the sensor.
Returns:
float: The current temperature in Celsius.
"""
# Leer valor analógico del módulo ADC0834
analogVal = ADC0834.getResult()
# Convertir valor analógico a voltaje y luego a resistencia
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
# Calcular temperatura 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.
"""
# Detener el motor si el nivel es 0
if level == 0:
motor.stop()
return 0
# Limitar el nivel a 4 para velocidad máxima
if level >= 4:
level = 4
# Configurar la velocidad del motor
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")
# Cycle through levels 0-4
level = (level + 1) % 5
# Actualizar la temperatura de referencia
markTemp = currentTemp
# Vincular el evento de presionar el botón a la función changeLevel
BtnPin.when_pressed = changeLevel
def main():
"""
Main function to continuously monitor and respond to temperature changes.
"""
global level, currentTemp, markTemp
# Establecer la temperatura de referencia inicial
markTemp = temperature()
while True:
# Leer continuamente la temperatura actual
currentTemp = temperature()
# Ajustar el nivel del motor según la diferencia de temperatura
if level != 0:
if currentTemp - markTemp <= -2:
level -= 1
markTemp = currentTemp
elif currentTemp - markTemp >= 2:
if level < 4:
level += 1
markTemp = currentTemp
# Ejecutar el motor al nivel ajustado
level = motor_run(level)
# Ejecutar la función principal y manejar KeyboardInterrupt
try:
main()
except KeyboardInterrupt:
# Detener el motor cuando se interrumpe el script
motor.stop()
Explicación del Código
Importa clases para gestionar un motor y un botón, y la función sleep para introducir pausas. Además, importa la biblioteca ADC0834 para la detección de temperatura y la biblioteca math para cálculos matemáticos.
#!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math
Configura el botón en el pin GPIO 22 y configura el motor con pines GPIO específicos para el control. Inicializa el módulo ADC0834 para la medición de temperatura. También, inicializa variables para monitorear el nivel de velocidad del motor y las temperaturas.
# Inicializar pines GPIO para el control del botón y el motor BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Inicializar el módulo ADC0834 para la detección de temperatura ADC0834.setup() # Inicializar variables para rastrear el nivel de velocidad del motor y las temperaturas level = 0 currentTemp = 0 markTemp = 0
Define una función para leer y calcular la temperatura del sensor, convirtiendo la lectura a Celsius.
def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ # Leer valor analógico del módulo ADC0834 analogVal = ADC0834.getResult() # Convertir valor analógico a voltaje y luego a resistencia Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Calcular temperatura en Celsius temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25))) Cel = temp - 273.15 return Cel
Introduce una función para ajustar la velocidad del motor según el nivel especificado.
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. """ # Detener el motor si el nivel es 0 if level == 0: motor.stop() return 0 # Limitar el nivel a 4 para velocidad máxima if level >= 4: level = 4 # Configurar la velocidad del motor motor.forward(speed=float(level / 4)) return level
Implementa una función para cambiar manualmente el nivel de velocidad del motor utilizando un botón, y vincula esta función al evento de presionar el botón.
def changeLevel(): """ Changes the motor speed level when the button is pressed and updates the reference temperature. """ global level, currentTemp, markTemp print("Button pressed") # Ciclar a través de los niveles 0-4 level = (level + 1) % 5 # Actualizar la temperatura de referencia markTemp = currentTemp # Vincular el evento de presionar el botón a la función changeLevel BtnPin.when_pressed = changeLevel
La función principal, diseñada para ajustar continuamente la velocidad del motor en respuesta a las fluctuaciones de temperatura, aún debe ser implementada.
def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp # Establecer la temperatura de referencia inicial markTemp = temperature() while True: # Leer continuamente la temperatura actual currentTemp = temperature() # Ajustar el nivel del motor según la diferencia de temperatura if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Ejecutar el motor al nivel ajustado level = motor_run(level)
Ejecuta la función principal y asegura que el motor se detenga si el script es interrumpido.
# Ejecutar la función principal y manejar KeyboardInterrupt try: main() except KeyboardInterrupt: # Detener el motor cuando se interrumpe el script motor.stop()