.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
- **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.
👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!
.. _py_pi5_bell:
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.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_list.png
:width: 800
:align: center
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
============ ======== ======== ===
.. image:: ../python_pi5/img/4.1.15_alarm_bell_schematic.png
:width: 600
:align: center
Experimentelle Verfahren
-----------------------------
**Schritt 1**: Bauen Sie den Schaltkreis.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_circuit.png
**Schritt 2:** Wechseln Sie das Verzeichnis.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Schritt 3:** Ausführen.
.. raw:: html
.. code-block::
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.
.. warning::
Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`
**Code**
.. note::
Sie können den untenstehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Bevor Sie dies tun, sollten Sie jedoch zum Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python-pi5`` wechseln.
.. raw:: html
.. code-block:: python
#!/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**
#. 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.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
#. 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.
.. code-block:: python
# 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
#. 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.
.. code-block:: python
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()
#. Die Melodie wird als eine Sequenz von Noten (Frequenz) und Dauern (Sekunden) definiert.
.. code-block:: python
# 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)
]
#. Spielt eine vordefinierte Melodie ab, wenn der Schalter gesetzt ist. Die Melodie stoppt, wenn der Schalter während des Spielens zurückgesetzt wird.
.. code-block:: python
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
#. Überprüft kontinuierlich den Zustand des Knopfes, um den Schalter zu setzen oder zurückzusetzen.
.. code-block:: python
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
#. Threads für ``buzzerWork`` und ``ledWork`` werden gestartet, wodurch sie gleichzeitig mit der Hauptfunktion laufen können.
.. code-block:: python
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()
#. Stoppt den Summer und schaltet die LEDs aus, wenn das Programm unterbrochen wird, um einen sauberen Ausstieg zu gewährleisten.
.. code-block:: python
except KeyboardInterrupt:
# Stoppen des Summers und Ausschalten der LEDs bei Programmabbruch
BeepPin.stop()
ALedPin.off()
BLedPin.off()