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)

, , , ,


32 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?

  12. Ronya sagt:

    Hallo,

    ich versuche gerade dieses Projekt mit diesem Projekt (http://tutorials-raspberrypi.de/raspberry-pi-luftfeuchtigkeit-temperatur-messen-dht11-dht22/) zu verbinden.

    Dabei stoße ich nun auf einen Fehler in meinem Code, nämlich, dass er mich immer in die else-Verzweigung wirft.
    Ich weiß jetzt nicht, ob es am DHT11 liegt oder am Reed-Relais, deshalb habe ich meine Anfrage in beiden Projekten gepostet. Ich hoffe ihr könnt mir vielleicht weiterhelfen, da ich mich mit Python eigentlich gar nicht auskenne. Die Verkabelungen habe ich auch durch Dritte nochmal überprüfen lassen, die ist wohl richtig so.
    Es könnte entweder daran liegen, dass der Schalter nicht schaltet oder aber, dass ich den Wert humidity des Sensors irgendwie nicht übergeben kann, aber ich habe keine Ahnung wie ich überprüfen kann woran es liegt.

    import Adafruit_DHT
    import RPi.GPIO as gpio
    import time
    
    gpio.setwarnings(False)
    
    #Sensor (Strom auf PIN 1)
    #sensor = Adafruit_DHT.DHT11
    #pin = 4 #liegt auf GPIO4 / PIN 7
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)
    
    #Magnete (Strom auf PIN 17)
    gpio.setmode(gpio.BCM)
    
    magnet = 17 #liegt auf GPIO 17 /PIN 11
    gpio.setup(magnet, gpio.IN)
    
    #lampe liegt auf GPIO21 / PIN 40
    #hupe liegt auf GPIO 20 / PIN 38
    led = 21
    hupe = 20
    gpio.setmode(gpio.BCM)
    gpio.setup(led,gpio.OUT)
    gpio.setup(hupe,gpio.OUT)
    
    i = 1
    zeit = 3
    
    if gpio.input(magnet)==1 and humidity > 0:
        while i <= zeit:
            print ("Bitte lueften!")
            gpio.output(led,gpio.HIGH)
            gpio.output(hupe,gpio.HIGH)
            time.sleep(0.5)
            gpio.output(led,gpio.LOW)
            gpio.output(hupe,gpio.LOW)
            time.sleep(0.5)
            i=i+0.5
    
        gpio.output(led, gpio.LOW)
        gpio.output(hupe, gpio.LOW)
    
    else: print ("Das Zimmer ist nicht zu feucht. Lueften nicht noetig.")
    • Felix sagt:

      Gib dir doch mal vor dem if die beiden Werte aus. Einer wird wahrscheinlich nicht wie erwartet sein: print(gpio.input(magnet), humidity)

  13. Heinz sagt:

    Cooles Tutorial, aber wenn ich nun nicht bloß angezeigt haben möchte, ob der Schalter zu oder offen ist, sondern ich auch gleichzeitig eine Rote LED blinken lassen möchte und über den Audioausgag einen Alarmton abspielen lassen möchte? Wie sähe das Script dann aus? Ich wüsste jetzt wie man eine Lampe an und aus schaltet, aber nicht, wie ist in das Script die LED und den Ton mit einbringen kann. Was müsste ich daran ändern? Ganz verstanden habe ich auch noch nicht, wo es dann angezeigt wird?

  14. Andre B. sagt:

    Hallo Felix, vielen Dank für dein Tutorial!

    Ich habe es mit 7 Reed Schaltern nachgebaut und bekomme leider auch mehrfach Meldungen wenn ich ein Fenster öffne bzw. schließe. Ich habe deshalb versucht das ganze mit Pull-Up Widerständen zu lösen, ich bin mir allerdings nicht sicher ob das ganze so dauerhaft lauffähig ist. Wenn du mal einen Blick drauf werfen könntest wäre ich dir dankbar.

    https://goo.gl/photos/nE5dXVFj9WfXb2p56

    LG

    Andre

    • Felix sagt:

      Ja, das passt so. Falls deine Relais jedoch nur mit 5V schalten nimmst du den 5V Anschluss vom Pi und einen Transistor. Der GPIO kommt an die Basis, 5V vom Pi an den Collector und der Emitter wird an den Relais Eingang verbunden.
      LG, Felix

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!