Nota

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 [Aquí] 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

../_images/list_Alarm_Bell1.png

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

../_images/Schematic_three_one101.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

Alarm Bell_bb

Paso 2: Cambia de directorio.

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

Paso 3: Compila el código.

gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread

Paso 4: Ejecuta el archivo.

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.

Nota

Si no funciona después de ejecutar el código o aparece el mensaje de error: "wiringPi.h: No such file or directory", consulta ¿El código en C no funciona?.

Explicación del Código

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

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.

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.

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

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.