Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Únete a otros apasionados y profundiza en el uso de Raspberry Pi, Arduino y ESP32.

¿Por qué unirte?

  • Soporte de expertos: 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.

  • Avances exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y adelantos exclusivos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

3.1.4 Ventilador Inteligente

Introducción

En este proyecto, usaremos motores, botones y termistores para construir un ventilador inteligente manual + automático, con velocidad de viento ajustable.

Componentes necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/4.1.10_smart_fan_list.png

Diagrama esquemático

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

../_images/4.1.10_smart_fan_schematic.png

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/4.1.10_smart_fan_circuit.png

Nota

El módulo de alimentación puede aplicar una batería de 9V con el conector para batería de 9V incluido en el kit. Inserta el puente del módulo de alimentación en la franja de bus de 5V de la protoboard.

../_images/4.1.10_smart_fan_battery.jpeg

Paso 2: Accede a la carpeta del código.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Paso 3: Ejecuta el programa.

sudo python3 3.1.4_SmartFan.py

Al ejecutar el código, enciende el ventilador presionando el botón. Cada vez que lo presionas, la velocidad se ajusta en un nivel hacia arriba o hacia abajo. Existen 5 niveles de velocidad: 0~4. Cuando se ajusta al nivel 4 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 sube o baja un nivel.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes, debes 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

# Inicializa los pines GPIO para el botón y el control del motor
BtnPin = Button(22)
motor = Motor(forward=5, backward=6, enable=13)

# Configura el módulo ADC0834 para la detección de temperatura
ADC0834.setup()

# 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.
    """
    # Lee el valor analógico del módulo ADC0834
    analogVal = ADC0834.getResult()
    # Convierte el valor analógico a voltaje y luego a resistencia
    Vr = 5 * float(analogVal) / 255
    Rt = 10000 * Vr / (5 - Vr)
    # Calcula la 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.
    """
    # Detiene el motor si el nivel es 0
    if level == 0:
        motor.stop()
        return 0
    # Limita el nivel a 4 para la velocidad máxima
    if level >= 4:
        level = 4
    # Ajusta 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")
    # Cicla a través de los niveles 0-4
    level = (level + 1) % 5
    # Actualiza la temperatura de referencia
    markTemp = currentTemp

# Asigna la función changeLevel al evento de presionar el botón
BtnPin.when_pressed = changeLevel

def main():
    """
    Main function to continuously monitor and respond to temperature changes.
    """
    global level, currentTemp, markTemp
    # Establece la temperatura de referencia inicial
    markTemp = temperature()
    while True:
        # Lee continuamente la temperatura actual
        currentTemp = temperature()
        # Ajusta 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
        # Ejecuta el motor en el nivel ajustado
        level = motor_run(level)

# Ejecuta la función principal y maneja la interrupción por teclado
try:
    main()
except KeyboardInterrupt:
    # Detiene el motor cuando el script es interrumpido
    motor.stop()

Explicación del Código

  1. Importa clases para gestionar un motor y un botón, además de la función sleep para introducir pausas. También 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
    
  2. Configura el botón en el pin GPIO 22 y el motor con pines GPIO específicos para su control. Inicializa el módulo ADC0834 para la medición de temperatura y define variables para monitorear el nivel de velocidad del motor y las temperaturas.

    # Inicializa los pines GPIO para el botón y el control del motor
    BtnPin = Button(22)
    motor = Motor(forward=5, backward=6, enable=13)
    
    # Inicializa el módulo ADC0834 para la detección de temperatura
    ADC0834.setup()
    
    # Inicializa variables para rastrear el nivel de velocidad del motor y las temperaturas
    level = 0
    currentTemp = 0
    markTemp = 0
    
  3. Define una función para leer y calcular la temperatura desde el sensor, convirtiendo la lectura a grados Celsius.

    def temperature():
        """
        Reads and calculates the current temperature from the sensor.
        Returns:
            float: The current temperature in Celsius.
        """
        # Lee el valor analógico del módulo ADC0834
        analogVal = ADC0834.getResult()
        # Convierte el valor analógico a voltaje y luego a resistencia
        Vr = 5 * float(analogVal) / 255
        Rt = 10000 * Vr / (5 - Vr)
        # Calcula la temperatura en Celsius
        temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))
        Cel = temp - 273.15
        return Cel
    
  4. Introduce una función para ajustar la velocidad del motor de acuerdo con 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.
        """
        # Detiene el motor si el nivel es 0
        if level == 0:
            motor.stop()
            return 0
        # Limita el nivel a 4 para la velocidad máxima
        if level >= 4:
            level = 4
        # Ajusta la velocidad del motor
        motor.forward(speed=float(level / 4))
        return level
    
  5. Implementa una función para cambiar manualmente el nivel de velocidad del motor usando un botón y asocia esta función al evento de pulsación del 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")
        # Cicla a través de los niveles 0-4
        level = (level + 1) % 5
        # Actualiza la temperatura de referencia
        markTemp = currentTemp
    
    # Asigna la función changeLevel al evento de pulsar el botón
    BtnPin.when_pressed = changeLevel
    
  6. La función principal, diseñada para ajustar continuamente la velocidad del motor en respuesta a las fluctuaciones de temperatura, monitorea constantemente los cambios.

    def main():
        """
        Main function to continuously monitor and respond to temperature changes.
        """
        global level, currentTemp, markTemp
        # Establece la temperatura de referencia inicial
        markTemp = temperature()
        while True:
            # Lee continuamente la temperatura actual
            currentTemp = temperature()
            # Ajusta 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
            # Ejecuta el motor en el nivel ajustado
            level = motor_run(level)
    
  7. Ejecuta la función principal y asegura que el motor se detenga si el script es interrumpido.

    # Ejecuta la función principal y maneja la interrupción por teclado
    try:
        main()
    except KeyboardInterrupt:
        # Detiene el motor cuando el script es interrumpido
        motor.stop()