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