Raspberry Pi Pico: Anwesenheitserkennung für ein Display mit PIR Motion Detector (HC-SR501)

Displays dienen zur Anzeige von Informationen. Dazu muss das Display eingeschaltet sein. Sinnvoll ist das aber nur, wenn sich gerade jemand vor dem Display befindet. Wenn nicht ist das ein unnötiger Stromverbrauch. Deshalb gibt es die Idee, eine Person vor dem Display zu erkennen und das Display zu aktivieren. Wird nach einiger Zeit keine Person vor dem Display erkannt, wird das Display abgeschaltet. Das wäre praktisch eine lokale Anwesenheitserkennung für das Display.

In der folgenden Lösung wollen wir einen PIR Motion Detector vom Typ HC-SR501 für die Anwesenheitserkennung verwenden und ein HD44780-kompatibles LCD mit I2C-Modul steuern.

Wenn das Deine ersten Versuche mit einem PIR Motion Detector und einem HD44780-kompatiblen LCD mit I2C-Modul sind, dann solltest Du Dich zuerst über die Besonderheiten dieser Bauteile informieren. Außerdem empfiehlt es sich zuerst mit den einzelnen Bauteilen Erfahrungen zu sammeln.

Aufbau und Bauteile

Raspberry Pi Pico: Anwesenheitserkennung für ein Display mit PIR Motion Detector (HC-SR501)

Raspberry Pi Pico HC-SR501
Pin 36 3V3_OUT, +3,3V VCC
Pin 38 GND GND
Pin 29 GPIO 22 OUT
Raspberry Pi Pico LCD (I2C)
Pin 40 VBUS, +5,0V VCC
Pin 38 GND GND
Pin 27 GPIO 21 I2C0 SCL SCL
Pin 26 GPIO 20 I2C0 SDA SDA

Programmcode

Dreh- und Angelpunkt der softwareseitigen Ansteuerung des 1602-Displays mit der I2C-Schnittstelle sind zwei Python-Bibliotheken. Eine für den I2C und das andere für das Display selber. Die beiden folgenden Dateien müssen heruntergeladen und auf dem Pico gespeichert werden:

Damit hast Du die softwareseitigen Voraussetzungen zur Ansteuerungen des Displays erfüllt.

Im Programmcode wird der GPIO-Pin für den PIR Motion Detector, der I2C-Bus und das Display initialisiert. Anschließend wird ein Text auf dem Display beispielhaft ausgegeben.
Im weiteren Programmcode werden zwei Funktionen definiert. Eine, um das Display einzuschalten und die andere, um das Display auszuschalten. Wobei hier nicht das Display selber ein- und ausgeschaltet wird, sondern nur die Hintergrundbeleuchtung.
Die Einschaltfunktion wird über einen Interrupt aufgerufen, wenn eine Bewegung durch den PIR-Sensor registriert wird.
Die Ausschaltfunktion wird über eine Timersteuerung aufgerufen. In der Ausschaltfunktion wird das Display aber nur dann tatsächlich ausgeschaltet, wenn der PIR-Sensor in Ruhe ist. Also keine Bewegung erkannt wird.

# Bibliotheken laden
from time import sleep
from machine import I2C, Pin, Timer
from machine_i2c_lcd import I2cLcd

# Initialisierung des PIR-Moduls
pir = Pin(22, Pin.IN, Pin.PULL_DOWN)

# Initialisierung I2C
i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=100000)

# Initialisierung LCD über I2C
lcd = I2cLcd(i2c, 0x27, 2, 16)

# Display-Zeilen ausgeben
lcd.putstr('Hello World')

# Funktion: Display einschalten
def display_on(pin):
    lcd.backlight_on()

# Funktion: Display ausschalten
def display_off(timer):
    pir_value = pir.value()
    print(pir_value)
    if pir_value == 0:
        lcd.backlight_off()

# Initialisierung Interrupt für die Bewegungserkennung
pir.irq(trigger=Pin.IRQ_RISING, handler=display_on)

# Timer für die Display-Abschaltung nach Zeit
tim = Timer(freq=0.05, mode=Timer.PERIODIC, callback=display_off)

Funktionen prüfen

  1. Display-Abschaltung: Beim Starten des Programms sollte das Display angehen und auch anbleiben. Die Frage ist, ob sich das Display nach einiger Zeit abschaltet. Die Abschaltung erfolgt natürlich nur, wenn keine Bewegung vom PIR Motion Sensor erkannt wird. Dazu ist es erforderlich den Sensor in eine Richtung zeigen zu lassen, in der er definitiv keine Bewegung registrieren kann. Nach einiger Zeit sollte das Display ausgehen und auch ausbleiben.
  2. Display bleibt an: Wenn die Display-Abschaltung funktioniert ist zu prüfen, ob das Display auch anbleibt, wenn jemand sich vor dem Display befindet. Dazu drehst Du den PIR Motion Sensor zu Dir hin. Das Display sollte die ganze Zeit anbleiben, auch wenn Du Dich nicht viel und nicht oft bewegst.

Wenn das alles ohne Probleme funktioniert hat, dann hast Du vermutlich nicht lange genug geprüft oder einfach wahnsinnig viel Glück gehabt. Dazu ein paar Beobachtungen, Erklärungen und hilfreiche Lösungsvorschläge.

Beobachtungen und Erklärungen

Die Frequenz des Timers im Programmcode ist vermutlich zu groß. Die gewählte Frequenz ist zum Testen und Experimentieren gedacht. Du willst schließlich wissen, ob das Display zeitnah ausgeht. Wenn das Display länger anbleiben soll, dann muss die Zeit verlängert werden. Das bedeutet, der Wert der Frequenz muss kleiner werden.

Die Anwesenheitserkennung mit einem PIR Motion Detector lebt davon, dass sich jemand bewegt. Wenn sich jemand vor dem Display befindet, der Sensor aber keine Bewegung registriert, weil die Person bewegungslos ist, dann geht das Display trotzdem aus. Bei einer Bewegung geht das Display zwar gleich wieder an, aber die irrtümliche Abschaltung kann trotzdem nervig sein.

Es gibt zwei Möglichkeiten das zu lösen. Man verlängert die Zeit bzw. verkleinert den Parameter „freq“ des Timers, der die Abschaltung auslöst. Alternativ bestünde die Möglichkeit die Dauer der Zustandshaltung der Bewegungserkennung am linken Potentiometer (Kuppel zeigt nach oben) zu verlängern.

Darf es ein bisschen mehr sein?

Genau genommen ist eine Anwesenheitserkennung mit einem PIR-Sensor eher untauglich. Weil eine Anwesenheit nicht zwangsläufig bedeutet, dass eine Bewegung stattfinden muss. Aber ein PIR-Sensor braucht eine Bewegung um eine Anwesenheit feststellen zu können.
Eine Alternative zur Anwesenheitserkennung mit PIR-Sensor ist eine Abstandsmessung. Zum Beispiel mit einem Ultraschallsensor.

Weitere verwandte Themen:

Teilen:

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das "Elektronik-Set Pico Edition" ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Online-Workshop Mehr Informationen Elektronik-Set jetzt bestellen

Programmieren mit dem Raspberry Pi Pico
Online-Workshop

Programmieren mit dem Raspberry Pi Pico

Online-Workshop mit einer Einführung ins Physical Computing mit Leuchtdioden, Taster und Temperatursensor.

  • Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython ohne Vorkenntnisse
  • Optimaler Einstieg, um eigene Ideen zu verwirklichen und Steuerungen zu programmieren
  • Inklusive Elektronik-Set mit einem Raspberry Pi Pico, Zubehör und elektronischen Bauteilen

Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)

Zum PicoTalk Mehr Informationen Am Online-Workshop teilnehmen

Elektronik-Set Pico Edition
Elektronik-Set Pico Edition

Hardware-nahes Programmieren mit dem Raspberry Pi Pico

Das "Elektronik-Set Pico Edition" ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Online-Workshop Mehr Informationen Elektronik-Set jetzt bestellen