.. note::
Ciao e benvenuto nella Community degli appassionati di SunFounder per Raspberry Pi, Arduino e ESP32 su Facebook! Esplora a fondo Raspberry Pi, Arduino e ESP32 con altri appassionati.
**Perché unirsi?**
- **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.
- **Impara & Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni l'accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
- **Sconti Speciali**: Godi di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni Festive e Giveaway**: Partecipa ai giveaway e alle promozioni per le festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
.. _py_pi5_bell:
3.1.10 Campanello di 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, sono necessari i seguenti componenti.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_list.png
:width: 800
:align: center
.. È sicuramente conveniente acquistare un kit completo, ecco il link:
.. .. list-table::
.. :widths: 20 20 20
.. :header-rows: 1
.. * - Nome
.. - ELEMENTI IN QUESTO KIT
.. - LINK
.. * - Kit Raphael
.. - 337
.. - |link_Raphael_kit|
.. Puoi anche acquistarli separatamente dai link qui sotto.
.. .. list-table::
.. :widths: 30 20
.. :header-rows: 1
.. * - INTRODUZIONE COMPONENTE
.. - LINK PER ACQUISTO
.. * - :ref:`gpio_extension_board`
.. - |link_gpio_board_buy|
.. * - :ref:`breadboard`
.. - |link_breadboard_buy|
.. * - :ref:`wires`
.. - |link_wires_buy|
.. * - :ref:`resistor`
.. - |link_resistor_buy|
.. * - :ref:`led`
.. - |link_led_buy|
.. * - :ref:`Buzzer`
.. - |link_passive_buzzer_buy|
.. * - :ref:`slide_switch`
.. - |link_slide_switch_buy|
.. * - :ref:`transistor`
.. - |link_transistor_buy|
.. * - :ref:`capacitor`
.. - |link_capacitor_buy|
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:: ../python_pi5/img/4.1.15_alarm_bell_schematic.png
:width: 600
:align: center
Procedure Sperimentali
-----------------------------
**Passo 1**: Costruisci il circuito.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_circuit.png
**Passo 2:** Cambia directory.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Passo 3:** Esegui il programma.
.. raw:: html
.. code-block::
sudo python3 3.1.10_AlarmBell.py
Dopo l’avvio del programma, l’interruttore a levetta verrà spostato a
destra, e il cicalino emetterà un suono di allarme. Contemporaneamente,
i LED rosso e verde lampeggeranno a una certa frequenza.
.. warning::
Se compare il messaggio di errore ``RuntimeError: Cannot determine SOC peripheral base address``, fai riferimento a :ref:`faq_soc`
**Codice**
.. note::
Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Tuttavia, prima di eseguire queste azioni, devi accedere al percorso sorgente del codice, ad esempio ``davinci-kit-for-raspberry-pi/python-pi5``.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
# Inizializzazione del TonalBuzzer sul pin GPIO 22
BeepPin = TonalBuzzer(22)
# Inizializzazione dei LED sui pin GPIO 17 e 27
ALedPin = LED(17)
BLedPin = LED(27)
# Inizializzazione del pulsante sul pin GPIO 18
switchPin = Button(18)
# Flag globale per controllare lo stato del buzzer 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 è attivo
ALedPin.off()
BLedPin.off()
# Definisce una melodia come una lista di note e delle rispettive 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) # Visualizza la nota corrente nella console
BeepPin.play(note) # Riproduce la nota corrente
time.sleep(duration) # Pausa per la durata della nota
BeepPin.stop() # Ferma il buzzer dopo aver riprodotto 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 if switchPin.is_pressed else 0
try:
# Inizializza e avvia i thread per il controllo del buzzer e dei LED
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
main()
except KeyboardInterrupt:
# Ferma il buzzer e spegne i LED in caso di interruzione del programma
BeepPin.stop()
ALedPin.off()
BLedPin.off()
**Spiegazione del Codice**
#. Questa sezione include l'importazione delle librerie essenziali per implementare ritardi e threading. Vengono anche importate le classi LED, Button e TonalBuzzer dalla libreria gpiozero, indispensabili per controllare i dispositivi GPIO su un Raspberry Pi.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
#. Configura un buzzer sul pin GPIO 22, due LED sui pin GPIO 17 e 27 e inizializza un pulsante sul pin GPIO 18. Inoltre, viene definito un flag globale per gestire lo stato del buzzer e dei LED.
.. code-block:: python
# Inizializza il 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 buzzer e dei LED
flag = 0
#. Questa funzione controlla il lampeggio dei LED in base allo stato del flag. Se il flag è impostato (1), i LED si alternano accendendosi e spegnendosi. Se non impostato (0), entrambi i LED sono spenti.
.. code-block:: python
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 (frequenza) e durate (secondi).
.. code-block:: python
# Definisce la melodia come una lista di note e delle rispettive 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.
.. code-block:: python
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) # Mostra la nota corrente nella console
BeepPin.play(note) # Riproduce la nota corrente
time.sleep(duration) # Pausa per la durata della nota
BeepPin.stop() # Ferma il buzzer dopo aver riprodotto la melodia
#. Controlla continuamente lo stato del pulsante per impostare o disattivare il flag.
.. code-block:: python
def main():
"""
Monitor button press to update the flag state.
Sets the flag when the button is pressed.
"""
global flag
while True:
flag = 1 if switchPin.is_pressed else 0
#. I thread per ``buzzerWork`` e ``ledWork`` vengono avviati, permettendo loro di funzionare contemporaneamente alla funzione principale.
.. code-block:: python
try:
# Inizializza e avvia i thread per il controllo del buzzer e dei LED
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
main()
#. Ferma il buzzer e spegne i LED quando il programma viene interrotto, garantendo un'uscita pulita.
.. code-block:: python
except KeyboardInterrupt:
# Ferma il buzzer e spegne i LED all'interruzione del programma
BeepPin.stop()
ALedPin.off()
BLedPin.off()