Công tắc, nút nhấn, cầu chì và relay: cách chọn, cách nối với ESP32
Các loại công tắc SPST, SPDT, nút nhấn 4 chân, điện trở kéo lên và chống dội, cầu chì và cách chọn, cấu tạo relay COM NO NC, thí nghiệm nút nhấn bật tắt module relay bằng ESP32.
Công tắc, nút nhấn, cầu chì và relay là các linh kiện "đóng cắt" của mạch: chúng nối hoặc ngắt một đường dòng điện, bằng tay, bằng dòng quá tải hay bằng tín hiệu điện. Bài viết giới thiệu các loại công tắc và nút nhấn, cách đọc nút nhấn bằng vi điều khiển với điện trở kéo lên và chống dội, các loại cầu chì và cách chọn, cấu tạo và thông số relay, rồi làm thí nghiệm dùng một nút nhấn bật tắt module relay qua ESP32, đồng thời đếm số lần tiếp điểm nảy.
1. Công tắc và nút nhấn

- Cực (pole) là số mạch được đóng cắt cùng lúc; ngả (throw) là số vị trí nối của mỗi cực. SPST là công tắc bật tắt đơn giản; SPDT chuyển một đường sang một trong hai ngả; DPDT có hai bộ SPDT chuyển cùng lúc, hay dùng để đảo chiều động cơ.
- Công tắc giữ trạng thái (gạt, bập bênh, trượt); nút nhấn chỉ nối khi đang nhấn (thường hở, NO) hoặc chỉ ngắt khi đang nhấn (thường đóng, NC, dùng cho nút dừng khẩn cấp).
- Nút nhấn tactile 4 chân hay dùng trên breadboard có hai cặp chân luôn nối với nhau. Cắm nút vắt ngang rãnh giữa breadboard và dùng hai chân chéo nhau là chắc chắn đúng; hoặc thử bằng thang thông mạch.
- Mỗi công tắc có dòng và điện áp định mức của tiếp điểm (ví dụ 3 A 250 V AC). Nút tactile chỉ dành cho tín hiệu nhỏ (khoảng 50 mA 12 V), không dùng để bật tắt tải.

2. Đọc nút nhấn bằng vi điều khiển

- Chân GPIO đặt làm đầu vào có trở kháng rất lớn. Nếu nút nhấn chỉ nối chân xuống GND, lúc không nhấn chân bị bỏ lửng, đọc ngẫu nhiên 0 hoặc 1 theo nhiễu. Cần một điện trở kéo lên (pull-up) từ chân lên 3V3: không nhấn thì đọc HIGH, nhấn thì đọc LOW.
- ESP32 có điện trở kéo lên bên trong, khoảng vài chục kΩ, bật bằng
pinMode(chan, INPUT_PULLUP). Riêng GPIO34 đến GPIO39 không có điện trở kéo bên trong, phải dùng điện trở ngoài. - Nảy tiếp điểm: khi nhấn, hai tiếp điểm kim loại va vào nhau và bật ra vài lần trong vài mili giây. Vi điều khiển đọc rất nhanh nên thấy một lần nhấn thành nhiều lần. Cách xử lý: chống dội bằng phần mềm (chỉ nhận mức mới khi nó giữ nguyên khoảng 20–50 ms) hoặc bằng mạch RC (bài 12).
3. Cầu chì

- Cầu chì là một đoạn dây kim loại được tính để chảy đứt khi dòng vượt định mức, cắt mạch trước khi dây dẫn và linh kiện bị nóng cháy.
- Chọn dòng định mức khoảng 1,25–1,5 lần dòng làm việc lớn nhất. Loại chảy chậm (ký hiệu T) chịu được dòng khởi động ngắn của động cơ, tụ lọc; loại chảy nhanh (F) bảo vệ mạch điện tử nhạy.
- Cầu chì tự phục hồi (PTC, polyfuse) nóng lên và tăng điện trở khi quá dòng, nguội thì dẫn lại; hay có trên cổng USB của các bo mạch.
- Đặt cầu chì trên dây dương, càng gần nguồn càng tốt (nhất là với pin, ắc quy có thể cho dòng chập rất lớn). Cầu chì đứt là dấu hiệu có lỗi: tìm nguyên nhân trước khi thay, và không thay bằng loại dòng lớn hơn hay dây đồng.
4. Relay

- Relay là công tắc điều khiển bằng điện: cuộn dây có điện thì thành nam châm, hút phần ứng làm đổi tiếp điểm. Tiếp điểm chung COM bình thường nối NC (thường đóng); khi cuộn có điện, COM chuyển sang NO (thường hở).
- Phía cuộn dây và phía tiếp điểm không nối điện với nhau, nên relay cho phép tín hiệu 3,3 V bật tắt một tải 12 V hay 220 V, với điều kiện tải nằm trong định mức tiếp điểm.
- Cuộn relay 5 V cần khoảng 70–90 mA, vượt xa mức một chân GPIO cấp được, và sinh điện áp cảm ứng khi ngắt (bài 13). Vì vậy cần một transistor (bài 19) và một diode dập. Module relay đã có sẵn transistor (hoặc optocoupler), diode và đèn báo; chân IN chỉ cần dòng nhỏ.
- Relay cơ có tuổi thọ tiếp điểm giới hạn (khoảng 100 000 lần đóng cắt ở tải định mức) và không nên đóng cắt nhanh. Cần đóng cắt nhanh, êm, bền thì dùng relay bán dẫn (SSR) hoặc MOSFET (bài 20).
5. Thí nghiệm: nút nhấn bật tắt relay qua ESP32
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Module relay 5 V loại 1 kênh (hoặc dùng một kênh của module nhiều kênh), một nút nhấn tactile.
- Ở bước này chưa nối tải vào tiếp điểm; chỉ nghe tiếng relay đóng và xem đèn báo. Muốn thử tải, dùng tải điện áp thấp như đèn LED 12 V với nguồn adapter riêng.

| Từ | Tới | Ghi chú |
|---|---|---|
| Module relay VCC | ESP32 VIN | 5 V từ cổng USB; giữ jumper JD-VCC – VCC nếu module có |
| Module relay GND | ESP32 GND | Đất chung |
| Module relay IN | ESP32 GPIO26 | Tín hiệu điều khiển |
| Nút nhấn chân 1 | ESP32 GPIO27 | Dùng điện trở kéo lên bên trong |
| Nút nhấn chân 2 (chéo) | ESP32 GND |
Chương trình
/*
PYWORLD.VN - Nút nhấn bật tắt relay bằng ESP32: điện trở kéo lên bên trong, chống dội bằng phần mềm, đếm số lần nảy
Nút nhấn: một chân vào GPIO27, chân kia vào GND. Module relay: VCC -> VIN (5 V), GND -> GND, IN -> GPIO26
LED xanh trên bo (GPIO2) sáng khi relay đóng
*/
#define CHAN_NUT 27
#define CHAN_RELAY 26
#define CHAN_LED 2
const bool RELAY_KICH_MUC_THAP = true; // Module kích mức thấp: IN = LOW thì relay đóng. Loại kích mức cao thì đặt false
const uint32_t THOI_GIAN_CHONG_DOI_MS = 30;
bool relayDong = false;
int mucTho = HIGH; // Mức đọc trực tiếp ở chân nút (chưa chống dội)
int mucOnDinh = HIGH; // Mức đã ổn định sau thời gian chống dội
uint32_t lanDoiCuoi = 0; // Thời điểm mức thô đổi lần gần nhất
uint32_t soCanhTho = 0; // Số lần mức thô đổi trong một lần nhấn (1 nếu tiếp điểm không nảy)
uint32_t soLanNhan = 0;
void datRelay(bool dong) {
relayDong = dong;
bool muc = RELAY_KICH_MUC_THAP ? !dong : dong;
digitalWrite(CHAN_RELAY, muc ? HIGH : LOW);
digitalWrite(CHAN_LED, dong ? HIGH : LOW);
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_NUT, INPUT_PULLUP); // Điện trở kéo lên bên trong: không nhấn = HIGH, nhấn = LOW
pinMode(CHAN_RELAY, OUTPUT);
pinMode(CHAN_LED, OUTPUT);
datRelay(false);
delay(300);
Serial.println("Nhan nut de bat/tat relay");
}
void loop() {
int muc = digitalRead(CHAN_NUT);
if (muc != mucTho) {
mucTho = muc;
lanDoiCuoi = millis();
soCanhTho++;
}
// Chỉ nhận mức mới khi nó giữ nguyên đủ lâu: các xung nảy ngắn bị bỏ qua
if (millis() - lanDoiCuoi > THOI_GIAN_CHONG_DOI_MS && mucOnDinh != mucTho) {
mucOnDinh = mucTho;
if (mucOnDinh == LOW) {
soLanNhan++;
datRelay(!relayDong);
Serial.printf("Nhan lan %u: relay %s | so lan doi muc tho khi nhan: %u\n", (unsigned)soLanNhan,
relayDong ? "DONG" : "NHA", (unsigned)soCanhTho);
}
soCanhTho = 0; // Bắt đầu đếm lại cho lần đổi mức tiếp theo (nhả hoặc nhấn)
}
}
INPUT_PULLUPbật điện trở kéo lên bên trong: không nhấn đọc HIGH, nhấn đọc LOW.- Mỗi lần mức thô thay đổi, chương trình ghi lại thời điểm. Chỉ khi mức giữ nguyên quá 30 ms nó mới được coi là trạng thái ổn định; nhờ vậy các xung nảy bị bỏ qua và mỗi lần nhấn chỉ đảo relay một lần.
- Biến
soCanhThođếm số lần mức thô đổi trong một lần nhấn: 1 là tiếp điểm không nảy; 3, 5… là tiếp điểm đã nảy. - Hằng
RELAY_KICH_MUC_THAPchọn kiểu module: phần lớn module relay đóng khi IN ở mức thấp. Nếu relay đóng ngay khi cấp điện và nhả khi nhấn nút, đổi hằng này thànhfalse.
Kết quả mong đợi

Mỗi lần nhấn, relay kêu tách và đổi trạng thái, đèn báo trên module và LED xanh trên bo sáng tắt theo. Có lần số đổi mức thô lớn hơn 1: tiếp điểm đã nảy, nhưng nhờ chống dội relay vẫn chỉ đổi một lần. Thử đặt THOI_GIAN_CHONG_DOI_MS bằng 0: thỉnh thoảng một lần nhấn sẽ làm relay đổi hai lần (đóng rồi nhả ngay).
6. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Nhấn nút không có phản ứng | Dùng hai chân luôn nối với nhau của nút tactile | Dùng hai chân chéo nhau; thử bằng thang thông mạch |
| Relay đóng sẵn khi cấp điện | Module kích mức cao nhưng chương trình đặt kích mức thấp (hoặc ngược lại) | Đổi RELAY_KICH_MUC_THAP |
| Đèn báo sáng nhưng relay không kêu | Cuộn relay thiếu nguồn: VCC nối 3V3 thay vì VIN, hoặc tháo jumper JD-VCC | Nối VCC vào VIN (5 V), giữ jumper |
| ESP32 khởi động lại khi relay đóng | Sụt nguồn khi cuộn relay hút, cáp USB dài hoặc yếu | Dùng cáp USB tốt; thêm tụ 100–470 µF giữa VIN và GND |
7. Xem thêm
- Ngắt GPIO trên ESP32: đọc nút nhấn, chống dội.
- ESP32 điều khiển module relay 4 kênh an toàn: COM, NO, NC và an toàn khi đấu tải.
- Chủ đề relay và điều khiển tải trong Góc kỹ thuật.
- Phần tiếp theo của loạt điện tử căn bản: bán dẫn, bắt đầu với diode.
Xem thêm