Komponen · 14 mnt baca

Tutorial Reed Switch Arduino: Sensor Pintu, Alarm, dan Speedometer

Cara kerja reed switch dan cara menghubungkannya ke Arduino: tipe NO/NC, jarak magnet, pull-up dan debounce, alarm pintu, speedometer sepeda, serta kode ESP32 dan Pico.

Reed switch (sakelar magnetik) adalah sensor sederhana yang menutup rangkaian ketika magnet menarik dua bilah logam tipis di dalam tabung kaca sampai bersentuhan, dan komponen ini sama sekali tidak memakai daya. Di Arduino, kamu membacanya persis seperti tombol: kontaknya menutup ketika ada magnet di dekatnya dan membuka lagi ketika magnet menjauh. Tabung kaca mungil ini tersembunyi di dalam alarm pintu dan jendela, komputer sepeda, saklar pelampung, dan pengukur angin.

Di panduan ini kamu akan belajar langkah demi langkah apa isi sebuah reed switch, tipe NO dan NC, pada jarak dan arah berapa magnet bekerja paling baik, dan cara menghubungkannya ke Arduino dengan resistor pull-up. Setelah itu kamu akan mengatasi pantulan kontak lewat software, membuat alarm pintu terbuka dan speedometer sepeda, mengirim notifikasi “pintu terbuka” ke ponselmu dengan ESP32, dan menjalankan rangkaian yang sama di Raspberry Pi Pico dengan MicroPython. Bagian terakhir membandingkan reed switch dengan sensor Hall dan merangkum kesalahan yang paling sering terjadi.

Modul sensor reed switch dan reed switch kaca
Modul reed switch: tabung kaca di kiri berisi dua bilah logam; komparator LM393 dan potensiometer di papan mengubah sinyalnya menjadi output digital yang bersih di pin DO.

Apa itu reed switch dan bagaimana cara kerjanya?

Inti sebuah reed switch adalah tabung kaca kecil yang diisi gas inert seperti nitrogen atau dibuat hampa udara. Dua bilah nikel-besi yang lentur masuk dari kedua ujungnya dan saling tumpang tindih di tengah dengan celah yang sangat kecil; kata “reed” merujuk ke bilah-bilah ini. Ujungnya dilapisi logam keras seperti rodium atau rutenium, yang menjaga hambatan kontak tetap rendah dan mengurangi keausan. Ketika magnet mendekat, kedua bilah ikut termagnetisasi, kutub yang berlawanan terbentuk di ujung yang tumpang tindih, dan bilah-bilah itu saling tarik sampai bersentuhan. Ketika magnet menjauh, gaya pegas bilah memisahkan kontaknya lagi. Karena kaca melindungi kontak dari debu, kelembapan, dan oksidasi, reed switch bisa bekerja ratusan juta kali pada arus kecil.

Banyak penjual menyebut komponen ini “reed relay”, tetapi secara teknis tabung kaca itu sendiri adalah reed switch. Reed relay yang sebenarnya adalah tabung kaca yang sama dengan kumparan yang dililitkan di sekelilingnya; di sana arus yang lewat kumparan, bukan magnet, yang menutup kontaknya. Artikel ini membahas sakelar yang digerakkan magnet dan modul sensor yang dibangun di sekitarnya. Kelebihan terbesarnya adalah tidak memakai daya: yang lewat hanya arus rangkaianmu sendiri, sehingga sangat cocok untuk perangkat yang berjalan berbulan-bulan dengan baterai.

Spesifikasi reed switch

PropertiNilai tipikal (reed kaca kecil)
Tipe kontakForm A (NO, normally open) paling umum
Badan kacaDiameter sekitar 2 mm, panjang 10–15 mm
Daya switchingSampai 10 W
Tegangan switchingSampai 100–200 V DC
Arus switchingSekitar 0,5 A
Hambatan kontakDi bawah 0,1 Ω
Waktu kerjaDi bawah 1 ms (termasuk pantulan)
Sensitivitas10–40 AT (ampere-lilitan)
Umur100 juta sampai 1 miliar kali kerja pada arus kecil
Konsumsi sendiriTidak ada (komponen pasif)

Sensitivitas dinyatakan dalam AT (ampere-lilitan): arus dikali jumlah lilitan yang dibutuhkan untuk menutup reed di dalam kumparan uji standar. Makin rendah nilainya, makin lemah magnet yang bisa menggerakkannya, jadi reed bekerja dari jarak yang lebih jauh. Ada juga histeresis: medan yang dibutuhkan untuk menutup kontak (pull-in) lebih kuat daripada medan yang dibutuhkan untuk menjaganya tetap tertutup. Misalnya, reed yang ditutup magnet pada jarak 15 mm mungkin baru membuka lagi di sekitar 20 mm. Perbedaan ini mengurangi kontak yang bergetar buka-tutup karena getaran kecil, tetapi desainmu harus memastikan magnet juga bergerak melewati jarak drop-out.

Tipe reed NO, NC, dan changeover (Form A, B, C)

Reed switch hadir dalam tiga susunan kontak. Label NO (normally open) dan NC (normally closed) selalu menggambarkan kondisi kontak ketika tidak ada magnet.

TipeTanpa magnetAda magnet di dekatnyaKakiDipakai di mana?
Form A (NO)TerbukaTertutup2Sensor pintu, penghitung kecepatan, kebanyakan modul
Form B (NC)TertutupTerbuka2Aplikasi yang harus menutup rangkaian ketika magnet menjauh
Form C (changeover)COM–NC tertutupCOM–NO tertutup3Rangkaian yang butuh output terbuka sekaligus tertutup
Kontak pintu yang dijual untuk sistem alarm (seperti tipe MC-38 yang umum) sering berlabel “NC”. Di sini NC berarti rangkaian tertutup ketika pintu tertutup, yaitu ketika magnet ada di sebelahnya; di dalamnya sebenarnya ada reed Form A (NO). Jadi uji dulu sensormu dengan mode kontinuitas (bunyi beep) pada multimeter, dengan dan tanpa magnet; kalau kodenya kamu tulis hanya berdasarkan label, logikanya bisa jadi terbalik.

Memicu dengan magnet: jarak, arah, dan sensitivitas

Cara terbaik memicu reed switch adalah dengan magnet neodymium kecil. Cakram neodymium 10×3 mm biasanya bisa menggerakkan reed umum dari jarak 10–20 mm; magnet ferit hitam dengan ukuran yang sama kira-kira hanya mencapai setengah jarak itu. Sensor pintu siap pakai biasanya bekerja pada 15–25 mm. Jaraknya tidak hanya bergantung pada kekuatan magnet, tetapi juga pada arahnya: ketika sumbu utara-selatan magnet dipegang sejajar dengan tabung kaca dan didekatkan ke bagian tengahnya, kamu mendapat satu penutupan yang bersih. Kalau magnet tegak lurus terhadap tabung, reed mungkin sama sekali tidak terpicu tepat di tengah dan justru terpicu di dua titik dekat ujungnya. Magnet sejajar yang digeser sepanjang tabung juga menciptakan zona penutupan tambahan yang kecil di kedua sisi zona utama. Karena itu, ketika magnet melewati reed, kontaknya bisa menutup dan membuka dua atau tiga kali; inilah alasan paling umum kenapa proyek penghitung mencatat satu putaran sebagai dua atau tiga.

Jenis magnet neodymium: cakram, kubus, balok, dan countersunk
Magnet neodymium ideal untuk memicu reed switch; magnet countersunk (berlubang benam) mudah disekrup ke pintu atau kusen.
  • Polaritas tidak penting: Reed bereaksi sama terhadap kutub utara dan kutub selatan; membalik magnet tidak mengubah hasilnya.
  • Sejajarkan magnet dengan bagian tengah tabung: Pada sensor pintu, magnet dan badan reed harus berdampingan dan sejajar, dengan celah sekecil mungkin.
  • Pintu baja memperpendek jarak: Besi menyerap medan magnet ke dalam dirinya. Tinggikan sensor dan magnet dengan ganjal plastik 5–10 mm atau pakai magnet yang lebih kuat.
  • Ukur jaraknya dulu: Dengan Serial Monitor terbuka, gerakkan magnet perlahan mendekat dan menjauh dari reed. Ketika pintu tertutup, magnet harus berada jauh di dalam jarak pull-in; begitu pintu terbuka sedikit, magnet harus sudah melewati jarak drop-out.
  • Jauhkan dari medan yang kuat: Speaker, motor, dan magnet lain bisa menutup reed tanpa disengaja; jangan pasang reed tepat di sebelahnya.

Pengkabelan reed switch ke Arduino: kenapa resistor pull-up wajib?

Karena reed switch berperilaku seperti tombol, komponen ini tidak menghasilkan tegangan sendiri; ia hanya menyambung atau memutus kedua kakinya. Ketika kontaknya terbuka, pin tidak tersambung ke apa pun (mengambang) dan kamu membaca nilai HIGH dan LOW acak akibat derau. Solusinya adalah resistor pull-up: pin ditarik ke 5 V (atau 3,3 V) lewat resistor, dan reed dipasang di antara pin dan GND. Tanpa magnet, pin membaca HIGH; ketika magnet menutup kontaknya, pin tersambung langsung ke GND dan membaca LOW. Arduino Uno punya resistor pull-up internal 20–50 kΩ, jadi menulis pinMode(pin, INPUT_PULLUP) sudah cukup dan tidak perlu resistor eksternal. Untuk detail logika ini, lihat panduan cara menghubungkan push button ke Arduino.

SambunganArduino UnoESP32Raspberry Pi Pico
Kaki reed 1 (reed tanpa modul)D2GPIO 27GP15 (pin fisik 20)
Kaki reed 2 (reed tanpa modul)GNDGNDGND
Pull-upInternal (INPUT_PULLUP)Internal (INPUT_PULLUP)Internal (Pin.PULL_UP)
VCC modul5V3V33V3(OUT) (pin fisik 36)
GND modulGNDGNDGND
DO modulD2GPIO 27GP15
LED statusD13 (LED bawaan)GPIO 2 (LED bawaan)LED bawaan
Buzzer aktif (+)D8Tidak dipakaiGP14
Jangan pernah menyambungkan reed switch langsung di antara 5V dan GND atau ke pin yang diatur sebagai OUTPUT: begitu magnet mendekat, kamu membuat korsleting, kontak tipisnya bisa melebur dan menempel, dan regulator board bisa rusak. Di ESP32, GPIO 34–39 hanya untuk input dan tidak punya resistor pull-up internal; kalau kamu memakai pin ini untuk reed, tambahkan resistor pull-up eksternal 10 kΩ.

Rangkaian pertama langkah demi langkah: mendeteksi magnet

  1. Sambungkan satu kaki reed switch ke pin D2 Arduino dan kaki lainnya ke GND. Reed tanpa modul tidak punya polaritas, jadi arah kakinya tidak penting.
  2. Kalau kamu memakai modul, sambungkan VCC ke 5V, GND ke GND, dan output DO ke D2.
  3. Upload kode di bawah dan buka Serial Monitor pada 9600 baud.
  4. Dekatkan magnet perlahan sambil memegangnya sejajar dengan tabung kaca; LED bawaan seharusnya menyala dan “magnet detected” muncul di layar.
  5. Sambil menjauhkan magnet, ukur dengan penggaris pada jarak berapa LED mati; itulah jarak drop-out milikmu.
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}

Satu-satunya yang perlu diperhatikan di kode adalah logika terbalik: karena kamu memakai INPUT_PULLUP, kamu membaca LOW ketika ada magnet dan HIGH ketika tidak ada. Pada modul LM393 3 pin, output-nya juga biasanya menjadi LOW ketika magnet mendekat dan LED DO di papan menyala; karena ini bisa berbeda antar model, cek dulu modulmu sendiri di Serial Monitor. Potensiometer di modul mengatur ambang komparator; karena reed memang sudah bekerja sebagai on/off, pengaruhnya kecil terhadap jarak deteksi dan membiarkannya di tengah biasanya sudah pas. Modul mini seperti KY-021 tidak punya komparator; papannya hanya berisi reed dan resistor 10 kΩ.

Debounce: pantulan kontak dan getaran

Seperti kontak mekanis lainnya, reed switch bisa memantul beberapa kali ketika menutup. Pada reed, pantulan (bounce) ini sangat singkat, biasanya di bawah 1 ms, tetapi itu bukan masalah sebenarnya. Kalau magnet bergerak pelan di tepi jarak pull-in, atau pintu bergetar tertiup angin, kontaknya bisa membuka dan menutup berkali-kali dalam satu detik. Itulah sebabnya sistem yang mengirim notifikasi pintu terbuka bisa mengirim lima pesan untuk satu kali pintu dibuka. Solusinya adalah menunggu sampai kondisinya tidak berubah selama waktu tertentu, alih-alih langsung menerima setiap perubahan. Untuk sensor pintu, 50–100 ms sudah cukup; untuk penghitung kecepatan, memakai waktu terpendek yang secara fisik mungkin di antara dua pulsa sebagai waktu kunci (lockout) bekerja dengan baik.

Kalau kamu ingin solusi hardware, pasang kapasitor 100 nF di antara pin dan GND. Bersama pull-up 10 kΩ, ini memberi konstanta waktu τ = R × C = 10 kΩ × 100 nF = 1 ms, yang meredam pantulan yang sangat singkat. Pasangan resistor dan kapasitor lain bisa kamu coba dengan kalkulator konstanta waktu RC. Dengan pull-up internal, hambatannya 20–50 kΩ, jadi waktunya naik menjadi 2–5 ms. Pada sensor pintu dengan kabel beberapa meter, pull-up eksternal 4,7–10 kΩ ditambah kapasitor ini juga melindungi dari derau.

Sensor pintu dan jendela terbuka dengan proyek alarm

Proyek reed yang paling umum adalah sensor pintu. Pasang magnet di daun pintu yang bergerak dan reed di kusennya; ketika pintu tertutup, keduanya berdampingan, kontaknya tertutup, dan pin membaca LOW. Ketika pintu terbuka, magnet menjauh dan pin menjadi HIGH. Susunan ini punya efek samping yang menguntungkan: kalau seseorang memotong kabel sensor, pin juga menjadi HIGH dan sistem menganggapnya sebagai “pintu terbuka”. Inilah alasan sistem alarm memakai pengkabelan loop tertutup. Kode di bawah menghitung setiap kali pintu dibuka, mengukur berapa lama pintu tetap terbuka, dan membunyikan buzzer putus-putus kalau pintu dibiarkan terbuka lebih dari 30 detik; sempurna untuk pintu kulkas atau freezer.

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}

Karena kode ini tidak memakai delay(), loop terus memeriksa pin dan tidak pernah melewatkan satu pun pembukaan pintu; teknik ini kami jelaskan lengkap di artikel millis vs delay. Setiap kali pembacaan mentah berubah, waktu lastChange di-reset, dan kondisi doorOpen hanya berubah kalau nilainya tetap sama selama 50 ms. Bagian buzzer membagi millis() dengan 250 untuk menyala dan mati setiap seperempat detik. Untuk menjadikannya alarm sungguhan, kamu bisa mengaktifkan dan menonaktifkannya dengan password lewat keypad dan menambahkan sensor gerak PIR di dalam ruangan. Untuk rangkaian yang lebih lengkap, lihat artikel sistem alarm Arduino.

Speedometer sepeda: menghitung putaran dengan reed switch

Kebanyakan komputer sepeda terdiri dari reed switch dan magnet kecil yang dijepit ke jari-jari roda. Setiap kali roda berputar, magnet melewati reed di garpu sekali dan menghasilkan satu pulsa. Ukur waktu di antara dua pulsa dan kamu mendapat kecepatan; hitung pulsanya dan kamu mendapat jarak: kecepatan (km/jam) = keliling (mm) / waktu (ms) × 3,6. Di sini mm/ms sama persis dengan m/dtk, dan mengalikannya dengan 3,6 mengubahnya menjadi km/jam. Misalnya, pada roda 700x25C dengan keliling 2105 mm, 253 ms di antara dua pulsa berarti 2105 / 253 × 3,6 ≈ 30 km/jam. Cara paling akurat mencari keliling roda adalah menggelindingkan roda tepat satu putaran dengan pentil di posisi bawah, lalu mengukur jarak di antara dua tanda di lantai.

Ukuran banPerkiraan kelilingWaktu per putaran pada 30 km/jam
20x1.75 (BMX, sepeda anak)1515 mm182 ms
26x2.1 (sepeda gunung)2068 mm248 ms
29x2.1 (sepeda gunung)2288 mm275 ms
700x25C (sepeda balap)2105 mm253 ms
700x28C (sepeda kota, 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}

Karena pulsa ditangkap dengan attachInterrupt, tidak ada putaran yang terlewat sesibuk apa pun loop(); di Arduino Uno hanya pin D2 dan D3 yang menyediakan interrupt jenis ini. Nilai LOCKOUT_MS sangat penting: 80 ms setara dengan kecepatan maksimum sekitar 95 km/jam pada roda 2105 mm (2105 / 80 × 3,6). Pulsa yang datang lebih rapat dari itu secara fisik mustahil, jadi diabaikan sebagai pantulan, zona penutupan samping dari magnet, atau kontak yang memantul ketika membuka. Kalau tidak ada pulsa selama 3 detik, kecepatannya dianggap nol. Dengan struktur yang sama, kamu bisa mengukur kecepatan motor atau roda dalam putaran per menit: RPM = 60000 / waktu (ms). Untuk penjelasan lebih lanjut tentang interrupt, lihat panduan interrupt Arduino; untuk menampilkan kecepatan di layar pada setang, gabungkan kodenya dengan layar OLED.

Reed switch atau sensor Hall?

Cara kedua untuk mendeteksi magnet adalah sensor Hall. Sensor Hall mengubah medan magnet menjadi sinyal listrik di dalam chip semikonduktor; tidak ada bagian yang bergerak, tetapi butuh catu daya untuk bekerja. Aturan singkatnya: untuk sensor pintu atau jendela yang berjalan lama dengan baterai dan jarang terpicu, pilih reed; untuk penghitungan cepat dan terus-menerus, seperti motor, kipas, atau sensor aliran air yang berputar puluhan kali per detik, sensor Hall adalah pilihan yang lebih baik.

PropertiReed switchSensor Hall (A3144, US1881, 49E)
Cara kerjaKontak mekanis, ditutup oleh magnetSemikonduktor, mengubah medan menjadi sinyal listrik
Catu dayaTidak perlu, tidak memakai daya sendiriPerlu (beberapa mA)
Kecepatan switchingRatusan kali per detikSampai puluhan ribu Hz
Pantulan kontakAda (di bawah 1 ms)Tidak ada
UmurAus secara mekanis, 100 juta – 1 miliar kali kerjaTanpa bagian bergerak, tidak aus
Deteksi kutubTidak, bereaksi terhadap kedua kutubTergantung model: unipolar, bipolar, atau latching
Pengukuran analogTidak, hanya terbuka atau tertutupModel linear (49E) mengukur kekuatan medan
Switching bebanBisa langsung menyambungkan beban AC/DC kecilHanya output sinyal
KetahananTabung kaca rentan terhadap benturan dan tekukanPaket plastik, tahan guncangan

Notifikasi pintu terbuka dengan ESP32 (Telegram)

Berkat Wi-Fi di ESP32, sensor pintu bisa mengirim pesan ke ponselmu begitu pintu terbuka. Untuk ini kamu perlu membuat bot dengan BotFather di Telegram, mendapatkan token-nya dan chat ID milikmu sendiri, lalu menginstal library UniversalTelegramBot dan ArduinoJson di Arduino IDE; langkah-langkah ini kami jelaskan lengkap di artikel bot Telegram ESP32. Sambungkan satu kaki reed ke GPIO 27 dan kaki lainnya ke GND. Kode ini mengirim pesan ketika pintu terbuka dan tertutup, mengingatkanmu kalau pintu tetap terbuka lebih dari 5 menit, dan kalau Wi-Fi sedang putus pada momen itu, mencoba mengirim ulang pesannya 10 detik kemudian.

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}

Mengirim pesan ke Telegram bisa butuh 1–2 detik dan selama itu loop menunggu; tetapi karena state machine membaca pin lagi setelah mengirim, kondisi terakhir pintu tidak pernah hilang. Kalau kamu ingin menjalankan sensor dengan baterai, masukkan ESP32 ke deep sleep dan pakai esp_sleep_enable_ext0_wakeup(GPIO_NUM_27, 1) supaya board bangun ketika pintu terbuka dan pin menjadi HIGH. Kalau sebelum tidur kamu mengatur level bangun ke kebalikan dari kondisi pin sekarang, board akan bangun baik ketika pintu dibuka maupun ditutup. Dalam kasus ini, perhitungkan juga arus yang lewat resistor pull-up: ketika pintu tertutup, reed juga tertutup, jadi 3,3 V / 10 kΩ = 330 µA terus mengalir lewat resistor 10 kΩ; dengan 100 kΩ arusnya turun menjadi 33 µA. Ketika deep sleep, resistor eksternal adalah pilihan paling aman dibanding pull-up internal. Umur baterainya bisa kamu perkirakan dengan kalkulator umur baterai.

Reed switch dengan Raspberry Pi Pico dan MicroPython

Membaca reed switch di Raspberry Pi Pico hanya butuh beberapa baris MicroPython. Sambungkan reed di antara GP15 dan GND, lalu kaki positif buzzer aktif ke GP14 dan kaki negatifnya ke GND. Karena Pico bekerja pada 3,3 V, selalu beri daya modul dari pin 3V3(OUT); kalau modul kamu beri daya 5 V, output DO-nya naik ke 5 V dan bisa merusak input Pico. Pull-up internal Pico sekitar 50–80 kΩ, cukup untuk kabel pendek.

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)

Kode ini membangun logika debounce yang sama seperti di Arduino dengan time.ticks_ms() dan time.ticks_diff(); ticks_diff tetap memberi selisih yang benar walaupun penghitungnya kembali ke nol (wrap around). Untuk pulsa yang tidak boleh terlewat, seperti pada penghitung kecepatan, kamu bisa memakai interrupt dengan reed.irq(trigger=Pin.IRQ_FALLING, handler=...). Kalau kamu punya Pico W, contoh Pico W dari artikel bot Telegram bisa kamu tambahkan ke kode ini untuk mengirim kejadian yang sama ke ponselmu lewat Wi-Fi. Kalau kamu baru pertama kali memakai Pico, mulai dari panduan Apa Itu Raspberry Pi Pico?.

Ide proyek reed switch

  • Sensor pintu dan jendela nirkabel: Laporkan setiap pintu atau jendela yang dibuka di rumahmu ke ponsel dengan ESP32, atau kirim ke Home Assistant lewat MQTT.
  • Pengingat pintu kulkas: Bunyikan beep putus-putus ketika pintu tetap terbuka lebih dari 30 detik.
  • Komputer sepeda: Tampilkan kecepatan sekarang, total jarak, dan kecepatan rata-rata di layar.
  • Pengukur angin dan hujan: Di stasiun cuaca, anemometer mangkuk menghasilkan satu pulsa reed per putaran, dan penakar hujan tipping bucket satu pulsa setiap kali wadahnya terjungkit.
  • Saklar pelampung: Magnet di dalam pelampung membuka dan menutup reed di dalam batangnya untuk melaporkan bahwa tangki sudah penuh; detailnya di artikel sensor level air.
  • Kunci laci rahasia: Buat kunci solenoid yang hanya terbuka ketika magnet ditempelkan di titik yang tepat.
  • Notifikasi kotak surat: Reed di tutup lubang surat membangunkan ESP32 dari deep sleep ketika surat datang.

Kesalahan umum dan cara mengatasinya

  • Pin membaca nilai acak: Tidak ada pull-up. Atur pinMode ke INPUT_PULLUP atau tambahkan resistor pull-up eksternal 10 kΩ.
  • Logikanya terbalik: Dengan pull-up, pin membaca LOW ketika ada magnet; kodemu mungkin mengharapkan HIGH, atau sensormu bertipe NC. Cek dengan multimeter.
  • Beberapa hitungan untuk satu kali dibuka: Tidak ada debounce, atau magnet melewati zona penutupan samping. Tambahkan waktu stabil dan sejajarkan magnet dengan tabung.
  • Reed tidak pernah menutup: Magnetnya lemah, jaraknya terlalu jauh, magnet tegak lurus terhadap bagian tengah tabung, atau pintu baja menyerap medannya. Pakai magnet neodymium yang lebih kuat dan ganjal plastik.
  • Reed tertutup terus: Kontaknya mungkin sudah melebur dan menempel karena arus berlebih atau beban kapasitif. Jangan pernah menggerakkan motor, lampu, atau kumparan relay langsung dengan reed; nyalakan beban lewat modul relay atau transistor.
  • Tabung kacanya retak: Kakinya ditekuk terlalu dekat dengan badan reed. Pegang kakinya dengan tang, tekuk minimal 2–3 mm dari kaca, dan selesaikan penyolderan dengan cepat.
  • Alarm palsu pada kabel panjang: Pull-up internal terlalu lemah. Pakai pull-up eksternal 4,7–10 kΩ, kapasitor 100 nF di pin, dan kabel twisted pair.
Uji reed switch dengan mode kontinuitas (bunyi beep) pada multimeter sebelum dipasang di rangkaian: dengan probe di kedua kakinya, multimeter seharusnya berbunyi ketika magnet mendekat dan berhenti ketika magnet menjauh. Tes sepuluh detik ini menunjukkan dengan pasti bahwa reed-nya bekerja sekaligus apakah tipenya NO atau NC; ini juga cara paling mudah untuk mengukur jarak picu magnet dengan penggaris.

Reed switch adalah sensor murah dan sangat andal yang mendeteksi magnet tanpa memakai daya sama sekali; dengan arah magnet yang benar, resistor pull-up, dan beberapa baris kode debounce, sensor ini bekerja tanpa masalah selama bertahun-tahun. Di aplikasi BlueGrays kamu bisa menemukan proyek Membaca Sakelar Reed dan Sensor Pintu dengan Sakelar Reed, juga proyek seperti Alarm Pendeteksi Gerakan ESP32 dan sistem alarm dengan notifikasi Telegram, lengkap dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Bagaimana cara kerja reed switch?

Reed switch terdiri dari dua bilah nikel-besi di dalam tabung kaca. Ketika magnet mendekat, bilah-bilah itu termagnetisasi, saling tarik, dan kontaknya menutup; ketika magnet menjauh, gaya pegasnya memisahkan kontak lagi. Komponen ini tidak memakai daya sendiri dan dibaca di Arduino persis seperti tombol.

Apakah reed switch normally open atau normally closed?

Reed switch yang paling umum bertipe NO (normally open, Form A): terbuka tanpa magnet dan tertutup ketika magnet mendekat. Ada juga versi NC (Form B) dan changeover tiga kaki (Form C). Namun pada kontak pintu alarm, label “NC” berarti rangkaian tertutup ketika pintu tertutup dan magnet ada di sebelahnya, jadi menguji dengan multimeter adalah cara paling aman.

Dari jarak berapa magnet bisa memicu reed switch?

Tergantung kekuatan magnet dan sensitivitas reed-nya. Magnet neodymium kecil biasanya memicu reed umum dari jarak 1–2 cm, dan sensor pintu siap pakai bekerja pada 15–25 mm; dengan magnet ferit, jaraknya kira-kira tinggal setengah. Memegang magnet sejajar dengan tabung dan menjauhkannya dari permukaan baja akan menambah jarak.

Apakah reed switch butuh resistor?

Input Arduino butuh resistor pull-up atau pull-down; tanpa itu pin mengambang dan membaca nilai acak ketika kontaknya terbuka. Karena Arduino, ESP32, dan Pico punya pull-up internal yang bisa kamu aktifkan dengan INPUT_PULLUP atau Pin.PULL_UP, biasanya resistor eksternal tidak diperlukan. Pada kabel panjang, resistor eksternal 4,7–10 kΩ memberi hasil yang lebih stabil.

Apa perbedaan reed switch dan sensor efek Hall?

Reed switch adalah kontak mekanis; tidak butuh daya dan bisa langsung menyambungkan beban kecil, tetapi kontaknya memantul dan tabung kacanya rapuh. Sensor Hall adalah semikonduktor; butuh catu daya, tidak memantul, dan jauh lebih cepat. Reed lebih dipilih untuk sensor pintu bertenaga baterai, sensor Hall untuk menghitung putaran yang cepat.

Bisakah reed switch menyalakan lampu listrik PLN?

Reed switch kaca kecil biasanya hanya tahan daya switching paling tinggi 10 W, jadi menyalakan lampu atau motor listrik PLN secara langsung akan membuat kontaknya melebur dan berbahaya. Sambungkan reed ke Arduino hanya sebagai sinyal, kendalikan beban listrik PLN dengan modul relay, dan selalu ikuti aturan keselamatan ketika bekerja dengan tegangan listrik PLN.

Lihat semua proyek
Membaca Sakelar Reed
#37Pemula

Membaca Sakelar Reed

Pernah penasaran dengan sakelar magnet di dalam alarm pintu dan jendela? Ketika magnet didekatkan ke modul relay reed, sakelar mungil di dalamnya menutup; Arduino membacanya sekali per detik dan mence

4.4(21)
27
Sensor Pintu dengan Sakelar Reed
#38Pemula
Premium

Sensor Pintu dengan Sakelar Reed

Ketahui apakah pintumu terbuka atau tertutup hanya dengan melihat lampu. Kamu menempelkan magnet kecil di pintu dan sakelar peka magnet di kusennya; ketika pintu tertutup keduanya bersebelahan dan LED

4.7(34)
44
Kendali LED dengan Tombol Tekan (Tekan)
#9Pemula

Kendali LED dengan Tombol Tekan (Tekan)

Persis seperti bel pintu: lampu tetap menyala selama kamu menekan, dan mati ketika kamu melepasnya. Arduino terus mendengarkan tombol; selama ditekan LED menyala, dan begitu jarimu terangkat LED mati.

4.8(113)
229
Kendali LED dengan Tombol Tekan ESP32 (Tekan)
#104Pemula

Kendali LED dengan Tombol Tekan ESP32 (Tekan)

LED menyala ketika tombol ditekan dan mati ketika dilepas. Menunjukkan cara memakai pin input digital ESP32 dan resistor pull-up internalnya. Mode INPUT_PULLUP membuat resistor eksternal tidak diperlukan.

4.6(36)
55
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9
Debounce Tombol Raspberry Pi Pico: IRQ vs Polling Perangkat Lunak
#159Menengah
Premium

Debounce Tombol Raspberry Pi Pico: IRQ vs Polling Perangkat Lunak

Tekan tombol sekali, kode menghitung 3-4? Itu pantulan kontak: kontak logam bergetar beberapa mikrodetik! Bandingkan 2 metode di Serial: polling MENTAH (ikut menghitung pantulan) vs IRQ + debounce perangkat lunak (akurat). Pelajari pantulan kontak, debounce perangkat lunak (ticks_diff() > 50ms), interrupt Pin.irq(), pemicu IRQ_FALLING, handler ISR, serta global + keamanan ISR. LED berbalik lewat IRQ, dan Serial menampilkan kedua penghitung.

0.0(0)
12
Sistem Keamanan Laser
#23Mahir
Premium

Sistem Keamanan Laser

Persis seperti adegan perampokan dengan laser di film: sinar laser menyorot sensor cahaya, dan begitu ada orang masuk dan memutus sinarnya, LED merah menyala dan buzzer mulai berbunyi. Alarmnya tidak

4.8(60)
77