3.1.10 Alarmglocke

Einführung

In diesem Projekt werden wir ein manuelles Alarmsystem erstellen. Sie können den Kippschalter durch einen Thermistor oder einen lichtempfindlichen Sensor ersetzen, um einen Temperaturalarm oder einen Lichtalarm zu realisieren.

Benötigte Komponenten

Für dieses Projekt benötigen wir folgende Komponenten.

../_images/4.1.15_alarm_bell_list.png

Schaltplan

T-Board Name

physisch

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

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis.

../_images/4.1.15_alarm_bell_circuit.png

Schritt 2: Wechseln Sie das Verzeichnis.

cd ~/raphael-kit/python-pi5

Schritt 3: Ausführen.

sudo python3 3.1.10_AlarmBell_zero.py

Nach dem Start des Programms wird der Kippschalter nach rechts umgelegt, und der Summer gibt Alarmtöne aus. Gleichzeitig blinken die rote und grüne LED in einem bestimmten Rhythmus.

Code

Bemerkung

Sie können den untenstehenden Code modifizieren/zurücksetzen/kopieren/ausführen/stoppen. Bevor Sie dies tun, sollten Sie jedoch zum Quellcodepfad wie raphael-kit/python-pi5 wechseln.

#!/usr/bin/env python3

from gpiozero import LED, Button, TonalBuzzer
import time
import threading

# Initialisierung des TonalBuzzers an GPIO-Pin 22
BeepPin = TonalBuzzer(22)

# Initialisierung der LEDs an GPIO-Pins 17 und 27
ALedPin = LED(17)
BLedPin = LED(27)

# Initialisierung des Schalters an GPIO-Pin 18
switchPin = Button(18)

# Globaler Schalter zur Steuerung des Zustands des Buzzers und der LEDs
flag = 0

def ledWork():
    """
    Steuert das Blinkmuster der LEDs basierend auf dem Zustand des Schalters.
    Wenn der Schalter gesetzt ist, blinken die LEDs abwechselnd.
    """
    while True:
        if flag:
            # Alternierendes Blinken der LEDs
            ALedPin.on()
            time.sleep(0.5)
            ALedPin.off()
            BLedPin.on()
            time.sleep(0.5)
            BLedPin.off()
        else:
            # Beide LEDs ausschalten, wenn der Schalter nicht gesetzt ist
            ALedPin.off()
            BLedPin.off()

# Definition der Melodie als Liste von Noten und deren Dauer
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():
    """
    Spielt eine Melodie mit dem Summer, basierend auf dem Zustand des Schalters.
    Die Melodie wird nur gespielt, wenn der Schalter gesetzt ist.
    """
    while True:
        for note, duration in tune:
            if flag == 0:
                break
            print(note)  # Aktuelle Note in der Konsole ausgeben
            BeepPin.play(note)  # Aktuelle Note abspielen
            time.sleep(duration)  # Für die Dauer der Note pausieren
        BeepPin.stop()  # Summer nach dem Spielen der Melodie stoppen

def main():
    """
    Überwacht das Drücken des Schalters, um den Zustand des Schalters zu aktualisieren.
    Setzt den Schalter, wenn der Knopf gedrückt wird.
    """
    global flag
    while True:
        flag = 1 if switchPin.is_pressed else 0

try:
    # Initialisierung und Start der Threads für Summer- und LED-Steuerung
    tBuzz = threading.Thread(target=buzzerWork)
    tBuzz.start()
    tLed = threading.Thread(target=ledWork)
    tLed.start()
    main()

except KeyboardInterrupt:
    # Stoppen des Summers und Ausschalten der LEDs bei Programmabbruch
    BeepPin.stop()
    ALedPin.off()
    BLedPin.off()

Code-Erklärung

  1. Dieser Abschnitt beinhaltet den Import wesentlicher Bibliotheken zur Implementierung von Verzögerungen und Threading. Es werden auch die Klassen LED, Button und TonalBuzzer aus der gpiozero-Bibliothek importiert, die für die Steuerung von GPIO-Geräten auf einem Raspberry Pi entscheidend sind.

    #!/usr/bin/env python3
    
    from gpiozero import LED, Button, TonalBuzzer
    import time
    import threading
    
  2. Stellt einen Summer an GPIO-Pin 22, zwei LEDs an GPIO-Pins 17 und 27 ein und initialisiert einen Knopf an GPIO-Pin 18. Ein globaler Schalter wird ebenfalls definiert, um den Zustand des Buzzers und der LEDs zu verwalten.

    # Initialisierung des TonalBuzzers an GPIO-Pin 22
    BeepPin = TonalBuzzer(22)
    
    # Initialisierung der LEDs an GPIO-Pins 17 und 27
    ALedPin = LED(17)
    BLedPin = LED(27)
    
    # Initialisierung des Schalters an GPIO-Pin 18
    switchPin = Button(18)
    
    # Globaler Schalter zur Steuerung des Zustands des Buzzers und der LEDs
    flag = 0
    
  3. Diese Funktion steuert das Blinken der LEDs basierend auf dem Zustand des Schalters. Wenn der Schalter gesetzt ist (1), wechselt sie abwechselnd zwischen dem Ein- und Ausschalten jeder LED. Wenn nicht gesetzt (0), werden beide LEDs ausgeschaltet.

    def ledWork():
        """
        Steuert das Blinkmuster der LEDs basierend auf dem Zustand des Schalters.
        Wenn der Schalter gesetzt ist, blinken die LEDs abwechselnd.
        """
        while True:
            if flag:
                # Alternierendes Blinken der LEDs
                ALedPin.on()
                time.sleep(0.5)
                ALedPin.off()
                BLedPin.on()
                time.sleep(0.5)
                BLedPin.off()
            else:
                # Beide LEDs ausschalten, wenn der Schalter nicht gesetzt ist
                ALedPin.off()
                BLedPin.off()
    
  4. Die Melodie wird als eine Sequenz von Noten (Frequenz) und Dauern (Sekunden) definiert.

    # Definition der Melodie als Liste von Noten und deren Dauer
    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. Spielt eine vordefinierte Melodie ab, wenn der Schalter gesetzt ist. Die Melodie stoppt, wenn der Schalter während des Spielens zurückgesetzt wird.

    def buzzerWork():
        """
        Spielt eine Melodie mit dem Summer, basierend auf dem Zustand des Schalters.
        Die Melodie wird nur gespielt, wenn der Schalter gesetzt ist.
        """
        while True:
            for note, duration in tune:
                if flag == 0:
                    break
                print(note)  # Aktuelle Note in der Konsole ausgeben
                BeepPin.play(note)  # Aktuelle Note abspielen
                time.sleep(duration)  # Für die Dauer der Note pausieren
            BeepPin.stop()  # Summer nach dem Spielen der Melodie stoppen
    
  6. Überprüft kontinuierlich den Zustand des Knopfes, um den Schalter zu setzen oder zurückzusetzen.

    def main():
        """
        Überwacht das Drücken des Schalters, um den Zustand des Schalters zu aktualisieren.
        Setzt den Schalter, wenn der Knopf gedrückt wird.
        """
        global flag
        while True:
            flag = 1 if switchPin.is_pressed else 0
    
  7. Threads für buzzerWork und ledWork werden gestartet, wodurch sie gleichzeitig mit der Hauptfunktion laufen können.

    try:
        # Initialisierung und Start der Threads für Summer- und LED-Steuerung
        tBuzz = threading.Thread(target=buzzerWork)
        tBuzz.start()
        tLed = threading.Thread(target=ledWork)
        tLed.start()
        main()
    
  8. Stoppt den Summer und schaltet die LEDs aus, wenn das Programm unterbrochen wird, um einen sauberen Ausstieg zu gewährleisten.

    except KeyboardInterrupt:
        # Stoppen des Summers und Ausschalten der LEDs bei Programmabbruch
        BeepPin.stop()
        ALedPin.off()
        BLedPin.off()