.. note::
Ciao, benvenuto nella Community su Facebook per gli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **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 consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti e anteprime esclusive.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni e Giveaway Festivi**: Partecipa a concorsi e promozioni in occasione delle festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
3.1.10 Campanello di Allarme
===============================
Introduzione
--------------
In questo progetto, realizzeremo un dispositivo di allarme manuale.
È possibile sostituire l'interruttore a levetta con un termistore o
un sensore di luce per creare un allarme di temperatura o di luminosità.
Componenti
-------------
.. image:: img/list_Alarm_Bell.png
:align: center
Schema di Collegamento
--------------------------
============ ======== ======== ===
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
Procedure Sperimentali
-------------------------
**Passo 1**: Costruisci il circuito.
.. image:: img/image266.png
:width: 800
**Passo 2**: Cambia directory.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/
**Passo 3**: Compila.
.. raw:: html
.. code-block::
gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread
**Passo 4**: Esegui.
.. raw:: html
.. code-block::
sudo ./a.out
Dopo l'avvio del programma, l'interruttore a levetta verrà spostato
a destra e il cicalino emetterà un suono di allarme. Allo stesso tempo,
i LED rosso e verde lampeggeranno a una determinata frequenza.
.. note::
Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Spiegazione del Codice**
.. code-block:: c
#include
In questo codice, utilizzerai una nuova libreria, `pthread.h`, che contiene
una serie di librerie per la gestione dei thread e consente la multithreading.
Aggiungiamo il parametro **-lpthread** in fase di compilazione per consentire
il funzionamento indipendente del LED e del cicalino.
.. 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 funzione ``ledWork()`` serve a definire lo stato di funzionamento dei due
LED: accende il LED verde per 0,5s e poi lo spegne; analogamente, accende il
LED rosso per 0,5s e poi lo spegne.
.. 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 funzione ``buzzWork()`` serve a impostare lo stato di funzionamento del
cicalino. Impostiamo la frequenza tra 130 e 800, con un incremento o una
riduzione a intervalli di 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);
}
Nella funzione ``on()``:
1) Imposta il valore del segnale di controllo a \"flag=1\".
2) Crea un pin a tono controllato tramite software **BeepPin**.
3) Crea due thread separati in modo che LED e cicalino possano funzionare contemporaneamente.
**pthread_t tLed:** Dichiarazione di un thread **tLed**.
**pthread_create(&tLed,NULL,ledWork,NULL):** Crea il thread, con prototipo:
.. code-block:: c
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr, void*(*start_rtn)(void*),void *restrict arg);
**Valore di Ritorno**
Se ha successo, restituisce \"**0**\"; altrimenti, restituisce \"**-1**\".
**Parametri**
| Il primo parametro è un puntatore all'identificatore del thread.
| Il secondo parametro serve per impostare l'attributo del thread.
| Il terzo parametro è l'indirizzo iniziale della funzione di esecuzione del thread.
| L'ultimo parametro è quello che esegue la funzione.
.. code-block:: c
void off(){
flag = 0;
softToneStop(BeepPin);
digitalWrite(ALedPin,LOW);
digitalWrite(BLedPin,LOW);
}
La funzione ``off()`` imposta \"flag=0\" per terminare i thread **ledWork** e
**BuzzWork** e quindi spegnere il cicalino e i LED.
.. 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 l'intero processo del programma: inizialmente legge il
valore dell'interruttore a levetta; se l'interruttore viene spostato a
destra (lettura 1), viene chiamata la funzione ``on()``, il cicalino emette
un suono e i LED rosso e verde lampeggiano. Altrimenti, il cicalino e i LED
rimangono spenti.