Trong quá trình làm việc với nút nhấn, trạng thái đọc được nhiều lúc bị lặp lại do tính chất cơ khí của nút nhấn. Vì trạng thái không dứt khoát dẫn đến chương trình có khả năng xử lý sai.
Để loại bỏ việc đọc sai trạng thái và loại nhiễu khi nhấn công tắc, ta có thể dùng hàm đếm thời gian để xử lý.
Sử dụng lại mạch bài nút nhấn.
/* Debounce Mỗi khi nhấn nút, do đặc tính cơ khí nên công tắc đóng/mở không dứt khoát khiến trạng thái đọc được thay đổi liên tục. This example code is in the public domain. // hằng số const int buttonPin = 2; // nút nhấn tại chân 2 const int ledPin = 13; // chân LED của bo UNO // biến số int ledState = HIGH; // trạng thái chân LED int buttonState = LOW; // trạng thái chân gắn nút nhấn int lastButtonState = LOW; // trạng thái trước đó của nút // biến thời gian cần giá trị lớn (theo ms) unsigned long lastDebounceTime = 0; // lưu thời gian trạng thái nút nhấn trước unsigned long debounceDelay = 50; // thời gian khử nhiễu void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); // khởi tạo trạng thái chân LED digitalWrite(ledPin, ledState); } void loop() { // đọc trạng thái chân nút nhấn: int reading = digitalRead(buttonPin); // kiểm tra trạng thái nút nhấn: // nếu trạng thái thay đổi if (reading != lastButtonState) { // lưu thời gian lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // nếu thời gian giữ trạng thái lớn hơn khoảng đã định: // nếu trạng thái đã đổi if (reading != buttonState) { buttonState = reading; // đổi trạng thái đèn theo nút nhấn if (buttonState == HIGH) { ledState = !ledState; } } } // bật đèn theo trạng thái digitalWrite(ledPin, ledState); // lưu trạng thái nút nhấn để chờ lần sau: lastButtonState = reading; }