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.

../_images/4.1.15_alarm_bell_list.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

DESCRIZIONE COMPONENTE

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

LED

ACQUISTA

Cicalino

ACQUISTA

Interruttore a Scorrimento

ACQUISTA

Transistor

ACQUISTA

Condensatore

ACQUISTA

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

../_images/4.1.15_alarm_bell_schematic.png

Procedura Sperimentale

Fase 1: Costruisci il circuito.

../_images/4.1.15_alarm_bell_circuit.png

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

  1. 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
    
  2. 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
    
  3. 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()
    
  4. 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)
    ]
    
  5. 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
    
  6. 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
    
  7. I thread per buzzerWork e ledWork vengono 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()
    
  8. 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()