.. 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!
.. _4.1.5_py:
4.1.5 Intelligente visuelle Türklingel
==========================================
Einführung
-----------------
In diesem Projekt erstellen wir eine DIY intelligente visuelle Türklingel.
Benötigte Komponenten
------------------------------
Für dieses Projekt benötigen wir die folgenden Komponenten.
.. image:: ../img/3.1.19components.png
:width: 800
:align: center
Es ist definitiv praktisch, ein ganzes Kit zu kaufen. Hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ARTIKEL IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können diese auch separat über die untenstehenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUF-LINK
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_button`
- |link_button_buy|
* - :ref:`cpn_audio_speaker`
- \-
* - :ref:`cpn_camera_module`
- |link_camera_buy|
Schaltplan
-----------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO27 Pin 13 2 27
============ ======== ======== ===
.. image:: ../img/3.1.19_schematic.png
:width: 500
:align: center
Experimentelle Verfahren
----------------------------
**Schritt 1:** Bauen Sie den Schaltkreis.
.. image:: ../img/3.1.19fritzing.png
:width: 800
:align: center
Vor diesem Projekt sollten Sie sicherstellen, dass Sie :ref:`3.1.3_py` & :ref:`3.1.2_py` abgeschlossen haben.
**Schritt 2:** Navigieren Sie zum Ordner des Codes.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python/
**Schritt 3:** Starten Sie den Code.
.. raw:: html
.. code-block::
python3 4.1.5_DoorBell.py
Nach dem Ausführen des Codes:
- Das Programm wartet darauf, dass der Türklingel-Taster gedrückt wird.
- Beim Drücken wird ein Klingelton abgespielt und ein 5-Sekunden-Video aufgezeichnet.
- Das Video wird als ``visitor.mp4`` im Home-Verzeichnis des Benutzers gespeichert.
- Anschließend kehrt das System in den Bereitschaftsmodus zurück und wartet auf den nächsten Tastendruck.
- Mit ``Ctrl+C`` kann das Programm beendet werden; dabei werden alle Ressourcen ordnungsgemäß freigegeben.
**Code**
.. note::
Sie können den untenstehenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen**. Aber zuvor sollten Sie zum Quellcode-Pfad wie ``raphael-kit/python`` navigieren. Nach der Änderung des Codes können Sie ihn direkt ausführen, um das Ergebnis zu sehen.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import time
import os
import RPi.GPIO as GPIO
from pygame import mixer
from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder
from picamera2.outputs import FfmpegOutput
# --------------------------------------------------
# USER DIRECTORY
# --------------------------------------------------
user = os.getlogin()
user_home = os.path.expanduser(f"~{user}")
# --------------------------------------------------
# CAMERA SETUP (Picamera2)
# --------------------------------------------------
camera = Picamera2()
# Create a video configuration WITHOUT the deprecated "video=" argument
video_config = camera.create_video_configuration(
main={"size": (1280, 720), "format": "XBGR8888"}
)
camera.configure(video_config)
# Create H264 encoder (10 Mbps is good quality for doorbell)
encoder = H264Encoder(bitrate=10_000_000)
# --------------------------------------------------
# GPIO SETUP
# --------------------------------------------------
BtnPin = 18
status = False
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
mixer.init()
def button_pressed(pin):
"""Button callback"""
global status
status = True
# --------------------------------------------------
# MAIN LOOP
# --------------------------------------------------
def main():
global status
GPIO.add_event_detect(BtnPin, GPIO.FALLING,
callback=button_pressed, bouncetime=250)
print("Doorbell system running... Press the button to record.")
while True:
if status:
print("Visitor detected!")
# Play doorbell sound
mixer.music.load(f"{user_home}/raphael-kit/music/doorbell.wav")
mixer.music.set_volume(0.7)
mixer.music.play()
# Use QTGL preview
camera.start_preview(Preview.QTGL)
# Output file
output_path = f"{user_home}/visitor.mp4"
output = FfmpegOutput(output_path)
# Start recording
camera.start_recording(encoder, output)
print(f"Recording video to {output_path}")
time.sleep(5) # Record for 5 seconds
# Stop everything
mixer.music.stop()
camera.stop_recording()
camera.stop_preview()
print("Recording finished.\n")
status = False
time.sleep(0.05)
# --------------------------------------------------
# CLEAN EXIT
# --------------------------------------------------
def destroy():
print("\nExiting...")
mixer.quit()
GPIO.cleanup()
camera.close()
print("Program exited cleanly.")
if __name__ == "__main__":
setup()
try:
main()
except KeyboardInterrupt:
destroy()
**Code-Erklärung**
#. Ruft das Home-Verzeichnis des aktuellen Benutzers ab, um das aufgezeichnete Video dort zu speichern.
.. code-block:: python
user = os.getlogin()
user_home = os.path.expanduser(f"~{user}")
#. Erstellt eine Picamera2-Instanz und konfiguriert sie für Videoaufnahmen.
.. code-block:: python
camera = Picamera2()
video_config = camera.create_video_configuration(
main={"size": (1280, 720), "format": "XBGR8888"}
)
camera.configure(video_config)
#. Richtet den GPIO-Taster an ``GPIO18`` als Eingang mit Pull-up-Widerstand ein.
.. code-block:: python
GPIO.setmode(GPIO.BCM)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#. Lädt und initialisiert den Audiomixer, der zur Wiedergabe des Klingeltons verwendet wird.
.. code-block:: python
mixer.init()
#. Registriert einen Callback, der ``status`` auf ``True`` setzt, wenn der Taster gedrückt wird.
.. code-block:: python
GPIO.add_event_detect(BtnPin, GPIO.FALLING,
callback=button_pressed, bouncetime=250)
#. Spielt den Klingelton ab, startet das Vorschaufenster und beginnt die Videoaufnahme.
.. code-block:: python
mixer.music.load(f"{user_home}/raphael-kit/music/doorbell.wav")
mixer.music.play()
camera.start_preview(Preview.QTGL)
camera.start_recording(encoder, output)
#. Nimmt ein 5-Sekunden-Video auf und speichert es als ``visitor.mp4``.
.. code-block:: python
time.sleep(5)
camera.stop_recording()
camera.stop_preview()
#. Bereinigt alle Ressourcen, wenn das Programm mit ``Ctrl+C`` beendet wird.
.. code-block:: python
mixer.quit()
GPIO.cleanup()
camera.close()
Phänomen-Bild
------------------------
.. image:: ../img/4.1.5door_bell.JPG
:align: center