Arduino Nút nhấn
Nút nhấn là một thành phần cơ bản và được sử dụng rộng rãi trong nhiều dự án Arduino. Nó không đơn giản như vẻ ngoài của nó (vì đặc tính cơ học và vật lý). Người mới bắt đầu có thể gặp nhiều khó khăn với nó. Hướng dẫn này giúp người mới bắt đầu dễ dàng hơn. Hãy bắt đầu!
※ Lưu ý:
Trước khi trình bày về nút nhấn, chúng tôi muốn lưu ý rằng có hai sai lầm phổ biến mà người mới thường gặp:
- Vấn đề đầu vào nổi:
- Triệu chứng: Khi kết nối một nút với chân đầu vào của Arduino, trạng thái của chân đầu vào là ngẫu nhiên và không khớp với trạng thái nhấn của nút.
- Nguyên nhân: Chân nút KHÔNG được sử dụng điện trở kéo xuống hoặc kéo lên.
- Giải pháp: ⇒ Sử dụng một điện trở kéo xuống hoặc kéo lên cho chân đầu vào. Các chi tiết sẽ được mô tả sau trong bài hướng dẫn này.
- Triệu chứng: Mã trên Arduino đọc trạng thái của nút và nhận diện sự kiện nhấn bằng cách phát hiện sự thay đổi trạng thái (HIGH sang LOW, hoặc LOW sang HIGH). Khi nút thực sự được nhấn đúng một lần, mã Arduino lại phát hiện nhiều lần nhấn thay vì đúng một lần.
- Nguyên nhân: Do đặc tính cơ học và vật lý, khi bạn nhấn một lần nút, trạng thái của chân đầu vào bị chuyển đổi nhanh giữa LOW và HIGH nhiều lần thay vì chỉ một lần.
- Giải pháp: ⇒ Khử nhiễu. Các chi tiết sẽ được mô tả trong Arduino - Nút nhấn - Khử rung hướng dẫn.
Hiện tượng rung nhấp nháy gây sự cố chỉ ở một số loại ứng dụng cần đếm đúng số lần nhấn. Ở một số loại ứng dụng, nó là vô hại.
Phần cứng cần chuẩn bị
| 1 | × | Arduino Uno R3 | ||
| 1 | × | USB 2.0 cable type A/B (for USB-A PC) | ||
| 1 | × | USB 2.0 cable type C/B (for USB-C PC) | ||
| 1 | × | breadboard-mount Button with Cap | ||
| 1 | × | breadboard-mount Button Kit | ||
| 1 | × | Panel-mount Button | ||
| 1 | × | mô-đun nút nhấn | ||
| 1 | × | breadboard | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Thông tin về nút
Nút nhấn, còn được gọi là nút bấm, nút xúc giác hoặc công tắc nhất thời, là một loại công tắc đóng khi nút được ấn và giữ, và mở khi thả ra. Có nhiều loại nút nhấn khác nhau, được phân loại rộng thành hai nhóm:
- PCB-mount push buttons (breadboard-mountable)
- Panel-mount push buttons

Sơ đồ chân
Các nút gắn trên PCB thường có bốn chân.

Tuy nhiên, các chân này được kết nối nội bộ theo từng cặp. Do đó, chúng ta chỉ cần sử dụng hai trong số bốn chân, đó là hai chân không được kết nối nội bộ với nhau.
Có bốn cách (thực ra chỉ là hai cách do đối xứng) để kết nối với nút (xem hình).

Chúng ta chỉ có thể dùng hai chân của một nút nhấn, tại sao nó lại có bốn chân?
Để nó được cố định chắc chắn trên PCB (bảng mạch) nhằm chống lại lực ép.
Các nút gắn trên bảng điều khiển thường có hai chân.

Mô-đun nút nhấn bao gồm một điện trở kéo xuống tích hợp, giúp đảm bảo đầu ra ở mức LOW khi nút chưa được nhấn. Nó có ba chân:
- GND: Kết nối chân này với đất.
- VCC: Kết nối chân này với nguồn cấp 5V hoặc 3,3V.
- OUT: Kết nối chân này với một đầu vào số trên bo mạch Arduino của bạn.
Với cấu hình này, module sẽ xuất ra mức LOW khi nút chưa được nhấn và xuất ra mức HIGH khi nút được nhấn.
Cách hoạt động
- Khi nút bấm không được ấn, chân A không được kết nối với chân B
- Khi nút bấm được ấn, chân A được kết nối với chân B

Arduino - Nút nhấn
Một trong hai chân của nút được kết nối với VCC hoặc GND. Chân còn lại được kết nối với một chân trên Arduino.
Bằng cách đọc trạng thái của chân trên Arduino được cấu hình làm chân vào, ta có thể nhận biết nút có được ấn hay không.
Trạng thái nút và trạng thái đang nhấn
Mối quan hệ giữa trạng thái của nút và trạng thái nhấn phụ thuộc vào cách chúng ta kết nối nút với Arduino và cách thiết lập các chân của Arduino.
Có hai cách để sử dụng một nút với Arduino:
- Một nút nhấn có chân được kết nối với VCC, chân còn lại được kết nối tới một chân của Arduino với điện trở kéo xuống
- Nếu nút được nhấn, trạng thái chân của Arduino là HIGH. Nếu không, trạng thái chân của Arduino là LOW
- Chúng ta PHẢI sử dụng một điện trở bên ngoài.
- Nếu nút được nhấn, trạng thái chân của Arduino là LOW. Nếu không, trạng thái chân của Arduino là HIGH
- Chúng ta có thể sử dụng cả điện trở nội bộ hoặc bên ngoài. Điện trở nội bộ được tích hợp bên trong Arduino, chúng ta chỉ cần thiết lập qua mã Arduino.
※ Lưu ý:
Nếu chúng ta KHÔNG dùng cả hai điện trở kéo xuống và kéo lên, trạng thái của chân input là “nổi” khi nút KHÔNG được nhấn. Điều này có nghĩa trạng thái có thể là HIGH hoặc LOW (không ổn định, không cố định), dẫn tới phát hiện sai.
- Thực hành tồi nhất: khởi tạo chân Arduino làm input (bằng cách sử dụng pinMode(BUTTON_PIN, INPUT)) và KHÔNG sử dụng bất kỳ điện trở kéo xuống/kéo lên bên ngoài nào.
- Thực hành tốt nhất: khởi tạo chân Arduino làm input pull-up nội bộ (bằng cách sử dụng pinMode(BUTTON_PIN, INPUT_PULLUP)). Nó KHÔNG cần dùng bất kỳ điện trở kéo xuống/kéo lên bên ngoài nào.
Để làm cho người mới bắt đầu dễ tiếp cận, bài hướng dẫn này sử dụng phương pháp đơn giản nhất: khởi tạo chân Arduino ở chế độ đầu vào có pull-up nội bộ mà không dùng điện trở bên ngoài. Người mới bắt đầu KHÔNG cần quan tâm đến cách mắc điện trở kéo lên/kéo xuống. Người mới bắt đầu chỉ cần dùng mã Arduino.
Sơ đồ đấu dây
- Sơ đồ đấu nối giữa Arduino và nút gắn trên PCB

This image is created using Fritzing. Click to enlarge image
- Sơ đồ đấu nối giữa Arduino và nút gắn trên bảng điều khiển

This image is created using Fritzing. Click to enlarge image

Cách Lập Trình Cho Nút
- Khởi tạo chân Arduino như một đầu vào có kéo lên nội bộ bằng cách sử dụng hàm pinMode(). Ví dụ, chân 7:
- Đọc trạng thái của chân Arduino bằng cách sử dụng hàm digitalRead().
※ Lưu ý:
Có hai trường hợp sử dụng phổ biến:
- Thứ nhất: Nếu trạng thái đầu vào là HIGH, thực hiện một việc. Nếu trạng thái đầu vào là LOW, thực hiện một việc khác ngược lại.
- Thứ hai: Nếu trạng thái đầu vào được thay đổi từ LOW sang HIGH (hoặc HIGH sang LOW), thực hiện một việc.
Tùy thuộc vào ứng dụng, chúng ta chọn một trong hai trường hợp trên. Ví dụ, trong trường hợp dùng một nút nhấn để điều khiển LED:
- Nếu chúng ta muốn LED được BẬT khi nút được nhấn và TẮT khi nút KHÔNG được nhấn, chúng ta NÊN dùng trường hợp sử dụng thứ nhất.
- Nếu chúng ta muốn LED được bật và tắt xen kẽ mỗi lần nhấn nút, chúng ta NÊN dùng trường hợp sử dụng thứ hai.
Cách phát hiện sự thay đổi trạng thái từ LOW sang HIGH
Mã Arduino
Hướng dẫn từng bước
- Kết nối Arduino với máy tính bằng cáp USB
- Mở Arduino IDE, chọn bo mạch và cổng đúng
- Sao chép đoạn mã dưới đây và mở bằng Arduino IDE
- Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino

- Mở Serial Monitor
- Nhấn và thả nút vài lần
- Xem kết quả trên Serial Monitor:
1 là cao, 0 là thấp.
Giải thích mã nguồn
Bạn có thể tìm lời giải thích ở dòng chú thích của mã Arduino ở phía trên.
Chỉnh sửa mã Arduino
Hãy sửa mã để phát hiện các sự kiện nhấn và thả.
Hướng dẫn từng bước
- Sửa mã như dưới đây
- Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino

- Mở Serial Monitor
- Nhấn nút và sau đó thả ra
- Xem kết quả trên Serial Monitor
※ Lưu ý:
- Ngay cả khi bạn nhấn và thả nút chỉ một lần, đầu ra trên Serial Monitor có thể hiển thị nhiều sự kiện nhấn và thả. Đây là hành vi bình thường của nút. Hành vi này được gọi là “chattering phenomenon”. Bạn có thể tìm hiểu thêm trong Hướng dẫn Debounce nút Arduino.
- Để giúp người mới bắt đầu dễ tiếp cận hơn, đặc biệt khi sử dụng nhiều nút, chúng tôi đã tạo một thư viện có tên ezButton. Bạn có thể tìm hiểu về thư viện ezButton tại đây.
- Sử dụng pinMode(BUTTON_PIN, INPUT) cho mô-đun nút. Nó cho ra LOW khi không được nhấn và HIGH khi được nhấn.
Video Tutorial
Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.
Thách thức bản thân
- Bật LED khi nút được nhấn và tắt LED khi nút không được nhấn.
- Chuyển đổi LED giữa BẬT và TẮT mỗi khi nút được nhấn.
Kiến thức bổ sung
- Nếu cảm biến có trạng thái đóng (kết nối với VCC hoặc GND) hoặc trạng thái mở (không kết nối với bất kỳ thứ gì), bạn cần một điện trở kéo lên hoặc kéo xuống để biến các trạng thái này thành hai trạng thái: THẤP và CAO. Ví dụ, nút nhấn, công tắc, công tắc tiếp xúc từ (cảm biến cửa)...
- Nếu cảm biến có hai mức điện áp được định nghĩa (THẤP và CAO), bạn KHÔNG cần điện trở kéo lên hoặc kéo xuống. Ví dụ, Arduino - Cảm biến chuyển động, Arduino - Cảm biến chạm ...