Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!

3.1.9 Campanello d’allarme

Introduzione

In questo progetto, realizzeremo un dispositivo di allarme manuale. Puoi sostituire l’interruttore a levetta con un termistore o un sensore fotosensibile per creare un allarme di temperatura o di luce.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_Alarm_Bell.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

LED

ACQUISTA

Cicalino

ACQUISTA

Interruttore a Scorrimento

ACQUISTA

Transistor

ACQUISTA

Condensatore

ACQUISTA

Schema elettrico

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

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image266.png

Passo 2: Vai alla cartella del codice.

cd ~/raphael-kit/c/3.1.9/

Passo 3: Compila.

gcc 3.1.9_AlarmBell.c -lwiringPi -lpthread

Passo 4: Esegui.

sudo ./a.out

Dopo l’avvio del programma, sposta l’interruttore a levetta verso destra e il cicalino emetterà suoni di allarme. Allo stesso tempo, i LED rosso e verde lampeggeranno a una certa frequenza.

Nota

Se il programma non funziona dopo l’esecuzione o compare il messaggio di errore: «wiringPi.h: No such file or directory», consulta Installazione e verifica di WiringPi.

Spiegazione del codice

#include <pthread.h>

In questo codice, utilizzerai una nuova libreria, pthread.h, che è un insieme di librerie di thread comuni e può realizzare il multithreading. Aggiungiamo il parametro -lpthread al momento della compilazione per consentire il funzionamento indipendente del LED e del cicalino.

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 funzione ledWork() aiuta a impostare lo stato di funzionamento di questi 2 LED: mantiene il LED verde acceso per 0,5 secondi, quindi lo spegne; allo stesso modo, mantiene il LED rosso acceso per 0,5 secondi, quindi lo spegne.

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 funzione buzzWork() viene utilizzata per impostare lo stato di funzionamento del cicalino. Qui impostiamo la frequenza tra 130 e 800, per accumulare o decrescere a intervalli di 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);
}

Nella funzione on():

  1. Definisci il flag flag=1, che indica la terminazione del thread di controllo.

  2. Crea un pin per il tono controllato dal software BeepPin.

  3. Crea due thread separati in modo che il LED e il cicalino possano funzionare contemporaneamente.

  • pthread_t tLed: Dichiara un thread tLed.

  • pthread_create(&tLed,NULL,ledWork,NULL): Crea il thread e il suo prototipo è il seguente:

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t*restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

Se ha successo, restituisce 0; altrimenti restituisce il numero di errore -1.

  • Il primo parametro è un puntatore all’identificatore del thread.

  • Il secondo parametro serve per impostare l’attributo del thread.

  • Il terzo parametro è l’indirizzo di partenza della funzione di esecuzione del thread.

  • L’ultimo parametro è quello che esegue la funzione.

void off(){
    flag = 0;
    softToneStop(BeepPin);
    digitalWrite(ALedPin,LOW);
    digitalWrite(BLedPin,LOW);
}

La funzione off() definisce flag=0 per uscire dai thread ledWork e buzzWork e poi spegnere il cicalino e i LED.

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 l’intero processo del programma: innanzitutto legge il valore dell’interruttore a levetta; se l’interruttore viene spostato verso destra (lettura 1), viene chiamata la funzione on(), il cicalino viene attivato per emettere suoni e i LED rosso e verde lampeggiano. In caso contrario, il cicalino e i LED non funzionano.

Immagine del fenomeno

../_images/image267.jpeg