.. 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

   <run></run>

.. code-block:: 

    cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/

**Paso 3**: Compila el código.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread

**Paso 4**: Ejecuta el archivo.

.. raw:: html

   <run></run>

.. 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:`C code is not working?`.


**Explicación del Código**

.. code-block:: c

    #include <pthread.h>

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.

