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