Bauteile · 14 Min. Lesezeit

Reedkontakt am Arduino: Türsensor, Alarmanlage und Tacho bauen

Reedkontakt (Reed-Schalter) am Arduino: Schließer und Öffner, Magnetabstand, Pull-up und Entprellen, Türalarm, Fahrradtacho sowie Code für ESP32 und Pico.

Ein Reedkontakt (Reed-Schalter, Magnetschalter) ist ein einfacher Sensor, der einen Stromkreis schließt, wenn ein Magnet zwei dünne Metallzungen in einem Glasröhrchen zusammenzieht; er selbst verbraucht dabei keinerlei Strom. Am Arduino liest du ihn genau wie einen Taster: Ist ein Magnet in der Nähe, schließt der Kontakt, entfernt er sich, öffnet er wieder. Dieses kleine Glasröhrchen steckt in Tür- und Fensteralarmen, Fahrradtachos, Schwimmerschaltern und Windmessern.

In dieser Anleitung lernst du Schritt für Schritt, was in einem Reedkontakt steckt, welche Typen es gibt (Schließer und Öffner), bei welchem Abstand und in welcher Ausrichtung der Magnet am besten wirkt und wie du ihn mit einem Pull-up-Widerstand an den Arduino anschließt. Danach entprellst du den Kontakt per Software, baust einen Türalarm und einen Fahrradtacho, schickst mit einem ESP32 die Nachricht "Tür geöffnet" auf dein Handy und bringst dieselbe Schaltung mit MicroPython auf einem Raspberry Pi Pico zum Laufen. Zum Schluss vergleichen wir den Reedkontakt mit einem Hall-Sensor und sammeln die häufigsten Fehler.

Reedkontakt-Sensormodul und Reed-Schalter im Glasröhrchen
Reedkontakt-Modul: Im Glasröhrchen links liegen zwei Metallzungen; der Komparator LM393 und das Potentiometer auf der Platine machen daraus ein sauberes digitales Signal am Pin DO.

Was ist ein Reedkontakt und wie funktioniert er?

Das Herz eines Reedkontakts ist ein kleines Glasröhrchen, das mit einem reaktionsträgen Gas wie Stickstoff gefüllt oder luftleer ist. Von beiden Enden ragen zwei biegsame Zungen aus einer Nickel-Eisen-Legierung hinein und überlappen sich in der Mitte mit einem sehr kleinen Spalt; das englische Wort "reed" (Zunge) bezieht sich auf sie. Die Spitzen sind mit harten Metallen wie Rhodium oder Ruthenium beschichtet, was den Übergangswiderstand niedrig hält und den Verschleiß verringert. Kommt ein Magnet in die Nähe, werden beide Zungen magnetisiert, an den überlappenden Spitzen entstehen entgegengesetzte Pole, und die Zungen ziehen sich bis zur Berührung an. Entfernt sich der Magnet, trennt die Federkraft der Zungen die Kontakte wieder. Weil das Glas die Kontakte vor Staub, Feuchtigkeit und Oxidation schützt, schaffen Reedkontakte bei kleinem Strom Hunderte Millionen Schaltspiele.

Im Handel wird das Bauteil oft auch "Reed-Relais" genannt, technisch ist das Glasröhrchen allein aber ein Reedkontakt (Reed-Schalter). Ein echtes Reed-Relais ist dasselbe Röhrchen mit einer Spule darum; dort schließt der Strom durch die Spule die Kontakte statt eines Magneten. In diesem Artikel geht es um den magnetisch betätigten Schalter und die Sensormodule, auf denen er sitzt. Sein größter Vorteil: Er verbraucht selbst keinen Strom. Durch ihn fließt nur der Strom deiner eigenen Schaltung, deshalb ist er ideal für Geräte, die monatelang mit Batterien laufen.

Technische Daten des Reedkontakts

MerkmalTypischer Wert (kleiner Glas-Reed)
KontaktartForm A (Schließer, NO) am häufigsten
GlaskörperEtwa 2 mm Durchmesser, 10–15 mm lang
SchaltleistungBis 10 W
SchaltspannungBis 100–200 V DC
SchaltstromEtwa 0,5 A
KontaktwiderstandUnter 0,1 Ω
AnsprechzeitUnter 1 ms (inklusive Prellen)
Empfindlichkeit10–40 AW (Amperewindungen, engl. AT)
Lebensdauer100 Millionen bis 1 Milliarde Schaltspiele bei kleinem Strom
EigenverbrauchKeiner (passives Bauteil)

Die Empfindlichkeit wird in AW (Amperewindungen) angegeben: Strom mal Windungszahl, die in einer genormten Prüfspule nötig sind, um den Reed zu schließen. Je kleiner der Wert, desto schwächer darf der Magnet sein und desto größer ist der Schaltabstand. Dazu kommt eine Hysterese: Das Feld zum Schließen der Kontakte (Anzug) ist stärker als das Feld, das sie geschlossen hält. Ein Reed, den ein Magnet bei 15 mm schließt, öffnet zum Beispiel erst wieder bei etwa 20 mm. Dieser Unterschied verringert das Flattern bei kleinen Erschütterungen, aber in deinem Aufbau muss der Magnet auch über den Abfallabstand hinaus wandern.

Schließer, Öffner und Wechsler (Form A, B, C)

Reedkontakte gibt es in drei Kontaktanordnungen. Die Angaben NO (Schließer, normally open) und NC (Öffner, normally closed) beschreiben immer den Zustand ohne Magnet.

TypOhne MagnetMagnet in der NäheBeinchenWo wird er eingesetzt?
Form A (Schließer, NO)OffenGeschlossen2Türsensoren, Drehzahlzähler, die meisten Module
Form B (Öffner, NC)GeschlossenOffen2Anwendungen, die schließen sollen, wenn sich der Magnet entfernt
Form C (Wechsler)COM–NC geschlossenCOM–NO geschlossen3Schaltungen, die einen offenen und einen geschlossenen Ausgang brauchen
Türkontakte für Alarmanlagen (zum Beispiel der verbreitete Typ MC-38) werden oft als "NC" verkauft. Gemeint ist, dass der Kreis bei geschlossener Tür, also mit Magnet daneben, geschlossen ist; im Inneren steckt eigentlich ein Reed der Form A (Schließer). Prüfe deinen Sensor deshalb zuerst mit dem Durchgangsprüfer (Piepton) eines Multimeters, mit und ohne Magnet; wenn du den Code nur nach dem Etikett schreibst, ist die Logik womöglich vertauscht.

Auslösen mit dem Magneten: Abstand, Ausrichtung und Empfindlichkeit

Am besten löst du einen Reedkontakt mit einem kleinen Neodym-Magneten aus. Eine Neodym-Scheibe mit 10×3 mm schaltet einen üblichen Reed meist aus 10–20 mm; ein schwarzer Ferritmagnet gleicher Größe schafft etwa die Hälfte. Fertige Türsensoren arbeiten typisch mit 15–25 mm. Der Abstand hängt aber nicht nur von der Stärke, sondern auch von der Ausrichtung ab: Liegt die Nord-Süd-Achse des Magneten parallel zum Glasröhrchen und nähert er sich dessen Mitte, erhältst du ein einziges, sauberes Schließen. Steht der Magnet quer zum Röhrchen, schaltet er genau in der Mitte womöglich gar nicht, dafür an zwei Stellen nahe den Enden. Schiebt man einen parallelen Magneten am Röhrchen entlang, entstehen außerdem neben dem Hauptbereich zwei kleine Nebenzonen. Fährt der Magnet am Reed vorbei, kann der Kontakt daher zwei- bis dreimal schließen und öffnen; das ist der häufigste Grund, warum Zählprojekte eine Umdrehung als zwei oder drei zählen.

Neodym-Magnete: Scheibe, Würfel, Quader und mit Senkbohrung
Neodym-Magnete sind ideal, um einen Reedkontakt auszulösen; Varianten mit Senkbohrung lassen sich einfach an Tür oder Rahmen festschrauben.
  • Die Polarität ist egal: Ein Reed reagiert auf Nord- und Südpol gleich; den Magneten umzudrehen ändert nichts.
  • Magnet zur Mitte des Röhrchens ausrichten: Bei Türsensoren sollten Magnet und Reedgehäuse nebeneinander und parallel sitzen, mit möglichst kleinem Spalt.
  • Stahltüren verkürzen den Abstand: Eisen bündelt das Magnetfeld in sich. Setze Sensor und Magnet mit einem 5–10 mm dicken Kunststoff-Abstandshalter auf oder nimm einen stärkeren Magneten.
  • Erst den Abstand messen: Bewege den Magneten bei geöffnetem seriellen Monitor langsam heran und wieder weg. Bei geschlossener Tür sollte der Magnet sicher innerhalb des Anzugsabstands liegen, bei leicht geöffneter Tür schon außerhalb des Abfallabstands.
  • Abstand zu starken Feldern halten: Lautsprecher, Motoren und andere Magnete können den Reed ungewollt schließen; montiere ihn nicht direkt daneben.

Reedkontakt am Arduino anschließen: Warum ist ein Pull-up-Widerstand nötig?

Da sich ein Reedkontakt wie ein Taster verhält, erzeugt er selbst keine Spannung; er verbindet oder trennt nur seine beiden Anschlüsse. Bei offenem Kontakt hängt der Pin in der Luft (er floatet), und du liest durch Störungen zufällige HIGH- und LOW-Werte. Die Lösung ist ein Pull-up-Widerstand: Der Pin wird über einen Widerstand auf 5 V (oder 3,3 V) gezogen, und der Reed kommt zwischen Pin und GND. Ohne Magnet liest der Pin HIGH; schließt der Magnet den Kontakt, liegt der Pin direkt an GND und liest LOW. Der Arduino Uno hat einen internen Pull-up von 20–50 kΩ, daher genügt pinMode(pin, INPUT_PULLUP), ein externer Widerstand ist nicht nötig. Die Details dieser Logik findest du im Artikel Taster am Arduino anschließen.

AnschlussArduino UnoESP32Raspberry Pi Pico
Reed-Beinchen 1 (einzelner Reed)D2GPIO 27GP15 (physischer Pin 20)
Reed-Beinchen 2 (einzelner Reed)GNDGNDGND
Pull-upIntern (INPUT_PULLUP)Intern (INPUT_PULLUP)Intern (Pin.PULL_UP)
Modul VCC5V3V33V3(OUT) (physischer Pin 36)
Modul GNDGNDGNDGND
Modul DOD2GPIO 27GP15
Status-LEDD13 (LED auf der Platine)GPIO 2 (LED auf der Platine)Interne LED
Aktiver Summer (+)D8Nicht verwendetGP14
Schließe einen Reedkontakt niemals direkt zwischen 5V und GND oder an einen als OUTPUT gesetzten Pin an: Sobald sich ein Magnet nähert, entsteht ein Kurzschluss, die dünnen Kontakte können verschweißen und der Spannungsregler der Platine kann Schaden nehmen. Beim ESP32 sind GPIO 34–39 reine Eingänge ohne internen Pull-up; nutzt du sie für einen Reed, setze einen externen 10-kΩ-Pull-up-Widerstand ein.

Schritt für Schritt: die erste Schaltung erkennt den Magneten

  1. Verbinde ein Beinchen des Reedkontakts mit Pin D2 des Arduino und das andere mit GND. Ein einzelner Reed hat keine Polarität, die Richtung der Beinchen spielt keine Rolle.
  2. Nutzt du ein Modul, verbinde VCC mit 5V, GND mit GND und den Ausgang DO mit D2.
  3. Lade den folgenden Code hoch und öffne den seriellen Monitor mit 9600 Baud.
  4. Nähere den Magneten langsam und parallel zum Glasröhrchen; die LED auf der Platine sollte leuchten und "magnet detected" sollte erscheinen.
  5. Miss beim Wegbewegen mit einem Lineal, bei welchem Abstand die LED erlischt; das ist dein Abfallabstand.
C++ (Arduino IDE)
1const byte REED_PIN = 2;             // reed: D2 ile GND arasında / reed between D2 and GND
2const byte LED_PIN = 13;             // karttaki LED / onboard LED
3
4void setup() {
5  Serial.begin(9600);
6  pinMode(REED_PIN, INPUT_PULLUP);   // dahili pull-up: mıknatıs yokken HIGH / internal pull-up: HIGH without a magnet
7  pinMode(LED_PIN, OUTPUT);
8}
9
10void loop() {
11  if (digitalRead(REED_PIN) == LOW) {       // kontak kapalı: mıknatıs yakında / contacts closed: magnet nearby
12    digitalWrite(LED_PIN, HIGH);
13    Serial.println(F("Miknatis var / magnet detected"));
14  } else {                                  // kontak açık: mıknatıs uzakta / contacts open: magnet away
15    digitalWrite(LED_PIN, LOW);
16    Serial.println(F("Miknatis yok / no magnet"));
17  }
18  delay(200);
19}

Achte im Code nur auf die umgekehrte Logik: Wegen INPUT_PULLUP liest du LOW, wenn der Magnet da ist, und HIGH, wenn nicht. Bei 3-poligen Modulen mit LM393 geht der Ausgang meist ebenfalls auf LOW, wenn sich der Magnet nähert, und die DO-LED auf der Platine leuchtet; da das je nach Modell abweichen kann, prüfe dein Modul zuerst im seriellen Monitor. Das Potentiometer stellt die Schwelle des Komparators ein; weil der Reed ohnehin nur offen oder geschlossen ist, hat es kaum Einfluss auf den Schaltabstand, und die Mittelstellung genügt meistens. Mini-Module wie das KY-021 haben keinen Komparator; auf der Platine sitzen nur der Reed und ein 10-kΩ-Widerstand.

Entprellen: Kontaktprellen und Erschütterungen

Wie jeder mechanische Kontakt kann auch ein Reed beim Schließen ein paarmal prellen. Beim Reed ist dieses Prellen sehr kurz, meist unter 1 ms, doch das eigentliche Problem liegt woanders. Bewegt sich der Magnet langsam an der Grenze des Anzugsabstands oder klappert die Tür im Wind, kann der Kontakt innerhalb einer Sekunde viele Male öffnen und schließen. Ein System, das beim Öffnen der Tür eine Nachricht schickt, verschickt deshalb womöglich fünf Meldungen für ein einziges Öffnen. Die Lösung: Statt jede Änderung sofort zu übernehmen, wartest du, bis der Zustand eine bestimmte Zeit stabil bleibt. Für einen Türsensor reichen 50–100 ms; bei einem Drehzahlzähler bewährt sich die kürzeste physikalisch mögliche Zeit zwischen zwei Impulsen als Sperrzeit.

Wenn du eine Hardwarelösung möchtest, setze einen 100-nF-Kondensator zwischen Pin und GND. Zusammen mit einem 10-kΩ-Pull-up ergibt sich eine Zeitkonstante von τ = R × C = 10 kΩ × 100 nF = 1 ms, die sehr kurze Preller glättet. Andere Kombinationen aus Widerstand und Kondensator kannst du mit dem RC-Zeitkonstanten-Rechner ausprobieren. Mit dem internen Pull-up liegt der Widerstand bei 20–50 kΩ, die Zeit steigt also auf 2–5 ms. Bei Türsensoren mit mehreren Metern Kabel schützen ein externer Pull-up von 4,7–10 kΩ und dieser Kondensator zusätzlich vor Störungen.

Tür- und Fensterkontakt mit Alarm: das Projekt

Das häufigste Reed-Projekt ist ein Türsensor. Befestige den Magneten am beweglichen Türflügel und den Reed am Rahmen; bei geschlossener Tür liegen beide nebeneinander, der Kontakt ist geschlossen und der Pin liest LOW. Öffnet sich die Tür, entfernt sich der Magnet und der Pin geht auf HIGH. Diese Anordnung hat einen schönen Nebeneffekt: Durchtrennt jemand das Sensorkabel, geht der Pin ebenfalls auf HIGH, und das System wertet es als "Tür geöffnet". Genau deshalb arbeiten Alarmanlagen mit Ruhestromschleifen. Der folgende Code zählt jedes Öffnen, misst, wie lange die Tür offen bleibt, und lässt den Summer im Takt piepen, wenn die Tür länger als 30 Sekunden offen steht; perfekt für Kühlschrank oder Gefriertruhe.

C++ (Arduino IDE)
1const byte REED_PIN = 2;                  // reed: D2 ile GND arası / reed between D2 and GND
2const byte BUZZER_PIN = 8;                // aktif buzzer artı ucu / active buzzer positive leg
3const byte LED_PIN = 13;                  // karttaki LED / onboard LED
4const unsigned long STABLE_MS = 50;       // debounce: 50 ms değişmeden kalmalı / debounce: must hold for 50 ms
5const unsigned long OPEN_LIMIT = 30000;   // 30 sn'den uzun açık kalırsa alarm / alarm if open longer than 30 s
6
7bool doorOpen = false;                    // onaylanmış durum / confirmed state
8bool lastReading = false;                 // son ham okuma / last raw reading
9unsigned long lastChange = 0;             // ham okumanın son değiştiği an / when the raw reading last changed
10unsigned long openedAt = 0;               // kapının açıldığı an / when the door was opened
11unsigned int openCount = 0;               // toplam açılış / total openings
12
13void setup() {
14  Serial.begin(9600);
15  pinMode(REED_PIN, INPUT_PULLUP);
16  pinMode(BUZZER_PIN, OUTPUT);
17  pinMode(LED_PIN, OUTPUT);
18  doorOpen = (digitalRead(REED_PIN) == HIGH);   // açılıştaki durumu al / take the state at boot
19  lastReading = doorOpen;
20}
21
22void loop() {
23  unsigned long now = millis();
24  bool reading = (digitalRead(REED_PIN) == HIGH);   // HIGH: mıknatıs uzak, kapı açık / HIGH: magnet away, door open
25
26  if (reading != lastReading) {           // ham değer değişti, sayacı yeniden başlat / raw value changed, restart the timer
27    lastReading = reading;
28    lastChange = now;
29  }
30
31  if (reading != doorOpen && now - lastChange >= STABLE_MS) {   // 50 ms kararlı: gerçek değişim / stable for 50 ms: real change
32    doorOpen = reading;
33    if (doorOpen) {
34      openedAt = now;
35      openCount++;
36      Serial.print(F("Kapi acildi / door opened, sayac / count: "));
37      Serial.println(openCount);
38    } else {
39      Serial.print(F("Kapi kapandi / door closed, sure / duration (s): "));
40      Serial.println((now - openedAt) / 1000);
41    }
42  }
43
44  digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);     // LED kapı açıkken yanar / LED is on while the door is open
45
46  // Uzun süre açık kalırsa çeyrek saniyede bir öt / beep every quarter second if left open too long
47  bool alarm = doorOpen && (now - openedAt > OPEN_LIMIT);
48  digitalWrite(BUZZER_PIN, (alarm && (now / 250) % 2) ? HIGH : LOW);
49}

Weil der Code kein delay() verwendet, prüft die Schleife den Pin ständig und verpasst kein Öffnen; diese Technik erklären wir ausführlich im Artikel millis statt delay. Jedes Mal, wenn sich der Rohwert ändert, wird die Zeit lastChange neu gesetzt, und der Zustand doorOpen ändert sich erst, wenn der Wert 50 ms lang gleich bleibt. Der Summer-Teil teilt millis() durch 250 und schaltet so jede Viertelsekunde um. Für eine echte Alarmanlage kannst du das System mit einem Keypad und Code scharf- und unscharf schalten und im Raum einen PIR-Bewegungsmelder ergänzen. Einen umfassenderen Aufbau findest du im Artikel Alarmanlage mit Arduino.

Fahrradtacho: Umdrehungen mit dem Reedkontakt zählen

Die meisten Fahrradtachos bestehen aus einem Reedkontakt und einem kleinen Magneten an einer Speiche. Bei jeder Radumdrehung fährt der Magnet einmal am Reed an der Gabel vorbei und erzeugt einen Impuls. Misst du die Zeit zwischen zwei Impulsen, erhältst du die Geschwindigkeit; zählst du die Impulse, die Strecke: Geschwindigkeit (km/h) = Umfang (mm) / Zeit (ms) × 3,6. Dabei entspricht mm/ms genau m/s, und der Faktor 3,6 rechnet in km/h um. Beispiel: Bei einem 700x25C-Rad mit 2105 mm Umfang und 253 ms zwischen zwei Impulsen ergibt sich 2105 / 253 × 3,6 ≈ 30 km/h. Am genauesten bestimmst du den Umfang, indem du das Rad mit dem Ventil unten genau eine Umdrehung abrollst und den Abstand der beiden Markierungen am Boden misst.

ReifengrößeUngefährer UmfangZeit pro Umdrehung bei 30 km/h
20x1.75 (BMX, Kinderrad)1515 mm182 ms
26x2.1 (Mountainbike)2068 mm248 ms
29x2.1 (Mountainbike)2288 mm275 ms
700x25C (Rennrad)2105 mm253 ms
700x28C (Stadtrad, Gravel)2136 mm256 ms
C++ (Arduino IDE)
1const byte REED_PIN = 2;                  // kesme pini D2 (INT0) / interrupt pin D2 (INT0)
2const float WHEEL_MM = 2105.0;            // 700x25C tekerlek çevresi (mm) / 700x25C wheel circumference (mm)
3const unsigned long LOCKOUT_MS = 80;      // daha sık darbe imkânsız (~95 km/sa) / faster pulses are impossible (~95 km/h)
4const unsigned long TIMEOUT_MS = 3000;    // 3 sn darbe yoksa hız 0 / no pulse for 3 s means speed 0
5
6volatile unsigned long lastPulseMs = 0;   // son geçerli darbe zamanı / time of the last valid pulse
7volatile unsigned long periodMs = 0;      // son iki darbe arası süre / time between the last two pulses
8volatile unsigned long revCount = 0;      // toplam tur / total revolutions
9
10void onMagnet() {                         // ISR: kısa ve hızlı / ISR: short and fast
11  unsigned long now = millis();
12  unsigned long dt = now - lastPulseMs;
13  if (dt < LOCKOUT_MS) return;            // sıçrama ya da çift darbe: yok say / bounce or double pulse: ignore
14  periodMs = (dt < TIMEOUT_MS) ? dt : 0;  // uzun duraklamadan sonraki ilk darbe hız vermez / first pulse after a stop gives no speed
15  lastPulseMs = now;
16  revCount++;
17}
18
19void setup() {
20  Serial.begin(9600);
21  pinMode(REED_PIN, INPUT_PULLUP);
22  attachInterrupt(digitalPinToInterrupt(REED_PIN), onMagnet, FALLING);   // mıknatıs gelince HIGH->LOW / HIGH->LOW when the magnet arrives
23}
24
25void loop() {
26  static unsigned long lastPrint = 0;
27  if (millis() - lastPrint < 500) return; // saniyede 2 kez yaz / print twice per second
28  lastPrint = millis();
29
30  noInterrupts();                         // çok baytlı değerleri güvenle kopyala / copy multi-byte values safely
31  unsigned long period = periodMs;
32  unsigned long last = lastPulseMs;
33  unsigned long revs = revCount;
34  interrupts();
35
36  float speedKmh = 0;
37  if (period > 0 && millis() - last < TIMEOUT_MS) {
38    speedKmh = WHEEL_MM / period * 3.6;   // mm/ms = m/s; 3,6 ile çarp = km/sa / multiply by 3.6 = km/h
39  }
40  float distanceKm = revs * WHEEL_MM / 1000000.0;   // tur x çevre / revolutions x circumference
41
42  Serial.print(F("Hiz / speed: "));
43  Serial.print(speedKmh, 1);
44  Serial.print(F(" km/h   Mesafe / distance: "));
45  Serial.print(distanceKm, 3);
46  Serial.println(F(" km"));
47}

Da der Impuls mit attachInterrupt erfasst wird, geht keine Umdrehung verloren, egal wie beschäftigt loop() ist; beim Arduino Uno liefern nur die Pins D2 und D3 diese Art von Interrupt. Der Wert LOCKOUT_MS ist sehr wichtig: 80 ms entsprechen bei einem Rad mit 2105 mm einer Höchstgeschwindigkeit von etwa 95 km/h (2105 / 80 × 3,6). Impulse, die schneller aufeinander folgen, sind physikalisch unmöglich und werden als Prellen, Nebenzonen des Magneten oder Prellen beim Öffnen ignoriert. Kommt 3 Sekunden lang kein Impuls, gilt die Geschwindigkeit als null. Mit demselben Aufbau misst du auch die Drehzahl eines Motors oder Rades: U/min = 60000 / Zeit (ms). Mehr zu Interrupts findest du in der Anleitung Arduino-Interrupts; um die Geschwindigkeit am Lenker anzuzeigen, kombiniere den Code mit einem OLED-Display.

Reedkontakt oder Hall-Sensor?

Die zweite Möglichkeit, einen Magneten zu erkennen, ist ein Hall-Sensor. Er wandelt das Magnetfeld in einem Halbleiterchip in ein elektrisches Signal um; er hat keine beweglichen Teile, braucht aber eine Versorgungsspannung. Die Faustregel: Für einen Tür- oder Fenstersensor, der lange mit Batterie läuft und selten auslöst, nimm einen Reed; für schnelles, dauerhaftes Zählen wie bei einem Motor, einem Lüfter oder einem Durchflusssensor, die sich Dutzende Male pro Sekunde drehen, ist ein Hall-Sensor die bessere Wahl.

MerkmalReedkontaktHall-Sensor (A3144, US1881, 49E)
FunktionsweiseMechanischer Kontakt, vom Magneten geschlossenHalbleiter, wandelt das Feld in ein elektrisches Signal
VersorgungNicht nötig, verbraucht selbst keinen StromNötig (einige mA)
SchaltgeschwindigkeitHunderte Male pro SekundeBis zu Zehntausenden Hz
KontaktprellenJa (unter 1 ms)Nein
LebensdauerMechanischer Verschleiß, 100 Millionen – 1 Milliarde SchaltspieleKeine beweglichen Teile, kein Verschleiß
PolerkennungNein, reagiert auf beide PoleJe nach Modell unipolar, bipolar oder Latch
Analoge MessungNein, nur offen oder geschlossenLineare Modelle (49E) messen die Feldstärke
Last schaltenKann kleine AC/DC-Lasten direkt schaltenNur Signalausgang
RobustheitGlasröhrchen empfindlich gegen Stoß und BiegenKunststoffgehäuse, stoßfest

Tür-offen-Benachrichtigung mit dem ESP32 (Telegram)

Dank WLAN kann der ESP32-Türsensor dir in dem Moment, in dem die Tür aufgeht, eine Nachricht aufs Handy schicken. Dafür erstellst du in Telegram mit BotFather einen Bot, holst dir den Token und deine eigene Chat-ID und installierst in der Arduino IDE die Bibliotheken UniversalTelegramBot und ArduinoJson; diese Schritte erklären wir ausführlich im Artikel ESP32-Telegram-Bot. Verbinde ein Beinchen des Reeds mit GPIO 27 und das andere mit GND. Der Code meldet das Öffnen und Schließen der Tür, erinnert dich, wenn sie länger als 5 Minuten offen steht, und versucht es 10 Sekunden später erneut, falls das WLAN gerade weg ist.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";          // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
7const char* WIFI_PASS = "Sifre123";       // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID   "123456789"             // bildirimin gideceği ID / the ID that receives alerts
10
11const int REED_PIN = 27;                  // reed: GPIO 27 ile GND arası / reed between GPIO 27 and GND
12const int LED_PIN  = 2;                   // çoğu DevKit'te dahili LED / onboard LED on most DevKits
13const unsigned long STABLE_MS = 100;      // değişim 100 ms sürmeli / a change must last 100 ms
14const unsigned long REMIND_MS = 300000;   // 5 dk açık kalırsa hatırlat / remind after 5 min open
15const unsigned long RETRY_MS  = 10000;    // gönderilemeyen mesajı 10 sn sonra dene / retry a failed message after 10 s
16
17WiFiClientSecure client;                  // şifreli (HTTPS) bağlantı / encrypted (HTTPS) connection
18UniversalTelegramBot bot(BOT_TOKEN, client);
19
20bool doorOpen = false;                    // onaylanmış kapı durumu / confirmed door state
21bool lastRaw = false;                     // son ham okuma / last raw reading
22unsigned long lastChange = 0;
23unsigned long openedAt = 0;
24bool reminded = false;
25String pending = "";                      // gönderilmeyi bekleyen mesaj / message waiting to be sent
26unsigned long lastTry = 0;
27
28void notify(const String& text) {
29  Serial.println(text);
30  if (WiFi.status() == WL_CONNECTED && bot.sendMessage(CHAT_ID, text)) {
31    pending = "";                         // gönderildi / sent
32  } else {
33    pending = text;                       // Wi-Fi yoksa sonra dene / no Wi-Fi: try again later
34    lastTry = millis();
35  }
36}
37
38void setup() {
39  Serial.begin(115200);
40  pinMode(REED_PIN, INPUT_PULLUP);        // dahili pull-up; GPIO 34-39'da yoktur / internal pull-up; GPIO 34-39 have none
41  pinMode(LED_PIN, OUTPUT);
42
43  WiFi.mode(WIFI_STA);
44  WiFi.begin(WIFI_SSID, WIFI_PASS);
45  Serial.print("Wi-Fi'ye baglaniyor / connecting to Wi-Fi");
46  while (WiFi.status() != WL_CONNECTED) {
47    delay(500);
48    Serial.print(".");
49  }
50  Serial.println();
51  Serial.println(WiFi.localIP());
52  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);   // api.telegram.org kök sertifikası / root certificate of api.telegram.org
53
54  doorOpen = (digitalRead(REED_PIN) == HIGH);    // HIGH = mıknatıs uzak = kapı açık / HIGH = magnet away = door open
55  lastRaw = doorOpen;
56  openedAt = millis();
57  digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);
58  notify(String("Kapı sensörü hazır, kapı ") + (doorOpen ? "AÇIK" : "KAPALI") + " / door sensor ready");
59}
60
61void loop() {
62  unsigned long now = millis();
63  bool raw = (digitalRead(REED_PIN) == HIGH);
64
65  if (raw != lastRaw) {                   // ham değer değişti / raw value changed
66    lastRaw = raw;
67    lastChange = now;
68  }
69
70  if (raw != doorOpen && now - lastChange >= STABLE_MS) {   // kararlı değişim / stable change
71    doorOpen = raw;
72    digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);
73    if (doorOpen) {
74      openedAt = now;
75      reminded = false;
76      notify("Kapı AÇILDI! / door OPENED!");
77    } else {
78      unsigned long sec = (now - openedAt) / 1000;
79      notify("Kapı kapandı / door closed (" + String(sec) + " sn)");
80    }
81  }
82
83  if (doorOpen && !reminded && now - openedAt > REMIND_MS) {   // açık unutuldu / left open
84    reminded = true;
85    notify("Kapı 5 dakikadır açık! / door open for 5 minutes!");
86  }
87
88  if (pending.length() > 0 && now - lastTry > RETRY_MS) {      // bekleyen mesajı yeniden dene / retry the pending message
89    String msg = pending;
90    notify(msg);
91  }
92}

Eine Nachricht an Telegram zu senden kann 1–2 Sekunden dauern, und so lange wartet die Schleife; weil die Zustandsmaschine den Pin danach aber erneut liest, geht der letzte Zustand der Tür nie verloren. Soll der Sensor mit Batterie laufen, schicke den ESP32 in den Deep Sleep und lass ihn mit esp_sleep_enable_ext0_wakeup(GPIO_NUM_27, 1) aufwachen, sobald die Tür aufgeht und der Pin HIGH wird. Stellst du vor dem Einschlafen den Weckpegel auf das Gegenteil des aktuellen Pin-Zustands, wacht die Platine beim Öffnen und beim Schließen auf. Denk dabei auch an den Strom durch den Pull-up: Bei geschlossener Tür ist der Reed geschlossen, und durch einen 10-kΩ-Widerstand fließen dauerhaft 3,3 V / 10 kΩ = 330 µA; mit 100 kΩ sind es nur 33 µA. Im Deep Sleep ist ein externer Widerstand sicherer als der interne Pull-up. Die Akkulaufzeit schätzt du mit dem Akkulaufzeit-Rechner ab.

Reedkontakt mit Raspberry Pi Pico und MicroPython

Einen Reedkontakt am Raspberry Pi Pico auszulesen, sind mit MicroPython nur ein paar Zeilen. Schließe den Reed zwischen GP15 und GND an, den Pluspol des aktiven Summers an GP14 und den Minuspol an GND. Da der Pico mit 3,3 V arbeitet, versorge ein Modul unbedingt über den Pin 3V3(OUT); speist du das Modul mit 5 V, liegt auch der Ausgang DO bei 5 V und kann den Eingang des Pico beschädigen. Der interne Pull-up des Pico liegt bei etwa 50–80 kΩ und reicht für kurze Kabel aus.

MicroPython
1from machine import Pin
2import time
3
4reed = Pin(15, Pin.IN, Pin.PULL_UP)   # reed: GP15 ile GND arası / reed between GP15 and GND
5buzzer = Pin(14, Pin.OUT)             # aktif buzzer artı ucu / active buzzer positive leg
6led = Pin("LED", Pin.OUT)             # dahili LED (Pico ve Pico W) / onboard LED (Pico and Pico W)
7
8STABLE_MS = 50                        # debounce süresi / debounce time
9door_open = reed.value() == 1         # 1 = mıknatıs uzak = kapı açık / 1 = magnet away = door open
10last_raw = door_open
11last_change = time.ticks_ms()
12open_count = 0
13led.value(door_open)
14
15while True:
16    raw = reed.value() == 1
17    now = time.ticks_ms()
18    if raw != last_raw:                       # ham değer değişti / raw value changed
19        last_raw = raw
20        last_change = now
21    if raw != door_open and time.ticks_diff(now, last_change) >= STABLE_MS:
22        door_open = raw                       # 50 ms kararlı: gerçek değişim / stable for 50 ms: real change
23        led.value(door_open)
24        if door_open:
25            open_count += 1
26            print("Kapi acildi / door opened:", open_count)
27            buzzer.on()
28            time.sleep_ms(100)                # kısa bip / short beep
29            buzzer.off()
30        else:
31            print("Kapi kapandi / door closed")
32    time.sleep_ms(5)

Der Code baut dieselbe Entprell-Logik wie beim Arduino mit time.ticks_ms() und time.ticks_diff() auf; ticks_diff liefert auch beim Überlauf des Zählers die richtige Differenz. Für Impulse, die nicht verloren gehen dürfen, etwa bei einem Tacho, kannst du mit reed.irq(trigger=Pin.IRQ_FALLING, handler=...) einen Interrupt nutzen. Mit einem Pico W kannst du das Pico-W-Beispiel aus dem Artikel Telegram-Bot ergänzen, um dasselbe Ereignis per WLAN aufs Handy zu schicken. Wenn du den Pico zum ersten Mal nutzt, beginne mit der Anleitung Was ist der Raspberry Pi Pico.

Projektideen mit dem Reedkontakt

  • Funk-Tür- und Fenstersensor: Melde jedes Öffnen zu Hause mit einem ESP32 aufs Handy oder schicke es per MQTT an Home Assistant.
  • Kühlschranktür-Warner: Er piept im Takt, wenn die Tür länger als 30 Sekunden offen steht.
  • Fahrradcomputer: Zeige aktuelle Geschwindigkeit, Gesamtstrecke und Durchschnittstempo auf einem Display.
  • Wind- und Regenmesser: In Wetterstationen erzeugt das Schalenanemometer pro Umdrehung und der Kippwaagen-Regenmesser pro Kippen einen Reed-Impuls.
  • Schwimmerschalter: Der Magnet im Schwimmer öffnet und schließt den Reed im Schaft und meldet so den vollen Tank; Details im Artikel Wasserstandssensor.
  • Geheimes Schubladenschloss: Baue ein Solenoid-Schloss, das sich nur öffnet, wenn ein Magnet an die richtige Stelle gehalten wird.
  • Briefkasten-Melder: Ein Reed an der Klappe weckt den ESP32 aus dem Deep Sleep, wenn Post kommt.

Häufige Fehler und Lösungen

  • Der Pin liest zufällige Werte: Es fehlt ein Pull-up. Setze pinMode auf INPUT_PULLUP oder ergänze einen externen 10-kΩ-Pull-up-Widerstand.
  • Die Logik ist vertauscht: Mit Pull-up liest der Pin LOW, wenn der Magnet da ist; vielleicht erwartet dein Code HIGH, oder dein Sensor ist ein Öffner (NC). Prüfe es mit dem Multimeter.
  • Mehrere Zählungen pro Öffnen: Es fehlt die Entprellung, oder der Magnet läuft durch die Nebenzonen. Ergänze eine Stabilitätszeit und richte den Magneten parallel zum Röhrchen aus.
  • Der Reed schließt nie: Der Magnet ist zu schwach, der Abstand zu groß, der Magnet steht quer zur Mitte des Röhrchens oder eine Stahltür schluckt das Feld. Nimm einen stärkeren Neodym-Magneten und einen Kunststoff-Abstandshalter.
  • Der Reed bleibt dauerhaft geschlossen: Die Kontakte sind durch zu hohen Strom oder eine kapazitive Last womöglich verschweißt. Schalte Motoren, Lampen oder Relaisspulen nie direkt mit einem Reed; nutze ein Relaismodul oder einen Transistor.
  • Das Glasröhrchen ist gesprungen: Die Beinchen wurden zu nah am Körper gebogen. Halte das Beinchen mit einer Zange fest, biege es mindestens 2–3 mm vom Glas entfernt und löte zügig.
  • Fehlalarme bei langen Kabeln: Der interne Pull-up ist zu schwach. Verwende einen externen Pull-up von 4,7–10 kΩ, einen 100-nF-Kondensator am Pin und verdrilltes Kabel.
Teste den Reedkontakt vor dem Einbau mit dem Durchgangsprüfer (Piepton) des Multimeters: Prüfspitzen an beide Beinchen, beim Nähern des Magneten muss es piepen, beim Entfernen aufhören. Dieser Zehn-Sekunden-Test zeigt sicher, ob der Reed funktioniert und ob er ein Schließer oder Öffner ist; außerdem misst du so am einfachsten den Schaltabstand mit einem Lineal.

Ein Reedkontakt ist ein günstiger und äußerst zuverlässiger Sensor, der einen Magneten ganz ohne eigenen Stromverbrauch erkennt; mit der richtigen Magnetausrichtung, einem Pull-up-Widerstand und ein paar Zeilen Entprell-Code arbeitet er jahrelang problemlos. In der BlueGrays-App findest du die Projekte Reedkontakt auslesen und Reedkontakt-Türsensor sowie Projekte wie den ESP32-Bewegungsalarm und die Alarmanlage mit Telegram-Benachrichtigung, jeweils Schritt für Schritt mit Schaltplan und Code.

Häufige Fragen

Wie funktioniert ein Reedkontakt?

Ein Reedkontakt besteht aus zwei Zungen aus Nickel-Eisen in einem Glasröhrchen. Kommt ein Magnet in die Nähe, werden die Zungen magnetisiert, ziehen sich an und der Kontakt schließt; entfernt sich der Magnet, trennt sie ihre Federkraft wieder. Er verbraucht selbst keinen Strom und wird am Arduino wie ein Taster ausgelesen.

Ist ein Reedkontakt Öffner oder Schließer?

Die meisten Reedkontakte sind Schließer (NO, Form A): ohne Magnet offen, mit Magnet geschlossen. Es gibt aber auch Öffner (NC, Form B) und dreibeinige Wechsler (Form C). Bei Türkontakten für Alarmanlagen bedeutet "NC" dagegen, dass der Kreis bei geschlossener Tür mit Magnet daneben geschlossen ist; am sichersten prüfst du es mit dem Multimeter.

Wie groß ist der Schaltabstand eines Reedkontakts?

Das hängt von der Stärke des Magneten und der Empfindlichkeit des Reeds ab. Ein kleiner Neodym-Magnet schaltet übliche Reeds meist aus 1–2 cm, fertige Türsensoren arbeiten mit 15–25 mm; mit Ferritmagneten halbiert sich der Abstand etwa. Ein parallel ausgerichteter Magnet und Abstand zu Stahlflächen vergrößern den Schaltabstand.

Braucht ein Reedkontakt einen Widerstand?

Der Arduino-Eingang braucht einen Pull-up- oder Pull-down-Widerstand, sonst floatet der Pin bei offenem Kontakt und liest Zufallswerte. Da Arduino, ESP32 und Pico interne Pull-ups haben, die du mit INPUT_PULLUP oder Pin.PULL_UP einschaltest, ist meist kein externer Widerstand nötig. Bei langen Kabeln liefert ein externer Widerstand von 4,7–10 kΩ stabilere Ergebnisse.

Was ist der Unterschied zwischen Reedkontakt und Hall-Sensor?

Ein Reedkontakt ist ein mechanischer Kontakt: Er braucht keine Versorgung und kann kleine Lasten direkt schalten, prellt aber, und sein Glasröhrchen ist zerbrechlich. Ein Hall-Sensor ist ein Halbleiter: Er braucht Versorgungsspannung, prellt nicht und ist viel schneller. Für batteriebetriebene Türsensoren nimmt man einen Reed, für schnelles Drehzahlzählen einen Hall-Sensor.

Kann ein Reedkontakt eine 230-V-Lampe schalten?

Kleine Glas-Reeds vertragen meist höchstens 10 W Schaltleistung; eine 230-V-Lampe oder einen Motor direkt zu schalten, verschweißt die Kontakte und ist gefährlich. Schließe den Reed nur als Signal an den Arduino an, steuere die Netzlast über ein Relaismodul und halte dich bei Arbeiten mit 230 V unbedingt an die Sicherheitsregeln.

Alle Projekte ansehen
Reedschalter auslesen
#37Anfänger

Reedschalter auslesen

Hast du dich schon mal gefragt, wie der Magnetschalter in Tür- und Fensteralarmen funktioniert? Kommt ein Magnet in die Nähe des Reed-Relais-Moduls, schließt sich der winzige Schalter darin; der Ardui

4.4(21)
27
Türsensor mit Reedschalter
#38Anfänger
Premium

Türsensor mit Reedschalter

Erkenne an einem Licht, ob deine Tür offen oder zu ist. An der Tür befestigst du einen kleinen Magneten, am Rahmen einen Schalter, der Magnete spürt; ist die Tür zu, liegen beide nebeneinander und die

4.7(34)
44
LED mit Taster schalten (Push)
#9Anfänger

LED mit Taster schalten (Push)

Wie bei einer Türklingel: Das Licht leuchtet, solange du drückst, und geht aus, wenn du loslässt. Der Arduino horcht ständig auf den Taster; solange er gedrückt ist, leuchtet die LED, und sobald du de

4.8(113)
229
ESP32 LED-Steuerung mit Drucktaste (Push)
#104Anfänger

ESP32 LED-Steuerung mit Drucktaste (Push)

Die LED leuchtet auf, wenn die Taste gedrückt wird und geht aus, wenn sie losgelassen wird. Zeigt, wie der digitale Eingangspin des ESP32 und der interne Pull-up-Widerstand verwendet werden. Dank des INPUT_PULLUP-Modus ist kein externer Widerstand erforderlich.

4.6(36)
55
ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)
#145Fortgeschritten
Premium

ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)

Ein intelligentes Sicherheitsalarmsystem, das Buzzer und LED aktiviert, sobald der PIR-Sensor Bewegung erkennt, und gleichzeitig eine sofortige Benachrichtigung per Telegram an den Besitzer sendet. Ein 30-sekündiger Cooldown begrenzt die Häufigkeit wiederholter Alarme; dieser Mechanismus überprüft weder die Gültigkeit der PIR-Erkennungen noch verhindert er Fehlauslösungen. Geeignet für Heimsicherheit, Garagenüberwachung, Lagerräume oder Arbeitszimmer. Mit ESP32-CAM sind Foto-Benachrichtigungen m

0.0(0)
9
Raspberry Pi Pico Taster Debounce: IRQ vs Software Polling
#159Mittel
Premium

Raspberry Pi Pico Taster Debounce: IRQ vs Software Polling

Einmal Taster gedrückt, Code zählt 3-4? Das ist Contact Bounce! Vergleiche 2 Zählmethoden in Serial: RAW Polling (fängt Bounce, zählt falsch) vs IRQ + Software Debounce (genau). Lerne Contact Bounce Physik, Software Debounce, Pin.irq() Interrupt, IRQ_FALLING Trigger, ISR Handler, global Variablen ISR-Sicherheit.

0.0(0)
12
Laser-Sicherheitssystem
#23Fortgeschritten
Premium

Laser-Sicherheitssystem

Wie die Laser-Einbruchsszenen aus Filmen: Ein Laserstrahl trifft auf einen Lichtsensor, und sobald jemand dazwischentritt und den Strahl unterbricht, leuchtet die rote LED und der Summer legt los. Der

4.8(60)
77