7602684102_ac3884cade_k

GPIO, Projekte

Überwachung von Fenstern und Türen mit dem Raspberry Pi und Reed-Relais

Neben Überwachungskamera und Bewegungssensoren ist für ein selbst gebautes Überwachungssystem auch die Auskunft über geöffnete Fenster und Türen interessant. Eine Überprüfung mit Infrarot Lichtschranken oder anderen Methoden wäre zwar sicher auch denkbar, ist aber in diesem Falle um einiges komplizierter.

Wie man ganz einfach mit einem Magnetschalter z.B. den Status des Fensters überprüfen kann wird in diesem Tutorial gezeigt.



 

Zubehör

Glücklicherweise ist nicht viel nötig um den Schalter anzubringen und die meisten Teile sind wahrscheinlich in den meisten Basterkisten bereits vorhanden. Diese Bauteile habe ich verwendet:

 

Aufbau

Der Aufbau ist wie im Bild zu entnehmen. Als Input Pin verwende ich GPIO 17 (Board Pin 11):

magnet kontakt_Steckplatine

 

Magnetschalter

Das verkabelte Modul lässt durch den dazugehörigen Magneten eine Spannung fließen-

Welches der beiden Kabel des Magnetschalters an die Basis des Transistors angeschlossen wird, spielt dabei keine Rolle. Dabei sollte das freie Ende am Fenster/Tür befestigt werden und jenes mit Kabel am besten an den festen Tür-/Fensterrahmen.

Falls die beiden Teile zu weit voneinander entfernt sind kann es sein, dass nur ein sehr geringer Strom durch den Transistor fließt, der nicht ausreicht, um zu schalten. In diesem Fall kannst du versuchen statt 3.3V den 5V Anschluss des Pi’s zu nehmen, aber solltest dann unbedingt einen Widerstand zwischen Transistor-Emitter und GPIO setzen.

Man könnte diese Schaltung natürlich auch als Pull-Up Widerstand aufbauen und hätte dadurch erst bei geöffnetem Fenster ein HIGH Signal.

 

 

Steuerung

Die Ansteuerung ist sehr simpel und kann in dieser Form in vielen Projekten zum Einsatz kommen. Statt meinem nachfolgendem Python Code kann ein ähnlicher Code auch z.B. in C++ (mit Hilfe von WiringPi) erstellt werden.

Nun aber zum Code:

sudo python

Solange das Fenster und damit auch der Magnetschalter geschlossen ist, wird am Pin eine 1 angezeigt. Sobald der Kontakt unterbrochen wird schaltet der Transistor nicht mehr und damit wird am GPIO eine Null angezeigt. Damit kannst du abfragen, ob ein Fenster/Tür geöffnet ist oder nicht.

Wer darauf warten möchte, bis sich der Zustand ändert, kann die folgende Funktion verwenden:

Wobei in diesem Fall eine Funktion mit dem Namen my_callback() vorhanden sein muss, die dann aufgerufen wird. Hierbei sind auch die Zustande GPIO.RISING und GPIO.FALLING statt GPIO.BOTH möglich.

 

 

Bild: Toby Golding/Flickr(CC BY 2.0)


, , , ,


26 Kommentare

  1. Spike sagt:

    Hallo,

    super Tutorial danke!

    Ich würde gerne mehre Magnetschalter an den MCP23017 hängen. Kann ich den Aufbau aus dem anderen Tutorial einfach übernehmen? Also den Taster gegen einen Magnetschalter tauschen?

    Mir ist es egal ob geschlossen high oder low ist, würde es dann entsprechend im Skript anpassen oder gibt es da Empfehlungen bezüglich „Belastung“ des Chips oder Stromverbrauch…?

    • Felix sagt:

      Auch wenn der MCP23017 bis zu 5.5V verträgt, solltest du wegen den GPIOs nicht mehr als 3.3V an den Magnetschalter hängen. Ansonsten kannst du den MCP23017 wie die GPIOs verwenden (außer, dass der Aufruf nicht direkt stattfindet, aber dafür kannst du ja eine Hilfsfunktion bauen).

  2. Jasmin sagt:

    Hallo,
    Ein super Tutorial/Projekt. Ich habe mich dazu entschlossen, dies für die Schule zu nehmen. Jedoch ist mir nich nicht klar, was die rote 17 in Zeile 5 soll. Es wäre nett, wenn ich schnell eine Antwort bekäme.
    LG Jasmin

    • Felix sagt:

      Meinst du die Farbe oder die Bedeutung? Die Farbe ist vollkommen unwichtig und soll nur den Code lesbarer machen.

  3. Stefan sagt:

    Hallo,

    kannst du mir erklären, warum du mit einem Transistor arbeitest? Würde das auch mit einem reinen Widerstand funktionieren oder würde man dann zu oft „Fehlalarm“ bekommen?

    Gruß Stefan

    • Felix sagt:

      Wenn das Magnet Relais nicht nah genug am Magneten ist kann es sein, dass die Treshold Spannung der GPIOs nicht überschritten wird und daher nicht erkannt wird. Der Transistor hat eine geringere Schaltspannung, wodurch sichergestellt wird, dass der Input GPIO 3.3V angelegt bekommt. Ein reiner Widerstand hätte einen gegenteiligen Effekt.

  4. Stefan sagt:

    Hallo Felix,

    ich habe das ganze jetzt mal nachgebaut. Ich habe es mit einem Event Dedect auf einen fallenden Pegel angegeben.

    An meinem neuen Raspberry Pi 2 läuft das ganze auch wunderbar Er löst ein Event aus und fertig. Baue ich es allerdings an meinen alten Rapberry Pi B Modell (26GPIOs) erhalte ich ständig Events, das der Pegel fällt.

    Kannst du mir da ggf. weiterhelfen, was ich machen könnte?

    Viele Grüße
    Stefan

    • Stefan sagt:

      Nach gefühlten tausenden Messungen habe ich herausgefunden an was es liegt. Beim alten Pi, habe ich am Transistor eine geringe aber schwankende Spannung anliegen obwohl der Magnet geöffnet ist. Keine Ahnung wie er dann Spannung bekommt, aber das ist der Auslöser.

      Ich habe jetzt anstelle des Transistors einen Optokoppler verwendet. Der löst trotz der anliegenden „Phantomspannung“ nicht aus. Dadurch liegt am 2 Stromkreis dauerhaft 0V an.

      Viele Grüße
      Stefan

  5. Stefan sagt:

    Hallo und Guten Tag!

    Klasse Tutorial!
    Es währe wohl auch möglich z.b. diesen Reed Schalter zu verwenden..

    http://www.pollin.de/shop/dt/NDgyOTc1OTk-/Haustechnik/Sicherheitstechnik/Melder/Magnet_Reedkontakt_MK_10NC.html

    Grüße und einen schönen Tag
    Stefan

  6. Tim A. sagt:

    Bei mir ist GPIO 17 schon belegt. Ich habe in der unteren Reihe den 6,7 Pin belegt. Kann man auch einen anderen GPIO verwenden? Ich gehe davon aus ja, aber welchen? Ich hab Angst was kaputt zu machen 🙁

  7. Jan sagt:

    Moin,

    ich habe gerade diese Anleitung gefunden (bitblokes.de/2015/06/das-raspberry-pi-als-wassersensor-benutzen-e-mail-als-benachrichtung) da ich die abe grausam finde dachte ich ob es nicht möglich ist. Den Magnetschalter durch ein Kabel zu ersetzen, damit möchte ich ein Signal bekommen ob meine Regenwassertonne im Garten voll ist.

  8. Patrick sagt:

    Wirklich sehr knackige Darstellung, vielen Dank für das Tutorial.

    Da ich nicht so der Elektronik Freak bin, ich die Schaltung aber sehr gerne verstehen würde, haben sich mir bei Fragen gestellt.

    Der Transistor verstärkt ja den Strom (dieses Modell wohl 200fach). Durch den 10k Widerstand zwischen Emitter und Erde fließt dort, wenn überhaupt, nur ein sehr kleiner Strom von 0,3 mA*200 = 60mA, oder?
    Aber welcher Strom fließt in den Input Pint 17, wenn der Magnetschalter den Stromkreis schließt? Welcher Widerstand herrscht dort, heißt, geht der komplette durch den Transistor verstärkte Strom dann auf GPIO Input Pin 17? Kann dieser Strom nicht den Raspberry Pi zerstören?
    Handelt es sich (vom Emitter abgehend) um eine Parallelschaltung?

    Leider hab ich wohl gerade ein Brett vorm Kopf….

    LG
    Patrick

    • Felix sagt:

      Es wird oft nur die maximale Stromstärke angegeben, was aber nicht bedeutet, dass diese auch genutzt wird. Vielleicht kommt dir das Beispiel mit einem Fluss bekannt vor, in dem die Spannung (U) die Schnelligkeit des Flusses darstellt und die max. Stromstärke (I) dessen Breite.
      Bspw wenn du eine LED hast, welche 2.0V und 2mA braucht, allerdings deine Stromquelle 3.3V liefert, dann musst du die restliche Spannung mit einem Widerstand „vernichten“. Dabei gilt die Regel U=R*I bzw. R = U/I also R = 1.3/0.002 = 650Ohm.
      Bei den GPIOs ist ebenso wichtig, dass nicht mehr als 3.3V ankommen. Solange du also nicht den 5V Pin nutzt, stellt es keine Gefahr für den Raspberry Pi da. Du könntest den Transistor sogar komplett weglassen, wenn du einen Pull Down Widerstand nimmst.

    • Patrick sagt:

      Danke für deine Antwort, echt klasse, dass du hier auf jede Frage eingehst.

      Also ich hab mich an dem Leitungsstück vor dem 10k Widerstand zum Input Pin 17 „aufgehangen“. Leider verstehe ich es noch nicht wirklich. Ich habe auf folgender Seite Schaltungen gefunden, welche die gleiche Situation (Pulldown) zeigen, allerdings mit einem PNP Transistor (Abb. 1.4): http://www.elektronik-kompendium.de/public/schaerer/pullr.htm

      Der BC 547 ist allerdings ein NPN Transistor.

      Nichtsdestotrotz habe ich die Schaltung mal nachgebaut, allerdings hatte ich nur ein paar 220 Ohm (hab 2 in Serie mit 440 Ohm verwendet statt der 470 wie gezeigt) sowie 10kOhm Widerstände, und keinen Magnetschalter (stattdessen habe ich ein Jumper Kabel zum Simulieren des Öffnens und Schließens genommen). Als Transistor hatte ich auch nur einen S8050, der es aber auch „tun“ sollte.

      Prinzipiell funktioniert die Schaltung auch. Wenn ich allerdings in Python auf die Events höre, kommen die gerne auch mal öfter.

      Liegt das an dem anderen Transistor Modell?

      Hier eine Beispiel Ausgabe meines Programms:

      >>> ================================ RESTART ================================
      >>>
      Closed!
      Closed!
      Open, ALARM, ALARM, ALARM!
      Closed!
      Closed!
      Open, ALARM, ALARM, ALARM!
      Closed!
      Closed!

      Das hier ist mein Code:

      #!/usr/bin/python3
      import RPi.GPIO as GPIO
      import time
      import sys
      
      GPIO.setmode(GPIO.BOARD)
      inputPin = 12
      GPIO.setup(inputPin, GPIO.IN)
      
      def windowOrDoorStatusChanged( pin ):
          if GPIO.input( pin ) == True:
              print('Closed!')
          else:
              print('Open, ALARM, ALARM, ALARM!')
          return
      
      GPIO.add_event_detect(inputPin, GPIO.BOTH, windowOrDoorStatusChanged)
      
      # tell initial status
      windowOrDoorStatusChanged(inputPin)
      
      # ... some more code
    • Felix sagt:

      Ich würde ggf. verschiedene Funktionen für die aufsteigende bzw. absteigende Flanke erstellen und die Abfrage nach dem Input weglassen. Ich kann dir nicht genau sagen, warum du das Signal öfters bekommst, aber es liegt sehr nahe, dass es am Aufbau liegt (Teile oder z.B. „Wackelkontakt“).

  9. LarsMq sagt:

    Hallo,

    ich bin blutiger Anfänger und erst am „Einlesen“ – aber mir kommt eine generelle Frage:

    Wenn ich nun eine Alarmanlage bauen möchte, die jedes Fenster überwacht, möchte ich doch nicht an jedem Fenster ein Raspberry Pi anbringen, der dann die Information sendet und irgendein „Haupt-Raspberry Pi“ sammelt dann alle Infos und zeigt sie an. Und entsprechend Kabel verlegen ist ja auch nicht sinnvoll.
    Also müsste ich doch die Magnetschalter mit einem bspw. 433MHz-Funksender ausstatten, der dann die Info 0/1 an einen Raspberry Pi Empfänger sendet.
    Wie kann ich das machen – also kann ich mir solche Funksensoren selber bauen oder kaufe ich dann entsprechende Magnetschalter mit Funksensoren?
    Wenn ich das über 433Mhz-Funk gestalten würde – wie kann ich den Datenverkehr absichern (verschlüsseln/“passwort“) – so dass nicht jemand durch ausprobieren der codes meine Funk-Sender ausspioniert und dann entsprechen „0“ alles gut sendet, obwohl „1“ Fenster ist auf der richtige Zustand ist…

    Ich weiß, für einen Laien evtl. zu weit gefragt – oder eben weil ich ein Laie bin blöde Frage, weil für einen Experten vollkommen klar;)

    Danke für eine Erklärung…!

    LarsMq

    • Felix sagt:

      Hallo Lars,
      solche Fensterkontakte, die einstellbare 433 MHz Signale senden, gibt es bereits (http://amzn.to/2fL9ewj), d.h. das muss man nicht unbedingt selbst bauen. Das Problem, das du angesprochen hast stimmt allerding: Da mit der 433 MHz Frequenz nur wenige Daten auf einmal gesendet werden können, ist eine Verschlüsselung in dem Sinne kaum möglich (selbst wenn du einen Arduino o.ä. an einen Magnetkontakt hängst und von diesem sendest). Theoretisch könnte ein Dritter kommen und das Signal willkürlich versenden.
      Eine bessere Variante wäre es z.B. 2.4 GHz Funkmodule zu verwenden. Da es solche nicht vorgefertigt zu kaufen gibt (jedenfalls nicht dass ich wüsste), müsstest du einen Arduino an den Magnetschalter hängen und von diesem aus an den Raspberry Pi senden. Dies ist allerdings ein etwas fortgeschritteneres Thema (hier geht’s zum Tutorial), aber damit hättest du eine größere Absicherung, dass nicht einfach jemand diesen Code sendet.
      Ich hoffe das hat dir ein wenig geholfen.
      LG, Felix

    • LarsMq sagt:

      Hallo Felix,

      vielen Dank für die Erklärung.
      Hm, da müsste man wahrscheinlich für eine sinnvolle (kostenmäßig) Anbindung einen ATTiny Mikrocontroller o.ä. nehmen (und das übersteigt meinen derzeitigem Wissensstand;) )
      Könnte man (um das 2,4GHzNetz zu vermeiden) mit einem 868MHz-Funknetz eine bspw. AES128-Verschlüsselung aufbauen – das in m.W. die möglichen Datenmengen höher, oder?

      Nochmal vielen Dank, auch im generellen für die Superseite hier!

      Gruß
      LarsMq

    • Felix sagt:

      Ja, das wäre möglich, allerdings muss ich gestehen mich mit 833 MHz Übertragung noch wenig beschäftigt zu haben, da sie eher untypisch ist. Bei 433 MHz konnte ich maximal 32 Bits pro Sendevorgang auf einmal verschicken.

  10. Thomas sagt:

    Hallo,
    super Tutorial, aber mir fehlt die Erklärung, warum der Transistor überhaupt benötigt wird. ich habe so etwas vor gehabt allerdings mit einem GPIO als IN definiert und die Gegenseite dann auf 3V gelegt. Warum dieser Umweg?

    • Felix sagt:

      In dieser Konstellation brauchst du den Transistor nicht unbedingt. Da ich mir allerdings gut vorstellen kann, dass die Kabel länger werden und somit ein Spannungsabfall eintrit, habe ich den „Umweg“ über den Transistor gewählt.

  11. Philipp sagt:

    Hallo,
    das Tutorial ist genau das richtige was ich suche.
    Leider bin ich noch Anfänger und versuche mich in alles mal einzulesen.
    Ich würde gern bei mir 10 Fenster mit Magnetschaltern, wo die Kabel alle an einem Punkt ankommen überwachen.
    Dazu bräuchte ich dann ein dementsprechende großes Klemmplatte, aber bei der Auswerteinheit bin ich mir nicht sicher. Reicht es eine Rasberry Pi2 dafür aus, ober brauche ich da zwei oder mehr?

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!