Menu
CoddyTech

Nhấp nháy khi nút bấm chuyển trạng thái

Thuộc phần Định thời không dùng delay trong hành trình Arduino của Coddy. Bài học 5 trên 18.

Một đoạn code không bao giờ chờ có thể theo dõi một nút bấm và làm đèn nhấp nháy cùng lúc. Mỗi lần lặp (loop) chỉ mất vài micro giây, nên bo mạch kiểm tra nút bấm hàng nghìn lần mỗi giây và nhận biết cả một lần nhấn rất ngắn.

Đèn nhấp nháy dùng mẫu millis(). Nút bấm dùng cách kiểm tra cạnh trong phần Đầu vào: hành động khi nút đang được nhấn và không được nhấn ở lần lặp trước. ! có nghĩa là “không”, nên !wasPressed được hiểu là “đã không được nhấn”.

bool wasPressed = false;

void loop() {
  // Phần nhấp nháy: if (now - previous >= 500) { ... }

  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed && !wasPressed) {
    // Nút vừa được nhấn
  }
  wasPressed = pressed;
}

Đặt cả hai phần trong loop(), phần này nối tiếp phần kia, và không dùng delay() trong cả hai. Nếu đèn nhấp nháy chờ 500 ms, một lần nhấn bắt đầu rồi kết thúc trong lúc chờ sẽ không bao giờ được ghi nhận.

challenge icon

Thử thách

Trung bình

Cho bo mạch thực hiện hai việc cùng lúc:

  • đèn LED đỏ ở chân 13 bật tắt sau mỗi 500 ms, tính giờ bằng millis()
  • mỗi lần nhấn nút, đèn LED vàng ở chân 12 sẽ bật rồi tắt, rồi lại bật

Một lần nhấn nhanh phải hoạt động bất cứ lúc nào, còn khi giữ nút, đèn LED vàng chỉ bật hoặc tắt một lần. Nhấn Chạy, nhấn nhanh nút, rồi nhấn Kiểm tra.

Tự làm thử

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // 1. Dùng millis() để đổi trạng thái đèn LED đỏ sau mỗi 500 ms

  // 2. Mỗi lần nhấn nút, đèn LED vàng sẽ bật hoặc tắt
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Định thời không dùng delay

Tự luyện tập: Playground Arduino