Menu
CoddyTech

Khử dội nút nhấn

Thuộc phần Đầu vào trong hành trình Arduino của Coddy. Bài học 6 trên 22.

Nút trong bài học này là nút thật, còn chương trình khởi đầu là bộ đếm của bạn từ bài học trước. Chạy chương trình rồi nhấn nút một lần: số đếm tăng hơn một đơn vị.

Bên trong nút có hai tiếp điểm kim loại. Khi chúng chạm nhau, chúng nảy: trong khoảng một mili giây, chúng chạm nhau, bật ra rồi lại chạm nhau. Khi nhả nút cũng vậy. loop() đọc chân nhiều lần trong khoảng một mili giây đó và tính mỗi lần nảy như một lần nhấn.

Giải pháp này gọi là khử dội: khi giá trị đọc thay đổi, xử lý thay đổi đó một lần, rồi đợi khoảng 20 ms để các tiếp điểm ổn định trước khi đọc lại. Người dùng không bao giờ nhận ra khoảng 20 ms.

if (reading != lastReading) {
  if (reading == LOW) {
    presses++;
    Serial.println(presses);
  }
  delay(20);
}
lastReading = reading;

Hãy đợi sau mỗi lần thay đổi, không chỉ sau khi nhấn: khi nhả nút, tiếp điểm cũng nảy, và mỗi lần nảy trong lúc nhả trông như một lần nhấn mới.

challenge icon

Thử thách

Trung bình

Sửa bộ đếm để mỗi lần nhấn chỉ được tính một lần:

  • khi reading khác lastReading, hãy tính nếu đó là một lần nhấn (LOW), sau đó chờ 20 ms
  • tiếp tục lưu lastReading ở cuối loop()

Nhấn Chạy, nhấn nút vài lần và theo dõi số đếm, sau đó nhấn Kiểm tra.

Tự làm thử

const int buttonPin = 2;

int presses = 0;
int lastReading = HIGH;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int reading = digitalRead(buttonPin);
  if (reading == LOW && lastReading == HIGH) {
    presses++;
    Serial.println(presses);
  }
  lastReading = reading;
}
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 Đầu vào

Tự luyện tập: Playground Arduino