Mục tiêu bài học
-
Hiểu cách đọc tín hiệu từ nút nhấn bằng
digitalRead()
. -
Biết kết nối nút nhấn với Arduino.
-
Làm quen với hiện tượng "dội phím" và cách xử lý đơn giản (debounce).
1. Nút nhấn (Button) hoạt động như thế nào?
-
Nút nhấn là một công tắc tạm thời: khi nhấn sẽ nối mạch (ON), khi thả ra sẽ ngắt mạch (OFF).
-
Ta có thể đọc trạng thái nút bằng
digitalRead(pin)
:-
Trả về
HIGH
(5V) hoặcLOW
(0V).
-
2. Kết nối mạch với Arduino
Cách nối phổ biến (nút kéo xuống GND - dùng điện trở kéo lên - INPUT_PULLUP):
+5V
│
[R] 10kΩ (nội bộ)
│
[Chân Digital 2] ----[Nút nhấn]---- GND
Lưu ý:
-
Arduino sẽ đọc
HIGH
khi không nhấn (dòng điện qua điện trở kéo lên). -
Khi nhấn → nối GND → đọc được
LOW
.
Hướng dẫn nạp code
Bước 1: Kết nối Arduino Uno với máy tính
-
Sử dụng cáp USB (loại USB A to B, giống cáp máy in).
-
Cắm một đầu vào Arduino Uno, đầu còn lại vào cổng USB của máy tính.
Bước 2: Cài đặt phần mềm Arduino IDE
-
Truy cập: https://www.arduino.cc/en/software
-
Tải về và cài đặt bản phù hợp với hệ điều hành của bạn (Windows, macOS hoặc Linux).
Bước 3: Mở Arduino IDE và thiết lập cấu hình
-
Mở Arduino IDE.
-
Vào menu Tools (Công cụ) → Board (Bo mạch) → chọn Arduino Uno.
-
Vào Tools → Port → chọn đúng cổng COM (thường là COM3, COM4,... tùy máy).
Nếu không thấy cổng COM, hãy kiểm tra driver USB hoặc cài CH340 Driver nếu Arduino dùng chip CH340.
Bước 4: Cài đặt phần mềm Arduino IDE
-
Nhấn nút Upload (mũi tên →) trên thanh công cụ.
-
Quan sát thanh trạng thái, khi hiện "Done uploading" nghĩa là nạp thành công.
3. Code đơn giản đọc trạng thái nút
void setup() {
pinMode(2, INPUT_PULLUP); // Sử dụng điện trở kéo lên nội bộ
pinMode(13, OUTPUT); // LED trên board (chân 13)
}
void loop() {
int buttonState = digitalRead(2);
if (buttonState == LOW) {
digitalWrite(13, HIGH); // Bật LED khi nhấn nút
} else {
digitalWrite(13, LOW); // Tắt LED khi thả nút
}
}
4. Chống dội phím (Debounce cơ bản)
💡 Vấn đề:
-
Khi nhấn/thả nút, tiếp điểm có thể bật/tắt nhiều lần rất nhanh (nhiễu), gây nhấp nháy LED hoặc sai logic.
Giải pháp đơn giản: Thêm delay(50)
để bỏ qua nhiễu
void loop() {
int buttonState = digitalRead(2);
if (buttonState == LOW) {
delay(50); // đợi nhiễu dội hết
if (digitalRead(2) == LOW) { // kiểm tra lại
digitalWrite(13, HIGH);
}
} else {
digitalWrite(13, LOW);
}
}
5. Thử thách cho học viên
-
Thay đổi nút sang chân khác, tự cập nhật code.
-
Sử dụng nút để bật/tắt LED theo kiểu "nhấn 1 lần bật – nhấn lần nữa tắt".
-
Kết hợp thêm
Serial.print()
để hiển thị trạng thái nút.
Nhận xét