51bqqVaHMQL._SL1048_

GPIO

Raspberry Pi Bewegungsmelder PIR anschließen und steuern

Das PIR Bewegungssensor Modul bietet dank seiner Bauweise eine sehr einfache Nutzung, da es die Komponenten schon verbaut hat. Raspberry Pi Bewegungsmelder oder Anwendungen in der Hausautomation und/oder im Außenbetrieb (als klassischer Bewegungsmelder) sind damit leichter denn je umzusetzen. Die Inbetriebnahme zeige ich in diesem Tutorial.



Dieser Arduino/Raspberry Pi Bewegungsmelder reagiert und Bewegungen, wobei die „Stärke“ der Bewegung mittels eines einstellbaren Widerstands (Poti) geregelt werden kann. Man kann den Bewegungssensor also sehr sensibel einstellen, oder aber versuchen „Rauschen“ zu vermeiden. Sobald sich etwas bewegt wird ein Signal gesendet, was vom Raspberry Pi empfangen und darauf reagiert werden kann.

 

Zubehör

 

Aufbau

Der Aufbau ist sehr einfach, da nur ein Pin bei Bewegung aktiviert werden muss. Die Pins am PIR sind beschriftet:

VCC an Pin 2 (5V)
OUT an Pin 16 (GPIO 23)
GND an Pin 6 (Ground)

Raspberry Pi Bewegungsmelder PIR Anschluss

Software zum Steuern des Raspberry Pi Bewegungsmelder

Zum Ausführen des Codes erstellen wir eine neue Datei

sudo nano pir.py

mit folgendem Inhalt:

Hierbei wird über GPIO.add_event_detect eine Funktion festgelegt, die aufgerufen wird, sobald ein Strom fließt. Die genaue Funktionsweise kann hier nachgelesen werden. Andernfalls könnte man auch eine Endlosschleife deklarieren, wobei bei jedem Aufruf der Status des GPIO Pins abgefragt wird.

Nach dem Speichern und beenden (STRG+O, STRG+X) kann die Datei ausgeführt werden:

sudo python pir.py

Möchtest du das Skript beenden, kannst du dies mit STRG+C.

Ich musste erst ein wenig an den Potentiometern drehen und testen bei welcher Einstellung es am besten funktioniert.

Raspberry Pi Bewegungsmelder PIR

 

Es bieten sich nun viele Anwendungen oder Befehle an,  welche gestartet bzw. ausgeführt werden, sobald der Raspberry Pi Bewegungsmelder eine Aktivität erkennt. Beispiele dazu sind Alarmanlagen oder im Verbindung mit dem offiziellen Touchscreen Modul ein automatisches Anschalten des Displays, sobald sich jemand diesem nähert.

Eine Möglichkeit zum starten des Skripts per Autostart habe ich hier gezeigt.



, , , ,


56 Kommentare

  1. fipsi sagt:

    Hi, ich habe alle 5 Sensoren mit verschiedenen Einstellungen durchgetestet, aber alle machen ständig Fehlmeldungen und wenn man Bewegt reagieren sie auch nicht… Irgendwie gibt es mal ein Signal und auch mal nicht, egal ob sich was vor dem Sensor tut oder nicht.
    Weiß jemand woran es liegen könnte?

  2. Samet sagt:

    Hi, ist es möglich an Stelle des printf Befehls andere Scripte, also auch mehrere starten zu lassen?

    Würde damit gerne eine kleine Alarmanlage bauen. Sobald eine Bewegung erkannt wird, soll ich eine Benachrichtigung bekommen und eine Sirene soll angehen um den Einbrecher zu erschrecken.
    Und das ganze wiederum würde ich gerne mit der Funkfernbedienung aus deinem anderen Tutorial scharf stellen. Geht das alles?

    Ein kleines Ja würde mir eigentlich schon reichen 🙂

    Vielen Dank schon mal.

    • Felix sagt:

      Hey,
      ja natürlich ist das möglich – und sogar gewollt 😉
      Ich dachte, dass ich hier mal Spielraum lasse, was man damit anstellt.
      LG Felix

    • Samet sagt:

      Erst einmal vielen Dank für die schnelle Antwort.

      Habe das Rasperry Pi nämlich erst neu geholt und noch nicht mal gestartet, warte noch auf ein gescheites Netzteil weil die von meinem Handy 5,3V Output hat.

      Bin mir noch nicht im klaren wie die verschiedenen Programme laufen. Habe bisher nur mi uControllern gearbeitet und da läuft das ziemlich simpel ab. Bin jetzt kein totaler Anfänger, studiere Elektronik aber mir PI habe ich echt null zu tun gehabt.

      Meine Idee ist ein Funk PIR Bewegungsmelder vor der Haustür. Am Pi ist ein Funk Empfänger und ein Kamera Modul. Sobald einen Bewegung detektiert wird, soll für 10 Minuten eine Aufnahme starten und eine Benachrichtigung an mein Handy(Email oder SMS) gesendet werden. Die Kamera muss ich natürlich auch über den Browser beobachten können (habe dazu schon ein Tutorial gefunden).
      Den Bewegungsmelder den Du hier benutzt werde ich im inneren des Hauses anbringen und die soll mir bei einer Bewegung eine zweite Benachrichtigung schicken, als Bestätigung das der Einbrecher drin ist.
      Und das ganze soll natürlich über eine Funk Fernbedienung scharfgestaltet werden können, wenn ich aus dem Haus gehe.

      Bei uns wurde innerhalb von 3 Jahren zweimal eingebrochen, deswegen will ich so etwas mal versuchen zu realisieren.

      So das war jetzt eine Menge Text 🙂

    • Felix sagt:

      Das schöne am Pi ist, dass man ihn sehr einfach programmieren kann und mit ICs kommunizieren, sowie die GPIOs steuern kann. Was du vor hast, klingt auf jeden Fall machbar. Wenn du außerhalb der Tür den IR Bewegungssender ohne Kabel anbringen willst, würde ich ein Batteriepack und z.B. einen Arduino Nano nehmen, der über Funk an deinen Pi ein Signal schickt, sobald etwas passiert. Wenn du aber Elektronik studierst und dich mit anderen ICs auskennst, wirst du bestimmt eine (noch) stromsparendere Alternative zum Arduino finden.
      LG Felix

  3. Samet sagt:

    Ach ja, es ist übrigens eine Wohnung. Deswegen reichen eigentlich nur zwei Bewegungsmelder. Einer vor der Tür(Funk) und einer im Eingangsbereich. Es soll auch nur der Eingangsbereich gefilmt werden. Aus dem Fenster sollte keiner im vierten Stock einbrechen können.

  4. Rafael sagt:

    Hallo zusammen,

    ich habe eine Frage zu dem Python Script.
    Ich verstehe nicht, warum im folgenden Befehl

    „def mein_callback(channel):“

    Channel in der Klammer steht. Muß da nicht SENSOR_PIN aus dem Befehl davor hin?
    Sprich:
    GPIO.setup(SENSOR_PIN, GPIO.IN)

    def mein_callback(SENSOR_PIN):

    Danke für die Hilfe

    • Felix sagt:

      Hallo Rafael,
      nein in der Definition gibst du eine lokale Variable an. Beim Aufruf von mein_callback(..) kannst du z.B. die Variable SENSOR_PIN übergeben.
      Du solltest dir evtl. die Python Funktionsdefinitionen noch einmal anschauen.
      LG Felix

    • Rafael sagt:

      Hallo Felix,

      danke für deine Antwort.

      Ich werde es mir nochmal anschauen.
      Aber ich habe eine frage zu der Variablen. Du hast ja geschrieben, dass man dort eine lokale Variable angibt.
      Was ich nicht verstehe ist, wo in dem Quellcode oben die Variable „channel“ definiert wird?
      Sie kommt doch vorher nirgends vor.

      Schönen Gruß

      Rafael

    • Felix sagt:

      Hallo Rafael,
      die lokale Variable der Funktion definierst du in der Kammer. Zugewiesen wird sie indem du die Funktion mit einem Wert aufrufst.
      Die Variable kommt nicht vor, weil ich nur ein Beispiel gegeben habe, allerdings kann es oft sinnvoll sein den Channel zu kennen, bspw. wenn die selbe Trigger Funktion für mehrere GPIOs verwendet wird.

  5. Jonny sagt:

    Moin moin,

    funktioniert soweit wunderbar bis auf die sleep time. Völlig egal welchen Wert ich hier verwendet das Script löst alle paar sekunden aus.
    Jemand eine idee?

  6. beeedooo sagt:

    Hi, ich verfolge eine idee:
    Mit dem Bewegungsmelder den mpd/mpc – Dienst ansprechen und ein Webradio starten, würde das gehen? (Quasi ein Gast-Wc-Webradio)
    Und den automatisch wieder ausschalten lassen?
    bin neu auf dem Gebiet und wollte erstmal fragen ob dies relativ einfach zu realisieren wäre :>

    • beee-dooo sagt:

      ok soweit so gut,
      ich habe nun den mpc dienst den ich mit „mpc play“ starten kann,
      den bewegungsmelder der auch die bewegung erkennt.
      aber wenn ich bei dem
      # Hier kann alternativ eine Anwendung/Befehl etc. gestartet werden.
      z.B. mpc play eintrage sagt er invalid syntax…
      weiß jemand abhilfe bzw wie ich den mpc mit der bewegung des PIR zum laufen bekomme?

    • Felix sagt:

      Du hast aber schon eine Python Funktion verwendet, um den Befehl zu starten oder? Beispiel gibt es hier (os.system("mpc play")). Andernfalls wird das natürlich nicht klappen, esseidenn du verwendest Python Befehle/Syntax in deinem Python Skript.

    • beee-dooo sagt:

      hey, danke 😀
      bin noch so ein newb,
      hatte import os vergessen
      dann mit os.system(„mpc play“) läufts !

    • Felix sagt:

      Sehr gut 🙂

    • beee-dooo sagt:

      hey felix,
      wüsstest du auch wie ich z.B. daraus eine schleife baue,
      also was ich meine ist, dass wenn der bewegungsmelder angeht,
      mpc play startet (das hab ich ja jetzt schonmal dank dir hinbekommen)
      aber die idee ist ja fürs bad/wc, dass es irgendwann wieder ausgeht WENN
      keine bewegung mehr nach zb 30 sekunden ist, aber durchgängig sonst anbleibt wenn zwischendurch bewegungen registriert werden.
      if you know what i mean 😀

    • Felix sagt:

      Würde ich z.B. so lösen:
      Initialisiere eine Variable letzte_bew = 0
      Die erste erkannte Bewegung des Sensors ruft eine Funktion auf (nur if letzte_bew==0:), ansonsten setzt du letzte_bew = time.time()
      Diese Funktion hat eine Endlosschleife mit der Bedingung while letzte_bew + X < time.time(): wobei X deine Anzahl an Sekunden ist. Die Schleife macht nichts weiter als eine Sekunde zu warten. Nach Ende der Schleife setzt du letzte_bew = 0 und stoppst dein Skript/Musik.
      PS: Ich gebe dir bewusst nicht den ganzen Code, damit du auch etwas daran tüfeln musst 😉 Ist auch nur ein theoretischer Aufbau, du musst schauen ob es ohne Threading (paralell) läuft.

  7. Robin sagt:

    Ich würde gerne, wenn der Bewegungsmelder eine Bewegung erkennt ein Script ausführen lassen

    Wie kann ich das bewerkstelligen?

  8. Andreas sagt:

    Hallo,

    kann ich diesen Sensor direkt an meinen Rasperry anschliessen oder benötige ich noch wiederstände die ich dazwischen schalten muss? z.B wie hier beschrieben https://dracarysdiy.wordpress.com/smart-mirror-5-video/ ( wobei der Kollege auch einen anderen Sensor berwendet)

    Freue mich auf Nachricht 😉 Sitze hier mit gezücktem Lötkolben…

    Grüße Andreas

  9. Andreas sagt:

    Ah und wie stelle ich fest ob ich 3.3V Eingangsspannung verwende??

    • Felix sagt:

      Soweit ich mich erinnere hat der PIR Sensor einen eingebauten Widerstand, weshalb 5V Eingangsspannung verwendet werden können. Anders sieht dies beim Ultraschallsensor H-SR04 aus, da wird ein Pull-Widerstand benötigt (anderes Tutorial).

  10. Andreas sagt:

    mir fliegt aber nicht mein Rasperry um die Ohren sollte es den genannten Widerstand nicht geben oder?

    • Felix sagt:

      Jeder Aufbau der Tutorials ist von mir getestet. Ich weiß allerdings nicht, was du sonst noch an deinem Pi angeschlossen hast. Wenn du auf Nummer sicher gehen willst kannst du dir ein Multimeter nehmen und die Spannung messen, welche an den GPIOs ankommen würde. Ist sie unter 3.3V (was der Fall sein sollte), ist alles im grünen Bereich.

  11. DEKOCHJE sagt:

    Hallo zusammen,

    auch ich bin Anfänger und habe mich auch relativ erfolgreich an SAMETs Alarmanlagenprojekt versucht. Es gibt dafür ein hervorragendes youtube Tutorial.

    Nun zu meiner Frage: Kann ich mehrere PIR Sensoren am gleichen Eingang auflegen? Alternativ würde ich gerne eine Oder-Funktion im Python Skript integrieren – Sprich zwei Eingänge zur Auslösung.

    Kann mir jemand hierbei helfen?

    Beste Grüße

    • Felix sagt:

      Hallo,
      solange du unterschiedliche GPIOs nimmst sollte nichts dagegen sprechen. Wenn es unbedingt der selbe GPIO sein muss, kannst du einen OR/NOR/NAND Baustein verwenden, je nach Anwendung. Statt ein reines OR reicht es auch alle am selben GPIO anzuschließen. Du solltest jedoch darauf achten, dass nicht zu viel Stromstärke an die GPIOs gelangt.
      LG Felix

    • DEKOCHJE sagt:

      Das ging ja schnell o_O

      Danke!

      Genau über die Überlastung habe ich mir Gedanken gemacht. Würde gerne 3 PIR Sensoren an einen GPIO Eingang schalten. Gefährdet das meine Hardware?

      Wenn du von Bausteinen sprichst, meinst du das im Quellcode des PIR Skripts zu realisieren?

      Mit STEP 7 ist das einfacher 😛

      Beste Grüße

    • Felix sagt:

      Ich bin mir nicht sicher wie viel mA pro PIR am Ausgang hängen – das müsstest du mal nachmessen. Eingebaute Widerstände verhindern zumindest, dass mehr Spannung als 3.3V anliegt.
      Warum öchtest du überhaupt alle Sensoren am gleichen Pin anschließen? Ich sehe darin keinen wirklichen Nutzen, bis auf dass ein paar Pins gespart wurden, allerdings kannst du nicht sagen welcher denn gerade aktiviert wurde. Mit IC Gattern meine ich z.B. solche: http://www.amazon.de/CD4093BE-digital-Channels4-Inputs2-DIP14/dp/B013RJLYLO/ref=sr_1_2?ie=UTF8&qid=1462789242&sr=8-2&keywords=nand+ic
      Per Code kannst du eine AND/NAND/OR etc. Schaltung nur realisieren, wenn du für jedes Modul einen separaten GPIO hast.

    • DEKOCHJE sagt:

      Ohhh, sowas besitze ich sogar, mir fehlt nur für das Projekt gerade die Zeit mich damit auseinander zu setzen.

      Ich würde dann auch die Alternative des separaten Eingangs bevorzugen. Wie führe ich das denn im Skript aus? Angenommen mir ist egal welcher Sensor reagiert:

      Alarm = GPIO #1 or GPIO #2 ?

      Und wie würde ich verfahren wenn ich die Sensoren doch noch separat aufschlüsseln möchte?

      Vielen Dank für den Support!

    • Felix sagt:

      Nein, du musst jeden Eingang separat überprüfen (wie in dem Beispiel mit einem Modul). Du solltest aber wissen, dass das Signal nur sehr kurz ist und die Wahrscheinlichkeit, dass zwei oder mehr gleichzeitig ein Signal haben sehr gering ist. Daher würde ich eher bei der Bewegung den Zeitstempel o.ä. speichern und beim Signal eines anderen Moduls alle Zeitstempel überprüfen. Wurde es in den letzten X Sekunden aktiviert, so füre Y aus.
      Also nur als Idee/Vorschlag. Du kannst es auch ganz anders lösen.
      LG Felix

    • dekochje sagt:

      Okay, ich versuche mich nochmal daran und melde mich bei Scheitern nochmal mit dem entsprechenden Code 🙂

      Vielen Dank!

  12. Hannes Warder sagt:

    Hi,

    ich hätte da zwei Fragen…
    – kann ich wohl die Empfindlichkeit des Sensors im Betrieb ändern oder muss ich jedes Mal den Pi herunterfahren?
    – hast du evtl. noch einen Ansatz wie ich mein (offizielles) Touchscreen Display unter Jessy über python reaktivieren kann? deine Anleitung scheint für wheezy zu sein?

    • Felix sagt:

      Also die Empfindlichkeit kannst du mit dem eingebauten Poti verändern, auch während dem Betrieb.
      Bzgl des Displays: Meinst du diese Befehle? Tipps & Tricks (FAQ) zum offiziellen 7″ Raspberry Pi Touchscreen

    • Hannes Warder sagt:

      Hi,

      danke für die Info bzgl. des laufenden Betriebs!

      Und ja – danke für den Link, das meinte ich prinzipiell schon, allerdings geht das Display ja nach 5(10?) Minuten in den Standby und lässt sich bei mir mit dem von dir genannten Befehlen nicht wieder aktivieren.
      Die Hilfestellungen das zu umgehen bezieht sich wie mir scheint zumeist auf Wheezy

    • Felix sagt:

      Dann musst du den automatischen Screensaver ausstellen – ich nehme an du meinst nach 10 Minuten ohne Berührung. Ja, die meisten Befehle habe ich unter Wheezy getestet.

    • Hannes Warder sagt:

      Hi,

      darauf bezog sich meine Frage ursprünglich. Sorry, war wohl nicht ganz klar ausgedrückt.
      Ich bekomme es unter Jessie einfach nicht hin und hatte die Hoffnung du hättest evtl. den entscheidenden Tipp gehabt 🙂

    • Felix sagt:

      Du kannst mal das Package xscreensaver versuchen oder alternativ hier nachsehen: https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=57552&sid=c5af8206edb837d72600d61671c026a1

    • Hannes Warder sagt:

      Hi,

      danke, ich glaube ich hab es nun!

      Eine ergänzende Frage leider aber doch noch… mein Bewegungsmelder läuft mit deinem o.g. python Skript, allerdings wird im Minuten-takt eine Bewegung erkannt.
      Wirklich exakt jede Minute ein mal… auch wenn ich garantieren kann dass keine Bewegung erfolgte 🙁
      Hast du dazu evtl. auch eine Idee?

    • Felix sagt:

      Hast du das time.sleep schon variiert? Ggf. kannst du mit dem eingebauten Poti auch die „Genauigkeit“ ab wann eine Bewegung erkannt werden soll, verändern.

    • Hannes Warder sagt:

      Hi,

      ja nachdem du es sagtest habe ich damit rumgespielt, aber keine Änderung.
      Mal als Beispiel:

      30.05.2016 15:04:55: Bewegung erkannt
      30.05.2016 15:05:55: Bewegung erkannt
      30.05.2016 15:06:55: Bewegung erkannt
      30.05.2016 15:07:55: Bewegung erkannt
      30.05.2016 15:08:55: Bewegung erkannt
      30.05.2016 15:09:55: Bewegung erkannt
      30.05.2016 15:10:55: Bewegung erkannt
      30.05.2016 15:11:55: Bewegung erkannt

      Ohne dass nun ständig Bewegung wäre.
      Wenn zwischendurch mal Bewegung ist, dann wird diese auch mit einer anderen festgehalten. Heute war es dann immer zur 20. Sekunde, vermutlich hat das irgendetwas mit dem Programmstartzeitpunkt zu tun.

      Aber das ist wirklich kontinuierlich durch, auch zu Zeiten wo ich weiß dass nicht gerade zufällig jemand sich an dieser Stelle immer zur gleichen Sekunde bewegt 🙂

    • Hannes Warder sagt:

      Hallöch noch einmal.

      Also nachdem die ganze Nacht wirklich jede Minute geloggt wurde, habe ich den Sensor getauscht und nun scheint es sauber zu laufen.

      Danke für deine Hilfen 🙂

  13. Charlott Widrat sagt:

    Hallo,

    der Sensor ist installiert und funktioniert ! Danke für das Tutorial.
    Wie bekomme ich aber nun diese Dinge verbunden, also WENN Bewegung DANN Mail senden.

    Danke im Vorraus 🙂

  14. Charlott Widrat sagt:

    Okay, habe es doch hinbekommen! 😀

  15. bart sagt:

    Hallo,

    wie sähe das fertige skript aus, wenn der rpi sein display nur bei bewegung aktivieren soll?

  16. Tao sagt:

    Hallo,
    könntest du eine Anleitung machen für den Anschluss mehrerer PIRs an einem Raspberry um z.B. mehrere Räume zu überwachen?

    • Felix sagt:

      Der Anschluss ist doch identisch, nur dass du einen anderen GPIO verwendest. Du kannst so viele PIRs anschließen, wie du freie GPIO Pins hast.

  17. Arlind sagt:

    hallo
    ich mochte wiessen wie kann ich wenn ein bewegung hat die raspberry pi ein nachricht schikt in ein web server

    • Felix sagt:

      Einfach in der Funktion, die aufgerufen wird, wenn eine Bewegung erkannt wurde, ein Skript o.ä. aufrufen, welches die Nachricht versendet (z.B. Telegram).

  18. Matthias Mees sagt:

    Hallo vielen Dank für dieses Script.

    Vorweg ich bin total Anfänger was Linux/Python angeht…

    Mein Problem: Ich möchte dieses Script mit dem tool sms3 verbinden.

    Das heißt das ich per SMS das Script starten und stoppen kann, sowie das bei Alarm eine SMS gesendet wird. Das Senden bei Alarm wenn ich das Script per Hand starte funktioniert schon. Jetzt habe ich aber das Problem das wenn ich das Programm über eine eingehende sms starten möchte, sich der sms3 Prozess aufhängt.

    Ich habe das Python Script schon mit init.d/Alarm start vorbereitet.

    Hier der Ablauf: SMS kommt an — Shell Script überprüft die SMS und führt dementsprechenden Befehl aus — in dem beispiel /etc/init.d/Alarm start

    Jetzt startet das Programm auch nur scheint die Shell zu warten bis das Python Script
    fertig ist. Was natürlich Fatal ist, da es sich ja um eine Schleife handelt die nur bei dementsprechenden Befehl stoppt .. Ich hoffe ich konnte es verständlich erklären und es kann mir jemand helfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!