Reed switch là công tắc cơ điện từ (magnetically operated switch) — không có điện, không có tín hiệu điều khiển, chỉ cần đưa nam châm lại gần là nó đóng mạch. Độ tin cậy rất cao vì tiếp điểm được niêm phong hoàn toàn trong ống kính, không bị oxy hóa.
Nguyên Lý Hoạt Động
1. Tiếp Điểm Từ Trong Ống Kính
Bên trong reed switch là 2 lá kim loại ferromagnetic mỏng (thép có độ thấm từ cao):
Reed Switch — Cắt dọc:
←─ Nam châm ─→
↓ Từ trường
┌──────────────────────────────────────┐ ← Ống kính (sealed)
│ │
│ ─────────────┐ ┌──────────── │ ← Lá tiếp điểm (blade)
│ Blade A └────── └── Blade B │ (Ở đây đang HỞ)
└──────────────────────────────────────┘
Terminal 1 Terminal 2
Khi có từ trường đủ mạnh:
┌──────────────────────────────────────┐
│ │
│ ─────────────┐██████┌───────────── │ ← 2 lá hút nhau
│ Blade A └──────┘ Blade B │ (đang ĐÓNG)
└──────────────────────────────────────┘
Cơ chế từ tính:
- Nam châm tạo từ trường xuyên qua ống kính
- Từ trường từ hóa 2 lá thép → chúng trở thành nam châm tạm thời
- 2 lá từ hóa với cực trái chiều → hút nhau → tiếp xúc → mạch đóng
- Nam châm rời xa → từ trường yếu → lá đàn hồi tách ra → mạch hở
2. Loại Thường Mở (NO) và Thường Đóng (NC)
| Loại | Không có nam châm | Có nam châm |
|---|---|---|
| NO (Normally Open) | HỞ — không dẫn điện | ĐÓNG — dẫn điện |
| NC (Normally Closed) | ĐÓNG — dẫn điện | HỞ — không dẫn điện |
| SPDT | Com-NC ĐÓNG | Com-NO ĐÓNG |
Phổ biến nhất trong kit 37 module: Loại NO — cần đưa nam châm lại gần để đóng mạch.
Ứng dụng:
- Cảm biến cửa: reed switch gắn vào khung, nam châm gắn vào cánh → khi đóng = NO đóng = LOW
- Đo RPM: gắn nam châm lên bánh quay → mỗi vòng = 1 xung
- Float level sensor: phao có nam châm + reed switch cố định
3. Khoảng Cách Kích Hoạt
Phụ thuộc vào cường độ từ trường của nam châm:
- Nam châm ferrite nhỏ (5mm): kích hoạt ở ~5-10mm
- Nam châm neodymium: kích hoạt ở ~20-30mm
- Reed switch làm việc qua vật liệu phi từ: nhựa, gỗ, kính (~5mm)
Thông Số Kỹ Thuật
| Thông số | Giá trị |
|---|---|
| Điện áp tối đa | 100VDC / 140VAC (bare switch) |
| Dòng tối đa | 500mA (bare switch) |
| Công suất chuyển mạch | 10W |
| Tốc độ chuyển mạch | 0.1-2ms |
| Tuổi thọ | 10⁷ – 10⁸ thao tác |
| Điện trở tiếp điểm | <100mΩ |
| Khí trong ống | Nitrogen (chống oxy hóa) |
Sơ Đồ Chân (Pinout)
Module Reed Switch (trong kit 37 module)
┌──────────────────────────────────┐
│ [Reed Switch] │
│ [Pull-up 10kΩ] │
│ [LED chỉ thị] │
└──────────────────────────────────┘
GND VCC S
(-) (3.3-5V) (Signal OUT)
| Chân | Ký hiệu | Mô tả |
|---|---|---|
| GND | – | Mass |
| VCC | + | Nguồn 3.3V-5V |
| S | Signal | Output — thay đổi khi nam châm đến/đi |
Logic với pull-up (loại NO):
- Không có nam châm → reed HỞ → pull-up kéo S = HIGH
- Nam châm đến gần → reed ĐÓNG → kéo S = LOW (active LOW)
Kết Nối Phần Cứng
Module với ESP32 DevKit V1
ESP32 DevKit V1 Reed Switch Module
───────────────────── ─────────────────
3V3 ─────────────────→ VCC
GND ─────────────────→ GND
GPIO4 (Input) ─────────→ S
Gắn vật lý: Reed switch gắn vào khung cửa, nam châm gắn vào cánh cửa (cùng phía). Khoảng cách khi cửa đóng: < 10mm.
Module với Arduino Uno
Arduino Uno Reed Switch Module
───────────────────── ─────────────────
5V ─────────────────→ VCC
GND ─────────────────→ GND
Pin 2 (INT0) ─────────→ S
Code Arduino IDE
Code Phát Hiện Cửa Đóng/Mở Cơ Bản — Arduino Uno
/*
* Reed Switch — Phát hiện cửa đóng / mở
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, S→Pin2
*
* Loại NO với pull-up:
* - S = HIGH → không có nam châm = CỬA MỞ
* - S = LOW → có nam châm = CỬA ĐÓNG
*/
const int REED_PIN = 2;
const int LED_PIN = 13;
void setup() {
Serial.begin(9600);
pinMode(REED_PIN, INPUT); // Module đã có pull-up
pinMode(LED_PIN, OUTPUT);
Serial.println("=== Reed Switch Door Sensor ===");
}
int lastState = -1;
void loop() {
int reedVal = digitalRead(REED_PIN);
// Chỉ in khi có thay đổi
if (reedVal != lastState) {
lastState = reedVal;
if (reedVal == LOW) {
// Nam châm gần → reed đóng → mạch kín → LOW
Serial.println("CỬA ĐÓNG");
digitalWrite(LED_PIN, HIGH); // LED sáng khi cửa đóng
} else {
// Không có nam châm → reed hở → HIGH
Serial.println("CỬA MỞ!");
digitalWrite(LED_PIN, LOW);
}
}
delay(50); // Debounce nhỏ
}
Code Báo Động Cửa — Interrupt (Arduino Uno)
/*
* Reed Switch — Báo động khi cửa mở (anti-theft)
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, S→Pin2, Buzzer→Pin9
*
* Cơ chế:
* - Khi cửa đóng: S = LOW (nam châm gần)
* - Khi cửa mở: S lên HIGH → RISING interrupt → báo động
*/
const int REED_PIN = 2;
const int BUZZER_PIN = 9;
const int LED_PIN = 13;
volatile bool doorOpened = false;
bool alarmActive = false;
// ISR — gọi khi cửa MỞ (RISING: LOW→HIGH)
void onDoorOpen() {
doorOpened = true;
}
void setup() {
Serial.begin(9600);
pinMode(REED_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
// Trigger khi cửa mở (LOW→HIGH khi nam châm rời xa)
attachInterrupt(digitalPinToInterrupt(REED_PIN), onDoorOpen, RISING);
Serial.println("=== Door Alarm System ===");
Serial.println("Đóng cửa lại để arm hệ thống...");
// Chờ cửa đóng trước khi arm
while (digitalRead(REED_PIN) == HIGH) {
delay(100); // Đợi cửa đóng
}
Serial.println("Cửa đã đóng — Báo động BẬT (armed)");
digitalWrite(LED_PIN, HIGH); // LED sáng = armed
}
void loop() {
if (doorOpened && !alarmActive) {
doorOpened = false;
alarmActive = true;
Serial.println("!!! CỬA MỞ — Báo động !!!");
}
// Buzzer khi alarm đang hoạt động
if (alarmActive) {
// Beep 3 lần rồi dừng 0.5 giây
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER_PIN, HIGH); delay(150);
digitalWrite(BUZZER_PIN, LOW); delay(100);
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Blink LED
}
delay(500);
// Tắt alarm khi cửa đóng lại
if (digitalRead(REED_PIN) == LOW) {
alarmActive = false;
digitalWrite(LED_PIN, HIGH);
Serial.println("Cửa đóng — dừng báo động");
}
}
}
Code Đo RPM Bằng Reed Switch — Arduino Uno
/*
* Reed Switch — Đo vòng/phút (RPM)
* Gắn nam châm nhỏ vào bánh quay, reed switch cố định bên ngoài
* Mỗi vòng = 1 xung (1 lần nam châm đi qua)
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, S→Pin2
*/
const int REED_PIN = 2;
volatile unsigned long pulseCount = 0; // Số xung từ ISR
volatile unsigned long lastPulseTime = 0; // Thời điểm xung cuối (ms)
const int MAGNETS_PER_REV = 1; // Số nam châm trên bánh
void onMagnet() {
unsigned long now = millis();
if (now - lastPulseTime > 20) { // Debounce 20ms
pulseCount++;
lastPulseTime = now;
}
}
void setup() {
Serial.begin(9600);
pinMode(REED_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(REED_PIN), onMagnet, FALLING);
Serial.println("=== RPM Meter ===");
Serial.println("RPM | RPS (rounds/sec)");
}
void loop() {
delay(1000); // Đo trong 1 giây
// Đọc và reset counter (atomic)
noInterrupts();
unsigned long count = pulseCount;
pulseCount = 0;
interrupts();
// Tính RPM: count xung trong 1s → count/MAGNETS_PER_REV vòng/s
float rps = (float)count / MAGNETS_PER_REV;
float rpm = rps * 60.0;
Serial.print(rpm, 1);
Serial.print(" RPM | ");
Serial.print(rps, 2);
Serial.println(" RPS");
}
Code ESP32 — Smart Door Alert WiFi
/*
* Reed Switch — ESP32, phát hiện cửa mở + in Serial
* (WiFi notification có thể thêm vào sau)
* Board: ESP32 DevKit V1
* Kết nối: VCC→3V3, GND→GND, S→GPIO4
*/
const int REED_PIN = 4;
volatile bool doorEvent = false;
volatile bool doorState = false; // true = cửa mở
void IRAM_ATTR onReedChange() {
doorState = (digitalRead(REED_PIN) == HIGH); // HIGH = cửa mở (NO + pull-up)
doorEvent = true;
}
void setup() {
Serial.begin(115200);
pinMode(REED_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(REED_PIN), onReedChange, CHANGE);
// Đọc trạng thái ban đầu
doorState = (digitalRead(REED_PIN) == HIGH);
Serial.println("=== Smart Door Sensor ESP32 ===");
Serial.println(doorState ? "Ban đầu: Cửa MỞ" : "Ban đầu: Cửa đóng");
}
unsigned long lastEventTime = 0;
int openCount = 0;
void loop() {
if (doorEvent) {
doorEvent = false;
unsigned long now = millis();
// Debounce 100ms
if (now - lastEventTime > 100) {
lastEventTime = now;
if (doorState) {
openCount++;
Serial.print("CỬA MỞ! Lần thứ ");
Serial.println(openCount);
// Có thể gọi: sendMqttAlert() hoặc sendTelegramMessage() ở đây
} else {
Serial.println("Cửa đóng");
}
}
}
}
Kết Quả Mong Đợi
=== Reed Switch Door Sensor ===
CỬA ĐÓNG
CỬA MỞ!
CỬA ĐÓNG
CỬA MỞ!
Ứng Dụng Thực Tế
| Ứng dụng | Chi tiết |
|---|---|
| Cảm biến cửa nhà | Báo động khi cửa/cửa sổ mở |
| Đo RPM | Gắn nam châm lên motor/bánh xe |
| Cảm biến mức nước | Phao với nam châm + reed switch ở nắp |
| Anti-theft laptop | Gắn ở nắp máy tính → báo khi mở |
| Đếm sản phẩm | Mỗi sản phẩm đi qua = 1 xung |
Lưu Ý Khi Sử Dụng
1. Phân biệt NO và NC
Kiểm tra trước: đưa nam châm lại gần và đo điện trở hoặc đọc tín hiệu. Loại NO: không có nam châm → hở, có nam châm → thông. Logic output phụ thuộc loại và có pull-up hay không.
2. Bounce tồn tại mặc dù nhỏ
Reed switch ít bounce hơn cơ học nhưng không hoàn toàn không có. Debounce 20-50ms là an toàn cho hầu hết ứng dụng. Đo RPM cần debounce rất nhỏ (~5ms) để không bỏ sót xung.
3. Nam châm quá mạnh hoặc quá yếu đều sai
Quá yếu → không đóng được. Quá mạnh (neodymium lớn) → từ trường rò → đóng cả khi xa 5cm. Dùng nam châm ferrite nhỏ đi kèm module, test khoảng cách thực tế.
4. Vỏ kính dễ vỡ
Bare reed switch ống kính rất mỏng, dễ vỡ nếu bẻ hoặc tác lực cơ học. Module trong kit đã được bảo vệ bởi PCB. Nếu dùng bare switch → bọc trong heat shrink tube.


