Passiv-Infrarot-Bewegungsmelder (PIR) sind eine günstige und zuverlässige Möglichkeit, Bewegungen zu erkennen. Im Vergleich zur Raspberry Pi Kamera mit Motion-Software sind sie einfacher einzurichten, verbrauchen kaum Strom und funktionieren ohne Bildverarbeitung. Das macht sie ideal für Projekte wie automatische Monitorsteuerung, Benachrichtigungen oder smarte Beleuchtung.

Benötigte Hardware
- Einen Raspberry Pi (beliebiges Modell) mit Zubehör
- PIR-Sensor: PIR-Sensor mit Kabel oder PIR-Sensor-Modul ohne Kabel
- Jumper-Kabel Female/Female (direkt an GPIO) oder Male/Female mit Breadboard
Der PIR-Sensor im Detail
- Der SW1-Jumper bestimmt das Triggering-Verhalten:
- Position 1: Data wird jede Sekunde auf High gesetzt, solange Bewegung erkannt wird
- Position 2: Data bleibt auf High, solange Bewegung erkannt wird (empfohlen – Jumper nach unten setzen)
- Die Time-Stellschraube legt fest, wie lange Data nach erkannter Bewegung auf High bleibt
- Die Sensitive-Stellschraube regelt die Empfindlichkeit der Bewegungserkennung
- Anschlüsse von links nach rechts: GND, DATA, 5V
- Reichweite: bis zu 7 Meter (sensorabhängig), Erfassungswinkel ca. 120 Grad

Die Verkabelung
Der PIR-Sensor wird direkt an die GPIO-Pins des Raspberry Pi angeschlossen:
- VCC → 5V → PIN 2
- Data → 3,3V Datenausgang → PIN 7 (GPIO 4)
- GND → Masse → PIN 6

Python 3 Test-Script mit gpiozero (empfohlen)
Die modernste und einfachste Möglichkeit, den PIR-Sensor mit Python anzusteuern, ist die Bibliothek gpiozero. Sie ist unter Raspberry Pi OS Bookworm standardmäßig vorinstalliert und abstrahiert die GPIO-Zugriffe auf eine sehr übersichtliche Weise.
Erstellt eine neue Python-Datei:
|
1 |
nano /home/pi/bewegungsmelder_gpiozero.py |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/usr/bin/env python3 from gpiozero import MotionSensor from datetime import datetime import time # PIR-Sensor an Board-Pin 7 (GPIO 4) pir = MotionSensor(4) print("Bewegungsmelder Test mit gpiozero (CTRL-C zum Beenden)") print("=======================================================") print(f"{datetime.now()}: Sensor initialisieren ...") # Warten bis Sensor bereit ist pir.wait_for_no_motion() print(f"{datetime.now()}: Fertig! Warte auf Bewegung...") try: while True: pir.wait_for_motion() print(f"{datetime.now()}: Bewegung erkannt!") pir.wait_for_no_motion() print(f"{datetime.now()}: Keine Bewegung mehr.") except KeyboardInterrupt: print("Beendet.") |
Gespeichert wird mit STRG+X, Y und Enter. Ausführen:
|
1 |
python3 /home/pi/bewegungsmelder_gpiozero.py |

Python 3 Script mit RPi.GPIO (Alternative)
Wer lieber direkt mit RPi.GPIO arbeitet oder ein bestehendes Projekt anpassen möchte, kann auch diesen Ansatz verwenden. RPi.GPIO ist unter Bookworm noch verfügbar, gpiozero wird aber als moderner und einfacher empfohlen.
|
1 |
nano /home/pi/bewegungsmelder_rpigio.py |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/usr/bin/env python3 import RPi.GPIO as GPIO import time from datetime import datetime # Board-Modus: Pin-Nummern statt BCM-Nummern GPIO.setmode(GPIO.BOARD) # PIR-Sensor an Pin 7 GPIO_PIR = 7 GPIO.setup(GPIO_PIR, GPIO.IN) Current_State = 0 Previous_State = 0 print("Bewegungsmelder Test mit RPi.GPIO (CTRL-C zum Beenden)") print("=======================================================") try: print(f"{datetime.now()}: Sensor initialisieren ...") # Warten bis Sensor bereit ist while GPIO.input(GPIO_PIR) == 1: Current_State = 0 print(f"{datetime.now()}: Fertig! Warte auf Bewegung...") while True: Current_State = GPIO.input(GPIO_PIR) if Current_State == 1 and Previous_State == 0: print(f"{datetime.now()}: Bewegung erkannt!") Previous_State = 1 elif Current_State == 0 and Previous_State == 1: print(f"{datetime.now()}: Keine Bewegung mehr.") Previous_State = 0 time.sleep(0.01) except KeyboardInterrupt: print("Beendet.") GPIO.cleanup() |
|
1 |
python3 /home/pi/bewegungsmelder_rpigio.py |
Monitor steuern mit vcgencmd und xrandr
Das Hauptanwendungsbeispiel: Der Monitor soll sich automatisch ein- und ausschalten, je nachdem ob jemand im Raum ist. Dafür erweitern wir das gpiozero-Script um die Monitorsteuerung.
Methode 1: vcgencmd (einfach, Pi 4 und Pi 5)
|
1 2 3 4 5 |
# Monitor ausschalten vcgencmd display_power 0 # Monitor einschalten vcgencmd display_power 1 |
Methode 2: xrandr (X11-Desktop, flexibler)
|
1 2 3 4 5 |
# Monitor ausschalten xrandr --output HDMI-1 --off # Monitor einschalten xrandr --output HDMI-1 --auto |
Das vollständige Script für automatische Monitorsteuerung:
|
1 |
nano /home/pi/monitor_pir.py |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/usr/bin/env python3 from gpiozero import MotionSensor from datetime import datetime import subprocess import time pir = MotionSensor(4) def monitor_an(): subprocess.run(["vcgencmd", "display_power", "1"]) print(f"{datetime.now()}: Monitor AN") def monitor_aus(): subprocess.run(["vcgencmd", "display_power", "0"]) print(f"{datetime.now()}: Monitor AUS") print("PIR Monitor-Steuerung gestartet (CTRL-C zum Beenden)") # Warten bis System vollständig gebootet ist time.sleep(10) # Sensor initialisieren pir.wait_for_no_motion() print(f"{datetime.now()}: Sensor bereit.") try: while True: pir.wait_for_motion() monitor_an() pir.wait_for_no_motion() # 30 Sekunden warten bevor Monitor ausgeschaltet wird time.sleep(30) if not pir.motion_detected: monitor_aus() except KeyboardInterrupt: print("Beendet.") |
Autostart via systemd
Damit das Script bei jedem Start automatisch ausgeführt wird, legen wir einen systemd-Service an. Das ist die moderne Alternative zum veralteten rc.local.
|
1 |
sudo nano /etc/systemd/system/pir-monitor.service |
Inhalt der Service-Datei:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description=PIR Bewegungsmelder Monitor-Steuerung After=multi-user.target [Service] Type=simple User=pi ExecStart=/usr/bin/python3 /home/pi/monitor_pir.py Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target |
Service aktivieren und starten:
|
1 2 3 |
sudo systemctl daemon-reload sudo systemctl enable pir-monitor.service sudo systemctl start pir-monitor.service |
Status prüfen:
|
1 |
sudo systemctl status pir-monitor.service |
Logs einsehen:
|
1 |
journalctl -u pir-monitor.service -f |
Mit diesem Setup startet das Script automatisch beim Booten und wird bei Abstürzen automatisch neu gestartet.

