.. note::
Hola, ¡bienvenidos a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros apasionados.
**¿Por qué unirte?**
- **Soporte Experto**: Resuelve problemas postventa y desafíos técnicos con 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 y adelantos de nuevos productos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: Participa en sorteos y promociones en días especiales.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.
3.1.10 Alarma de Emergencia
===============================
Introducción
----------------
En este proyecto, crearemos un dispositivo de alarma manual. Puedes reemplazar
el interruptor de palanca con un termistor o un sensor fotosensible para crear
una alarma de temperatura o de luz.
Componentes
--------------
.. image:: img/list_Alarm_Bell.png
:align: center
Diagrama de Circuito
-----------------------
============ ======== ======== ===
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
============ ======== ======== ===
.. image:: img/Schematic_three_one10.png
:align: center
Procedimientos Experimentales
--------------------------------
**Paso 1**: Construye el circuito.
.. image:: img/image266.png
:alt: Alarm Bell_bb
:width: 800
**Paso 2**: Cambia de directorio.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/
**Paso 3**: Compila el código.
.. raw:: html
.. code-block::
gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread
**Paso 4**: Ejecuta el archivo.
.. raw:: html
.. code-block::
sudo ./a.out
Al iniciar el programa, el interruptor de palanca se moverá a la derecha,
y el zumbador emitirá sonidos de alarma. Al mismo tiempo, los LEDs rojo y
verde parpadearán a una frecuencia determinada.
.. note::
Si no funciona después de ejecutar el código o aparece el mensaje de error: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Explicación del Código**
.. code-block:: c
#include
En este código, se usa una nueva biblioteca, pthread.h, que es un
conjunto de librerías para manejo de hilos y permite implementar
multithreading. Se agrega el parámetro **-lpthread** en la compilación
para el trabajo independiente de los LEDs y el zumbador.
.. code-block:: c
void *ledWork(void *arg){
while(1)
{
if(flag==0){
pthread_exit(NULL);
}
digitalWrite(ALedPin,HIGH);
delay(500);
digitalWrite(ALedPin,LOW);
digitalWrite(BLedPin,HIGH);
delay(500);
digitalWrite(BLedPin,LOW);
}
}
La función ledWork() establece el estado de trabajo de los 2 LEDs:
mantiene encendido el LED verde durante 0,5s y luego lo apaga; de
manera similar, enciende el LED rojo durante 0,5s y luego lo apaga.
.. code-block:: c
void *buzzWork(void *arg){
while(1)
{
if(flag==0){
pthread_exit(NULL);
}
if((note>=800)||(note<=130)){
pitch = -pitch;
}
note=note+pitch;
softToneWrite(BeepPin,note);
delay(10);
}
}
La función buzzWork() establece el estado de trabajo del zumbador.
Aquí, la frecuencia se ajusta entre 130 y 800, aumentando o disminuyendo
en intervalos de 20.
.. code-block:: c
void on(){
flag = 1;
if(softToneCreate(BeepPin) == -1){
printf("setup softTone failed !");
return;
}
pthread_t tLed;
pthread_create(&tLed,NULL,ledWork,NULL);
pthread_t tBuzz;
pthread_create(&tBuzz,NULL,buzzWork,NULL);
}
En la función on():
1) Define la marca \"flag=1\", que indica el inicio del hilo de control.
2) Crea un pin de tono controlado por software **BeepPin**.
3) Crea dos hilos separados para que los LEDs y el zumbador funcionen al mismo tiempo.
**pthread_t tLed:** Declara un hilo **tLed**.
**pthread_create(&tLed,NULL,ledWork,NULL):** Crea el hilo con el siguiente prototipo:
int pthread_create(pthread_t \*restrict tidp,const pthread_attr_t
\*restrict_attr,void*(*start_rtn)(void*),void \*restrict arg);
**Valor de Retorno**
Si tiene éxito, retorna **0**; de lo contrario, retorna el **número de error** **-1**.
**Parámetros**
| El primer parámetro es un puntero al identificador del hilo.
| El segundo se usa para establecer el atributo del hilo.
| El tercero es la dirección de inicio de la función que ejecutará el hilo.
| El último es el parámetro que se pasa a la función.
.. code-block:: c
void off(){
flag = 0;
softToneStop(BeepPin);
digitalWrite(ALedPin,LOW);
digitalWrite(BLedPin,LOW);
}
La función off() define \"flag=0\" para salir de los hilos
**ledWork** y **buzzWork**, y luego apaga el zumbador y los LEDs.
.. code-block:: c
int main(){
setup();
int lastState = 0;
while(1){
int currentState = digitalRead(switchPin);
if ((currentState == 1)&&(lastState==0)){
on();
}
else if((currentState == 0)&&(lastState==1)){
off();
}
lastState=currentState;
}
return 0;
}
main() contiene todo el proceso del programa: primero lee el valor del
interruptor de palanca; si el interruptor se mueve hacia la derecha (la
lectura es 1), se llama a la función on(), el zumbador emite sonidos de
alarma y los LEDs rojo y verde parpadean. De lo contrario, el zumbador y
los LEDs permanecen apagados.