BÀI 4: ĐỌC TÍN HIỆU VỚI NÚT NHẤN

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ặc LOW (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

Bước 3: Mở Arduino IDE và thiết lập cấu hình

  1. Mở Arduino IDE.

  2. Vào menu Tools (Công cụ)Board (Bo mạch) → chọn Arduino Uno.

  3. Vào ToolsPort → 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

Mới hơn Cũ hơn