Im nachfolgenden Artikel wird beschrieben, wie sich gängige 433 MHz Tür- und Fenstersensoren am Arduino mittels 433 MHz-Receiver auslesen lassen. Zudem werden noch andere Anwendungsfälle für diese Art von Sensoren als Anregung für eigene Projekte aufgezeigt.
1. Hardware
Folgende Komponenten werden zur Umsetzung benötigt:
- 433 MHz Tür- und Fensterkontakt
- 433 MHz Receiver (Empfehlenswert: Superheterodynempfänger, da die günstigen Modelle nur Signale von sehr nahen Fensterkontakte empfangen)
- Arduino; hier: Arduino Uno (+ USB-Kabel, Jumper-Kabel, evtl. Breadboard)
Der Anschluss des 433 MHz Receivers am Arduino ist sehr simpel, da nur 3 Jumper-Kabel vom Receiver an die richtigen Buchsen im Arduino gesteckt werden müssen. Um den vorgestellten Sketch weiter unten direkt verwenden zu können, ist es empfehlenswert folgenden Aufbau zu übernehmen (für den Arduino Uno und kompatible Boards):
In tabellarischer Form:
Arduino Uno | 433 MHz Receiver |
5V | VCC |
GND | GND |
Pin 2 | Data |
Am Fenstersensor muss lediglich die Batterie eingelegt werden, sodass die Hardwarevorbereitungen damit bereits abgeschlossen sind.
2. Software
Um nachfolgende Sketches verwenden zu können, muss die Bibliothek RCSwitch installiert sein. Wie zusätzliche Bibliotheken installiert werden, steht auf dieser Arduino-Seite.
Läuft die Bibliothek in eurer Arduino IDE, so könnt ihr nun folgenden Sketch auf euren Arduino übertragen, um die jeweiligen ID eures Sensor bzw. eurer Sensoren herauszufinden:
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 | /* RF_Sniffer Hacked from http://code.google.com/p/rc-switch/ by @justy to provide a handy RF code sniffer */ #include "RCSwitch.h" #include <stdlib.h> #include <stdio.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableReceive(0); } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("Unknown encoding"); } else { Serial.print("Received "); Serial.print( mySwitch.getReceivedValue() ); Serial.print(" / "); Serial.print( mySwitch.getReceivedBitlength() ); Serial.print("bit "); Serial.print("Protocol: "); Serial.println( mySwitch.getReceivedProtocol() ); } mySwitch.resetAvailable(); } } |
Wenn ihr nun den seriellen Monitor in der Arduino IDE öffnet und dann den Magnetteil eures Fensterkontakts von seiner Gegenstelle entfernt, solltet ihr derartige Meldungen erhalten:
Wichtig ist hierbei die Zahlenfolge nach „Received“, da diese die ID eures Senders darstellt. Notiert euch diese (bei mehreren Sendern am Besten direkt am jeweiligen Sender), da wir diese nachfolgend benötigen werden.
Um einen Sensor auszulesen und eine passende Meldung über die serielle Schnittstelle an den verbundenen PC zu senden, könnt ihr nachfolgenden Sketch verwenden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include "RCSwitch.h" RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableReceive(0); } void loop() { if (mySwitch.available()) { long value = mySwitch.getReceivedValue(); if (value == 0000000) { Serial.println("Fenster 1"); delay(1000); } mySwitch.resetAvailable(); } } |
Beachtet dabei, dass ihr statt „0000000“ euren vorhin ermittelten Code eintragt. Die Ausgabe der seriellen Schnittstelle bei Auslösen des Sensors sollte nun so aussehen:Statt „Fenster 1“ könnt ihr natürlich auch andere Namen verwenden, um eure Sensoren zu identifizieren. Auch könnt ihr den Sketch für mehrere Sensoren erweitern, indem ihr die if-Abfrage mit dem Sensorcode um weitere „else if“s ergänzt mit den Codes der anderen Sensoren und individuellen Ausgaben über die serielle Schnittstelle.
3. Anwendungsfälle
Neben der klassischen Verwendung als Tür- und Fenstersensoren können die Reed-Kontakte mit Funkverbindung auch für andere Dinge eingesetzt werden. Als Beispiel denke ich da z.B. an einen Sensor für den Briefkasten, der euch informiert, wenn die Post da ist. Auch ein Einsatz an Gartentoren etc. ist denkbar, um zu erfassen, wann jemand das eigene Grundstück betritt.
Ich hoffe, ich konnte euch damit einen kleinen Überblick geben, wie ihr die Sensoren benutzen könnt und was ihr damit anstellen könnt.
Bei Fragen, Problemen und Anregungen könnt ihr natürlich wie immer das untenstehende Kommentarfeld verwenden.
Klasse! Hast Du Empfehlungen, welche 433 MHz Sender/Empfänger genau und Bezugsquellen dafür?
Hallo Wolfgang,
also die Sensoren habe ich aus China von Aliexpress, da sie dort mit ca. 2€ sehr günstig sind (hier der Link, wo ich meine her habe). Auf der Platine der Sensoren steht „EV-1527“, das scheint ein gängiges Innenleben zu sein. Die Verarbeitung (Lötstellen, Board) ist sehr gut, sodass ich sie durchaus weiterempfehlen kann. Die gleichen sollte es aber auch in Deutschland von Import-Händlern geben. Einfach mal nach 433 Fenstersensor suchen.
Den Superheterodyne-Receiver für den Arduino habe ich leider noch nicht erhalten (aus China bestellt), anderen Nutzern zufolge, soll aber z.B. dieses Set von Geeetech ganz ordentlich sein. Zum Testen würden es auch die billigeren Empfänger tun (verwende ich aktuell auch, solange der Empfänger im gleichen Raum ist, ist der Empfang stabil).
Danke Alex!
Meine chinesischen Superheterodyne-Receiver sind mittlerweile angekommen und mit einer kleinen Antenne ist damit der Empfang auch über mehrere Stockwerke hinweg problemlos möglich. Trotz des sehr geringen Preises (oder gerade deswegen) kann ich sie sehr empfehlen.
Hi, was kann ich jetzt damit anfangen? Ich mein: was bringt es mir, wenn ich eine Meldung über die serielle Schnittstelle bekomme, wenn mein PC z.B. nicht an ist, wenn die Meldung eintrifft? Verstehe den Sinn dahinter irgendwie nicht…
Hallo Ben,
die serielle Ausgabe an sicht dient nur der Demonstration. Stattdessen kann z.B. eine entsprechende LED an den Arduino angeschlossen werden, die aufleuchtet, wenn ein Signal reinkommt. Oder es werden andere Dinge über den Arduino bei Ankunft des Signals gesteuert. Oder der Arduino wird an einen Raspberry Pi etc. angeschlossen, der bei entsprechender Meldunge über die serielle Schnittstellt z.B. eine Mail sendet oder…oder…oder…
Hier habe ich nur ein Grundgerüst vorgestellt, da es hier um das reine Auslesen der Sensoren geht. Was mit dieser Information gemacht wird, ist jedem selbst überlassen ;)
Hat prima geklappt mit China-Hardware. Danke für die ausführliche Anleitung, die auch für Einsteiger wie mich nachvollziehbar ist!
Hallo! Wie funktionieren die Sensoren eigentlich? Senden die nur wenn etwas geöffnet wurde oder regelmäßig?
Danke & lg
Hallo Taxi09,
die Sensoren senden soweit ich das feststellen konnte nur, wenn der Kontakt unterbrochen wurde einmalig.
Hi,
danke für dein Tutorial,
sendet das gerät wenn der kontakt unterbrochen wurde 1x und 1x wenn er wiederhergestellt wurde?
oder woher kann ich wissen, das das z.b. Fenster wieder zu ist?
Hallo Alex,
sehr tolle Artikel, sehr tolles Blog!
Ich habe auch schon viel mit 433Mhz Steckdosenschaltern, Pi, Beaglebone und ESP8266 gebastelt.
Momentan nutzte ich aber doch einen TellStick Duo an einem Windows PC für meine 433MHz Geräte da ich bei meinen bisherigen versuchen zu viele Probleme hatte.
Ich hätte gleich auch Fragen an dich:
1.
Ist es dir mit dem Superheterodyne-Receiver auch gelungen die Signale der AB440S Fernbedingung von Elro zu empfangen und auszuwerten?
Das würde ich sehr gerne tun, da ich so auch dann auf die Zustände der Schalter schlussfolgern konnte wenn die Fernbedinung neben der IP basierten Steuerung genutzt wird.
Ich habe die Fernbedienungen nämlich als Lichterschalterersatz verbaut.
2.
Hast du den Empfang von 433MHz Signalen neben dem Uno auch schonmal mit einem ESP8266 probiert?
Ich habe keinen Uno und der ESP8266 wäre mir deutlich lieber. NodeMucs habe ich auch da hätte ich dann auch 5V VCC.
Besten Dank schonmal!
Bei deinem Block werde ich nun regelmäßig reinschauen.
Vg, Stefan
Hi Stefan,
zu deinen Fragen:
1. Diese Fernbedienung habe ich explizit noch nicht getestet, kann ich aber gerne nachholen und berichten (habe sie leider gerade nicht hier) – es sollte allerdings kein Problem darstellen, diese auszulesen
2. Ja, das funktioniert genauso einfach und gut, wie mit dem Arduino.
Super, ja da bin ich auf das Ergebnis gespannt!
Ich habe mir auch schon das höherwertigere Receiver Set bestellt, aber der Versand wird noch dauern.
Dann werde ich auch experimentieren und austesten wie es mit der Reichweite aussieht und welche Antenne es am besten tut.
Als nächstes wollte ich auch mal versuchen einen esp8266 über einen Stepper an PoE zu betreiben.
Hab den Code mal frech übernommen und rumprobiert. Danke schon mal dafür :)
Mein Türkontakt von stabo sendet 2 IDs. Einmal offen und einmal geschlossen. Sehr praktisch.
Tolles Tutorial, Ich würde aus optischen Gründen gerne diesen Sensor verwenden;
https://de.aliexpress.com/item/High-quality-1Pcs-433-MHZ-Wireless-Home-Security-Door-Window-Sensor-Detector-with-Battery-for/32738666715.html?
Die Angaben auf der Seite (Ruhestrom,..) sind aber bestimmt falsch. Wird dieser Sensor mit dem Sketch funktionieren oder kann er, da er eigentlich für ein Alarmsystem ist, auch ganz anders arbeiten? Was meint ihr?
Hallo Peter,
da er auf 433MHz sendet, sollte das Signal zumindest empfangbar sein. Solange er keinen Rolling-Code-System nutzt, sondern immer den gleichen Code sendet, sollte er auch problemlos mit diesem Sketch nutzbar sein.
Hallo Alex,
Hab mir testweise 2 verschiedene chinesische Funktürkantakte bestellt. Leider senden beide nur beim Öffnen der Kontakte. Ich brauche aber den zustand „geschlossen“ ebenfalls. Hast du einen Tip wie das am Einfachsten zu bewerkstelligen ist? Kann man die Sensoren verändern, einen eigenen Controller einbauen oder gibts günstige, die das so schon drauf haben?
Hallo Peter,
so dürften die meisten Sensoren funktionieren – meine funken nach dem gleichen Prinzip. I.d.R. ist nur ein einfacher Reed-Kontakt in den Sensoren, der öffnet/schließt, wenn der Magnet entfernt wird. Mir fällt spontan kein einfacher „Hack“ ein, um den Sensor so zu manipulieren, dass er beim schließen ebenfalls wieder sendet :(
Es gibt auch Sensoren, die zwei Signale senden (beim Öffnen sowie Schließen). Ich nutze diese hier, die es im Fünferpack auch vergleichsweise günstig gibt: https://de.aliexpress.com/item/5pcs-433MHz-EV1527-two-way-wireless-intelligent-door-window-sensor-APP-control-wifi-door-detector-for/32642367411.html?spm=2114.13010608.0.0.eRKOUC
Hi Sebastian, die sehen gut aus… verwendest du die in Verbindung mit einem Superheterodyne Empfänger? Und weißt du, ob diese auch nach einigen Minuten selbstständig einen Status senden, so wie die MAX / EQ3 Fensterkontakte. Mein Problem ist die Zuverlässigkeit, wenn ein Signal (Öffnen oder schlimmer „wieder geschlossen)) verloren geht. Es geht um ein vermietetes Objekt in Thailand. Ignoranz (Fenster offen und alle Aircons ON) möchte ich abstellen, aber wenn das Schließen übersehen wird, gibts verärgerte Gäste… daher meine Frage nach der Zuverlässigkeit und dem Protokoll
Hat viell. jemand schon das Protokoll von den EQ3’s soweit aufbereitet dass es einen Arduino Sketch gibt?
lG
Hallo Alex,
ich wollte damit Baumarktsteckdosen steuern, aber schon das Lesen des Codes scheitert. Dein Code gibt nicht aus. Ich versuche dann den PIN analog auszulesen und auszugeben. Bei den Werte ist kein Unterschied erkennbar, ob auf der Fernbedienung eine Taste gedrückt ist oder nicht.
Hast Du einen Tip?
Gruß,
Stefan
HI STefan probiers damit https://github.com/captFuture/Esp8266-fauxmoESP-AlexaBridge
mit dem Sniffer, geht spitze
Wenn man Daten zurücksenden will, ist auch das Delay auszulesen
mit
Serial.print(„Delay: „);
Serial.println( mySwitch.getReceivedDelay()
Das braucht man dann beim Schreiben in der Funktion
mySwitch.setProtocol(6,901);
Hallo, ich habe die Schaltung so aufgebaut wie dargestellt und möchte nun den Sketch auf den UNO spielen und erhalte am Ende folgenden Fehler.
Arduino: 1.8.13 (Windows 8.1), Board: „Arduino Uno“
Der Sketch verwendet 3134 Bytes (9%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 407 Bytes (19%) des dynamischen Speichers, 1641 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Beim Hochladen des Sketches ist ein Fehler aufgetreten
avrdude: verification error, first mismatch at byte 0x0000
0x00 != 0x0c
avrdude: verification error; content mismatch
Dieser Bericht wäre detaillierter, wenn die Option
„Ausführliche Ausgabe während der Kompilierung“
in Datei -> Voreinstellungen aktiviert wäre.
Wo liegt mein Problem ?? Danke Uwe