Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook. Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirse?

  • 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.12 Alarma

Introducción

En este proyecto, haremos un dispositivo de alarma manual. Puedes reemplazar el interruptor de palanca con un termistor o un sensor fotosensible para hacer una alarma de temperatura o de luz.

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/4.1.15_alarm_bell_list.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

LED

COMPRAR

Zumbador

COMPRAR

Interruptor Deslizante

COMPRAR

Transistor

COMPRAR

Capacitor

COMPRAR

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

../_images/4.1.15_alarm_bell_schematic.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/4.1.15_alarm_bell_circuit.png

Paso 2: Cambia de directorio.

cd ~/raphael-kit/python-pi5

Paso 3: Ejecuta.

sudo python3 4.1.15_AlarmBell_zero.py

Después de que el programa se inicie, el interruptor de palanca se moverá hacia la derecha y el zumbador emitirá sonidos de alarma. Al mismo tiempo, los LED rojo y verde parpadearán a una cierta frecuencia.

Advertencia

Si recibe el mensaje de error RuntimeError: Cannot determine SOC peripheral base address, consulte Si «gpiozero» no funciona.

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.

#!/usr/bin/env python3

from gpiozero import LED, Button, TonalBuzzer
import time
import threading

# Inicializar TonalBuzzer en el pin GPIO 22
BeepPin = TonalBuzzer(22)

# Inicializar LEDs en los pines GPIO 17 y 27
ALedPin = LED(17)
BLedPin = LED(27)

# Inicializar Botón en el pin GPIO 18
switchPin = Button(18)

# Bandera global para controlar los estados del zumbador y los LEDs
flag = 0

def ledWork():
    """
    Control LED blinking pattern based on the flag state.
    When flag is set, alternately blink ALedPin and BLedPin.
    """
    while True:
        if flag:
            # Parpadeo alternado de los LEDs
            ALedPin.on()
            time.sleep(0.5)
            ALedPin.off()
            BLedPin.on()
            time.sleep(0.5)
            BLedPin.off()
        else:
            # Apaga ambos LEDs si la bandera no está activada
            ALedPin.off()
            BLedPin.off()

# Definir la melodía musical como una lista de notas y sus duraciones
tune = [
    ('C4', 0.1), ('E4', 0.1), ('G4', 0.1),
    (None, 0.1),
    ('E4', 0.1), ('G4', 0.1), ('C5', 0.1),
    (None, 0.1),
    ('C5', 0.1), ('G4', 0.1), ('E4', 0.1),
    (None, 0.1),
    ('G4', 0.1), ('E4', 0.1), ('C4', 0.1),
    (None, 0.1)
]

def buzzerWork():
    """
    Play a tune using the buzzer based on the flag state.
    The tune is played only when the flag is set.
    """
    while True:
        for note, duration in tune:
            if flag == 0:
                break
            print(note)  # Muestra la nota actual en la consola
            BeepPin.play(note)  # Reproduce la nota actual
            time.sleep(duration)  # Pausa por la duración de la nota
        BeepPin.stop()  # Detiene el zumbador después de reproducir la melodía

def main():
    """
    Monitor button press to update the flag state.
    Sets the flag when the button is pressed.
    """
    global flag
    while True:
        flag = 1 if switchPin.is_pressed else 0

try:
    # Inicializa y arranca los hilos para el control del zumbador y los LEDs
    tBuzz = threading.Thread(target=buzzerWork)
    tBuzz.start()
    tLed = threading.Thread(target=ledWork)
    tLed.start()
    main()

except KeyboardInterrupt:
    # Detiene el zumbador y apaga los LEDs al interrumpir el programa
    BeepPin.stop()
    ALedPin.off()
    BLedPin.off()

Explicación del Código

  1. Este segmento incluye la importación de bibliotecas esenciales para implementar retrasos y subprocesos. También importa las clases LED, Button y TonalBuzzer de la biblioteca gpiozero, cruciales para controlar dispositivos GPIO en una Raspberry Pi.

    #!/usr/bin/env python3
    
    from gpiozero import LED, Button, TonalBuzzer
    import time
    import threading
    
  2. Configura un zumbador en el pin GPIO 22, dos LEDs en los pines GPIO 17 y 27, y un botón en el pin GPIO 18. También se define una bandera global para gestionar el estado del zumbador y los LEDs.

    # Inicializar TonalBuzzer en el pin GPIO 22
    BeepPin = TonalBuzzer(22)
    
    # Inicializar LEDs en los pines GPIO 17 y 27
    ALedPin = LED(17)
    BLedPin = LED(27)
    
    # Inicializar Botón en el pin GPIO 18
    switchPin = Button(18)
    
    # Bandera global para controlar los estados del zumbador y los LEDs
    flag = 0
    
  3. Esta función controla el parpadeo de los LEDs según el estado de la bandera. Si la bandera está activada (1), alterna entre encender y apagar cada LED. Si no está activada (0), ambos LEDs se apagan.

    def ledWork():
        """
        Control LED blinking pattern based on the flag state.
        When flag is set, alternately blink ALedPin and BLedPin.
        """
        while True:
            if flag:
                # Parpadeo alternado de los LEDs
                ALedPin.on()
                time.sleep(0.5)
                ALedPin.off()
                BLedPin.on()
                time.sleep(0.5)
                BLedPin.off()
            else:
                # Apaga ambos LEDs si la bandera no está activada
                ALedPin.off()
                BLedPin.off()
    
  4. La melodía se define como una secuencia de notas (frecuencia) y duraciones (segundos).

    # Definir la melodía musical como una lista de notas y sus duraciones
    tune = [
        ('C4', 0.1), ('E4', 0.1), ('G4', 0.1),
        (None, 0.1),
        ('E4', 0.1), ('G4', 0.1), ('C5', 0.1),
        (None, 0.1),
        ('C5', 0.1), ('G4', 0.1), ('E4', 0.1),
        (None, 0.1),
        ('G4', 0.1), ('E4', 0.1), ('C4', 0.1),
        (None, 0.1)
    ]
    
  5. Reproduce una melodía predefinida cuando la bandera está activada. La melodía se detiene si la bandera se desactiva durante su reproducción.

    def buzzerWork():
        """
        Play a tune using the buzzer based on the flag state.
        The tune is played only when the flag is set.
        """
        while True:
            for note, duration in tune:
                if flag == 0:
                    break
                print(note)  # Muestra la nota actual en la consola
                BeepPin.play(note)  # Reproduce la nota actual
                time.sleep(duration)  # Pausa por la duración de la nota
            BeepPin.stop()  # Detiene el zumbador después de reproducir la melodía
    
  6. Verifica continuamente el estado del botón para activar o desactivar la bandera.

    def main():
        """
        Monitor button press to update the flag state.
        Sets the flag when the button is pressed.
        """
        global flag
        while True:
            flag = 1 if switchPin.is_pressed else 0
    
  7. Se inician los hilos para buzzerWork y ledWork, permitiendo que se ejecuten simultáneamente con la función principal.

    try:
        # Inicializa y arranca los hilos para el control del zumbador y los LEDs
        tBuzz = threading.Thread(target=buzzerWork)
        tBuzz.start()
        tLed = threading.Thread(target=ledWork)
        tLed.start()
        main()
    
  8. Detiene el zumbador y apaga los LEDs cuando se interrumpe el programa, asegurando una salida limpia.

    except KeyboardInterrupt:
        # Detiene el zumbador y apaga los LEDs al interrumpir el programa
        BeepPin.stop()
        ALedPin.off()
        BLedPin.off()