.. note::
¡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 [|link_sf_facebook|] y únete hoy mismo!
.. _4.1.15_py_pi5:
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.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_list.png
:width: 800
:align: center
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- ARTÍCULOS EN ESTE KIT
- ENLACE
* - Kit Raphael
- 337
- |link_Raphael_kit|
También puedes comprarlos por separado en los enlaces a continuación.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCCIÓN DEL COMPONENTE
- ENLACE DE COMPRA
* - :ref:`cpn_gpio_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_led`
- |link_led_buy|
* - :ref:`cpn_buzzer`
- |link_passive_buzzer_buy|
* - :ref:`cpn_slide_switch`
- |link_slide_switch_buy|
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_capacitor`
- |link_capacitor_buy|
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
============== ====== ======== ===
.. image:: ../python_pi5/img/4.1.15_alarm_bell_schematic.png
:width: 600
:align: center
Procedimientos Experimentales
-------------------------------------
**Paso 1**: Construye el circuito.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_circuit.png
**Paso 2:** Cambia de directorio.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Paso 3:** Ejecuta.
.. raw:: html
.. code-block::
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.
.. warning::
Si recibe el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulte :ref:`faq_soc`
**Código**
.. note::
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``.
.. raw:: html
.. code-block:: python
#!/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**
#. 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.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
#. 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.
.. code-block:: python
# 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
#. 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.
.. code-block:: python
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()
#. La melodía se define como una secuencia de notas (frecuencia) y duraciones (segundos).
.. code-block:: python
# 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)
]
#. Reproduce una melodía predefinida cuando la bandera está activada. La melodía se detiene si la bandera se desactiva durante su reproducción.
.. code-block:: python
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
#. Verifica continuamente el estado del botón para activar o desactivar la bandera.
.. code-block:: python
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
#. Se inician los hilos para ``buzzerWork`` y ``ledWork``, permitiendo que se ejecuten simultáneamente con la función principal.
.. code-block:: python
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()
#. Detiene el zumbador y apaga los LEDs cuando se interrumpe el programa, asegurando una salida limpia.
.. code-block:: python
except KeyboardInterrupt:
# Detiene el zumbador y apaga los LEDs al interrumpir el programa
BeepPin.stop()
ALedPin.off()
BLedPin.off()