B6 – Khử nhiễu khi nhấn nút (Debounce)

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;
}

Leave a Reply

Your email address will not be published. Required fields are marked *