Nota
Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme agli altri appassionati.
Perché unirti a noi?
Supporto esperto: Risolvi problemi post-vendita e 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 ai nuovi annunci di prodotti e alle anteprime.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e omaggi: Partecipa a omaggi e promozioni speciali durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!
3.1.9 Campanello di Allarme
Introduzione
In questo progetto, realizzeremo un dispositivo di allarme manuale. Puoi sostituire l’interruttore a slitta con un termistore o un sensore fotosensibile per creare un allarme di temperatura o un allarme luminoso.
Componenti necessari
In questo progetto, avremo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistare i componenti separatamente dai link qui sotto.
INTRODUZIONE COMPONENTI |
LINK DI ACQUISTO |
|---|---|
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 |
Procedura sperimentale
Passo 1: Costruisci il circuito.
Passo 2: Vai nella 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 slitta verso destra e il cicalino emetterà suoni di allarme. Allo stesso tempo, i LED rosso e verde lampeggeranno a una certa frequenza.
Nota
Se non funziona dopo l’esecuzione o viene visualizzato un messaggio di errore: "wiringPi.h: Nessun file o directory", fai riferimento a Installa e Controlla wiringPi.
Spiegazione del codice
#include <pthread.h>
In questo codice, utilizzerai una nuova libreria, pthread.h, che è un insieme di librerie comuni per i thread e può realizzare il multithreading. Aggiungiamo il parametro -lpthread al momento della compilazione per 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() serve per impostare lo stato di funzionamento di questi 2 LED:
mantiene il LED verde acceso per 0,5s e poi lo spegne;
analogamente, mantiene il LED rosso acceso per 0,5s e poi 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, accumulando o diminuendo con un intervallo 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():
Definisci il segno
flag=1, che indica la fine del controllo del thread.Crea un pin di tono controllato da software
BeepPin.Crea due thread separati in modo che il LED e il cicalino possano funzionare contemporaneamente.
pthread_t tLed: Dichiarare un threadtLed.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 è utilizzato per impostare l’attributo del thread.
Il terzo è l’indirizzo iniziale della funzione di esecuzione del thread.
L’ultimo è 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 quindi 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 slitta; se l’interruttore a slitta viene spostato a destra
(la lettura è 1), viene chiamata la funzione on(), il cicalino viene attivato
per emettere suoni e i LED rosso e verde lampeggiano. Altrimenti, il cicalino e i
LED non funzionano.
Foto del fenomeno