Nota
Ciao, benvenuto nella comunità di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirsi a noi?
Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità 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 esclusive.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e concorsi: Partecipa ai concorsi e alle promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!
4.1.12 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 un allarme luminoso.
Componenti Necessari
Per questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
DESCRIZIONE COMPONENTE |
LINK PER L’ACQUISTO |
|---|---|
Schema Circuitale
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
Fase 1: Costruisci il circuito.
Fase 2: Cambia la directory.
cd ~/raphael-kit/python-pi5
Fase 3: Esegui.
sudo python3 4.1.15_AlarmBell_zero.py
Dopo l’avvio del programma, l’interruttore a levetta verrà spostato a destra e il cicalino emetterà suoni di allarme. Allo stesso tempo, i LED rosso e verde lampeggeranno a una certa frequenza.
Avvertimento
Se viene visualizzato l’errore RuntimeError: Cannot determine SOC peripheral base address, fare riferimento a If gpiozero doesn’t work..
Code
Nota
Puoi Modificare/Reimpostare/Copiare/Eseguire/Interrompere il codice qui sotto. Tuttavia, prima devi andare nel percorso del codice sorgente come raphael-kit/python-pi5.
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
# Inizializza TonalBuzzer su GPIO pin 22
BeepPin = TonalBuzzer(22)
# Inizializza i LED su GPIO pin 17 e 27
ALedPin = LED(17)
BLedPin = LED(27)
# Inizializza il pulsante su GPIO pin 18
switchPin = Button(18)
# Flag globale per controllare lo stato del cicalino e dei LED
flag = 0
def ledWork():
"""
Control LED blinking pattern based on the flag state.
When flag is set, alternately blink ALedPin and BLedPin.
"""
while True:
if flag:
# Lampeggio alternato dei LED
ALedPin.on()
time.sleep(0.5)
ALedPin.off()
BLedPin.on()
time.sleep(0.5)
BLedPin.off()
else:
# Spegne entrambi i LED se il flag non è impostato
ALedPin.off()
BLedPin.off()
# Definisce la melodia musicale come un elenco di note e le loro durate
tune = [
('C4', 0.1), ('E4', 0.1), ('G4', 0.1),
(None, 0.1),
('E4', 0.1), ('G4', 0.1), ('C5', 0.1),
(None, 0.1),
('C5', 0.1), ('G4', 0.1), ('E4', 0.1),
(None, 0.1),
('G4', 0.1), ('E4', 0.1), ('C4', 0.1),
(None, 0.1)
]
def buzzerWork():
"""
Play a tune using the buzzer based on the flag state.
The tune is played only when the flag is set.
"""
while True:
for note, duration in tune:
if flag == 0:
break
print(note) # Output della nota corrente nella console
BeepPin.play(note) # Suona la nota corrente
time.sleep(duration) # Pausa per la durata della nota
BeepPin.stop() # Interrompe il cicalino dopo aver suonato la melodia
def main():
"""
Monitor button press to update the flag state.
Sets the flag when the button is pressed.
"""
global flag
while True:
flag = 1 se switchPin.is_pressed else 0
try:
# Inizializza e avvia i thread per il controllo del cicalino e dei LED
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
main()
except KeyboardInterrupt:
# Interrompe il cicalino e spegne i LED all'interruzione del programma
BeepPin.stop()
ALedPin.off()
BLedPin.off()
Spiegazione del Codice
Questo segmento include l’importazione delle librerie essenziali per implementare ritardi e threading. Importa inoltre le classi LED, Button e TonalBuzzer dalla libreria gpiozero, cruciali per il controllo dei dispositivi GPIO su un Raspberry Pi.
#!/usr/bin/env python3 from gpiozero import LED, Button, TonalBuzzer import time import threading
Configura un cicalino sul pin GPIO 22, due LED sui pin GPIO 17 e 27 e inizializza un pulsante sul pin GPIO 18. Viene anche definita una variabile globale «flag» per gestire lo stato del cicalino e dei LED.
# Inizializza TonalBuzzer sul pin GPIO 22 BeepPin = TonalBuzzer(22) # Inizializza i LED sui pin GPIO 17 e 27 ALedPin = LED(17) BLedPin = LED(27) # Inizializza il pulsante sul pin GPIO 18 switchPin = Button(18) # Flag globale per controllare lo stato del cicalino e dei LED flag = 0
Questa funzione controlla il lampeggiamento dei LED in base allo stato del flag. Se il flag è impostato (1), alterna tra l’accensione e lo spegnimento di ciascun LED. Se non è impostato (0), entrambi i LED vengono spenti.
def ledWork(): """ Control LED blinking pattern based on the flag state. When flag is set, alternately blink ALedPin and BLedPin. """ while True: if flag: # Lampeggio alternato dei LED ALedPin.on() time.sleep(0.5) ALedPin.off() BLedPin.on() time.sleep(0.5) BLedPin.off() else: # Spegne entrambi i LED se il flag non è impostato ALedPin.off() BLedPin.off()
La melodia è definita come una sequenza di note (frequenze) e durate (secondi).
# Definisci la melodia musicale come un elenco di note e le loro durate tune = [ ('C4', 0.1), ('E4', 0.1), ('G4', 0.1), (None, 0.1), ('E4', 0.1), ('G4', 0.1), ('C5', 0.1), (None, 0.1), ('C5', 0.1), ('G4', 0.1), ('E4', 0.1), (None, 0.1), ('G4', 0.1), ('E4', 0.1), ('C4', 0.1), (None, 0.1) ]
Riproduce una melodia predefinita quando il flag è impostato. La melodia si interrompe se il flag viene disattivato durante la riproduzione.
def buzzerWork(): """ Play a tune using the buzzer based on the flag state. The tune is played only when the flag is set. """ while True: for note, duration in tune: if flag == 0: break print(note) # Stampa la nota corrente nella console BeepPin.play(note) # Suona la nota corrente time.sleep(duration) # Pausa per la durata della nota BeepPin.stop() # Interrompe il cicalino dopo aver suonato la melodia
Controlla continuamente lo stato del pulsante per impostare o disattivare il flag.
def main(): """ Monitor button press to update the flag state. Sets the flag when the button is pressed. """ global flag while True: flag = 1 se switchPin.is_pressed else 0
I thread per
buzzerWorkeledWorkvengono avviati, consentendo loro di funzionare contemporaneamente alla funzione principale.try: # Inizializza e avvia i thread per il controllo del cicalino e dei LED tBuzz = threading.Thread(target=buzzerWork) tBuzz.start() tLed = threading.Thread(target=ledWork) tLed.start() main()
Interrompe il cicalino e spegne i LED quando il programma viene interrotto, garantendo un’uscita pulita.
except KeyboardInterrupt: # Ferma il cicalino e spegne i LED all'interruzione del programma BeepPin.stop() ALedPin.off() BLedPin.off()