[Arduino cơ bản] Giao tiếp với nút nhấn

Thảo luận trong 'Arduino' bắt đầu bởi VuPhat.MCA, 13/8/19.

  1. VuPhat.MCA

    VuPhat.MCA New Member

    Bài trước chúng ta đã đi tìm hiểu về cách xuất dữ liệu số trên Arduino thông qua ví dụ về chớp tắt LED đơn, Hôm nay chúng ta sẽ cùng tìm hiểu về đầu vào số của Arduino thông qua các ví dụ đơn giản là điều khiển LED bằng nút nhấn.

    Chuẩn bị:
    a) Arduino UNO R3
    b) LED đơn 5mm
    c) Nút nhấn 6x6x5mm
    d) Trở vạch 10k, 220Ω

    Kết nối thiết bị:
    1 chân của nút nhấn được nối với GND, chân còn được kéo lên 5V thông qua trở 10k, đồng thời cũng được nối với chân 4 của Arduino.
    [​IMG]
    Hiện tượng bounce nút nhấn:
    Nút bấm là 1 linh kiện cơ khí, sử dụng kim loại có tính đàn hồi cao để làm tiếp điểm, do đó khi các tiếp điểm tiếp xúc với nhau, sẽ xảy ra hiện tượng các tiếp điểm dao động trước khi ổn định, làm nút nhấn bị bật tắt liên tục thêm vài lần mặc dù người sử dụng nhấn thả chỉ có 1 lần và vấn đề này sẽ gây sai lệch mức logic trong ứng dụng, chúng được gọi là hiện tượng bounce nút nhấn. Hình sau dạng xung tại chân tín hiệu ra của nút nhấn khi chuyển ngưỡng từ mức cao về mức thấp.
    [​IMG]
    Kỹ thuật debounce nút nhấn:
    Debounce là kỹ thuật để giải quyết hiện tượng bounce ở trên, chúng ta có 2 cách là sử dụng software hoặc hardware. Ở đây sẽ giới thiệu cách giải quyết bằng software, cách đơn giản nhất là kiểm tra lại nút nhấn sau khoảng thời gian nhất định để xác nhận lại mức logic (xem chương trình 2), cách phức tạp hơn là sử dụng hàm millis() để debounce (xem chương trình 3).

    Chương trình 1:
    Mã:
    const int btnPin = 4; // Chân đầu vào nút nhấn
    const int ledPin = 8; // Chân đầu ra LED 7 thanh
    
    void setup() {
      // Cấu hình chân LED là đầu ra
      pinMode(ledPin, OUTPUT);
      // Cấu hình chân nút nhấn là đầu vào
      pinMode(btnPin, INPUT);
    }
    
    void loop() {
      // Kiểm tra nếu chân nút nhấn ở mức thấp (tức nút được nhấn)
      if (digitalRead(btnPin) == LOW) {
        // Xuất đèn LED mức cao (Bật LED)
        digitalWrite(ledPin, HIGH);
      } else {
        // Xuất đèn LED mức thấp (Tắt LED)
        digitalWrite(ledPin, LOW);
      }
    }
    
    Chương trình 2:
    Mã:
    const int btnPin = 4; // Chân đầu vào nút nhấn
    const int ledPin = 8; // Chân đầu ra LED 7 thanh
    unsigned char onoff = 0; // Biến lưu trữ trạng thái của LED
    
    void setup() {
      // Cấu hình chân LED là đầu ra
      pinMode(ledPin, OUTPUT);
      // Cấu hình chân nút nhấn là đầu vào
      pinMode(btnPin, INPUT);
    }
    
    void loop() {
      // Kiểm tra nếu chân nút nhấn ở mức thấp (tức nút được nhấn)
      if (digitalRead(btnPin) == LOW) {
        // Kiểm tra lại sau 20ms
        delay(20);
    
        // Nếu chân nút nhấn chắc chắn ở mức thấp
        if (digitalRead(btnPin) == LOW) {
          // Nếu onoff = 0 thì
          if (onoff == 0) {
            // Đảo trạng thái thành onoff = 1
            onoff = 1;
            // Xuất đèn LED mức cao (Bật LED)
            digitalWrite(ledPin, HIGH);
    
          // Ngược lại
          } else {
            // Đảo trạng thái thành onoff = 0
            onoff = 0;
            // Xuất đèn LED mức thấp (Tắt LED)
            digitalWrite(ledPin, LOW);
          }
        }
      
        // Nếu chân nút nhấn còn ở mức thấp thì dừng ở đây
        // Chờ đến khi nào nút nhấn được thả ra
        while (digitalRead(btnPin) == LOW);
      }
    }
    
    Chương trình 3:
    Mã:
    const int btnPin = 4;
    const int ledPin = 8;
    
    unsigned long lastDebounceTime = 0;
    unsigned long debounceDelay = 20;
    
    int btnState;
    int lastBtnState = HIGH;
    unsigned char onoff = 0;
    
    void setup() {
      pinMode(btnPin, INPUT);
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      int reading = digitalRead(btnPin);
    
      if (reading != lastBtnState) {
        lastDebounceTime = millis();
      }
    
      if ((millis() - lastDebounceTime) > debounceDelay) {
        if (reading != btnState) {
          btnState = reading;
    
          if (btnState == LOW) {
            if (onoff == 0) {
              onoff = 1;
              digitalWrite(ledPin, HIGH);
    
            } else {
              onoff = 0;
              digitalWrite(ledPin, LOW);
            }
          }
        }
      }
    
      lastBtnState = reading;
    }
    
    Biên dịch và nạp chương trình vào Board Arduino để xem kết quả!
    Kết quả:
    Quan sát trạng thái của LED khi nhấn nút bấm, chương trình 1 khi bấm giữ LED sẽ sáng, khi nhả ra LED sẽ tắt, chương trình 2 và 3 khi bấm nút thì LED sẽ sáng, khi bấm thêm lần nữa thì LED sẽ tắt.
     
    Last edited: 14/8/19

trang này