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.

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
| Properti | Nilai tipikal (reed kaca kecil) |
|---|---|
| Tipe kontak | Form A (NO, normally open) paling umum |
| Badan kaca | Diameter sekitar 2 mm, panjang 10–15 mm |
| Daya switching | Sampai 10 W |
| Tegangan switching | Sampai 100–200 V DC |
| Arus switching | Sekitar 0,5 A |
| Hambatan kontak | Di bawah 0,1 Ω |
| Waktu kerja | Di bawah 1 ms (termasuk pantulan) |
| Sensitivitas | 10–40 AT (ampere-lilitan) |
| Umur | 100 juta sampai 1 miliar kali kerja pada arus kecil |
| Konsumsi sendiri | Tidak 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.
| Tipe | Tanpa magnet | Ada magnet di dekatnya | Kaki | Dipakai di mana? |
|---|---|---|---|---|
| Form A (NO) | Terbuka | Tertutup | 2 | Sensor pintu, penghitung kecepatan, kebanyakan modul |
| Form B (NC) | Tertutup | Terbuka | 2 | Aplikasi yang harus menutup rangkaian ketika magnet menjauh |
| Form C (changeover) | COM–NC tertutup | COM–NO tertutup | 3 | Rangkaian yang butuh output terbuka sekaligus tertutup |
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.

- 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.
| Sambungan | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Kaki reed 1 (reed tanpa modul) | D2 | GPIO 27 | GP15 (pin fisik 20) |
| Kaki reed 2 (reed tanpa modul) | GND | GND | GND |
| Pull-up | Internal (INPUT_PULLUP) | Internal (INPUT_PULLUP) | Internal (Pin.PULL_UP) |
| VCC modul | 5V | 3V3 | 3V3(OUT) (pin fisik 36) |
| GND modul | GND | GND | GND |
| DO modul | D2 | GPIO 27 | GP15 |
| LED status | D13 (LED bawaan) | GPIO 2 (LED bawaan) | LED bawaan |
| Buzzer aktif (+) | D8 | Tidak dipakai | GP14 |
Rangkaian pertama langkah demi langkah: mendeteksi magnet
- 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.
- Kalau kamu memakai modul, sambungkan VCC ke 5V, GND ke GND, dan output DO ke D2.
- Upload kode di bawah dan buka Serial Monitor pada 9600 baud.
- Dekatkan magnet perlahan sambil memegangnya sejajar dengan tabung kaca; LED bawaan seharusnya menyala dan “magnet detected” muncul di layar.
- Sambil menjauhkan magnet, ukur dengan penggaris pada jarak berapa LED mati; itulah jarak drop-out milikmu.
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.
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 ban | Perkiraan keliling | Waktu per putaran pada 30 km/jam |
|---|---|---|
| 20x1.75 (BMX, sepeda anak) | 1515 mm | 182 ms |
| 26x2.1 (sepeda gunung) | 2068 mm | 248 ms |
| 29x2.1 (sepeda gunung) | 2288 mm | 275 ms |
| 700x25C (sepeda balap) | 2105 mm | 253 ms |
| 700x28C (sepeda kota, gravel) | 2136 mm | 256 ms |
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.
| Properti | Reed switch | Sensor Hall (A3144, US1881, 49E) |
|---|---|---|
| Cara kerja | Kontak mekanis, ditutup oleh magnet | Semikonduktor, mengubah medan menjadi sinyal listrik |
| Catu daya | Tidak perlu, tidak memakai daya sendiri | Perlu (beberapa mA) |
| Kecepatan switching | Ratusan kali per detik | Sampai puluhan ribu Hz |
| Pantulan kontak | Ada (di bawah 1 ms) | Tidak ada |
| Umur | Aus secara mekanis, 100 juta – 1 miliar kali kerja | Tanpa bagian bergerak, tidak aus |
| Deteksi kutub | Tidak, bereaksi terhadap kedua kutub | Tergantung model: unipolar, bipolar, atau latching |
| Pengukuran analog | Tidak, hanya terbuka atau tertutup | Model linear (49E) mengukur kekuatan medan |
| Switching beban | Bisa langsung menyambungkan beban AC/DC kecil | Hanya output sinyal |
| Ketahanan | Tabung kaca rentan terhadap benturan dan tekukan | Paket 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.
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.
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.
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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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

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

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.

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.

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.

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.

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
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

