Bài 10: Đếm số lần nhấn một button - ButtonStateChange

Nội dung chính, cần nắm

Nếu bạn đã đọc qua Bài 3: Xác định trạng thái của một nút nhấn (button) thì chắc hẳn bạn đã biết cách sử dụng một button. Nhưng đôi khi bạn muốn button của bạn đặc biệt hơn một tí, chẳng hạn như là nhấn vài ba lần thì mới thực hiện chức năng của nó. Để làm được điều này, bạn cần biết được lúc nào button được nhấn và lúc nào button được thả ra, và đếm số lần. Hôm nay, tôi sẽ hướng dẫn bạn giải quyết vấn đề này. Ở nước ngoài, người ta gọi vấn đề này là state change detection hoặc edge detection.

Phần cứng (giống hệt Bài 8)

Lắp mạch

Click vào ảnh để xem kích thước thật và lắp mạch bạn nhé

Lập trình và giải thích

// dùng const đặt trước khi khai báo biến sẽ coi biến này là một hằng số
// Bạn có thể đọc được giá trị biến hoặc thực hiện các phép toán
// Nhưng không thay đổi được giá trị của hằng số này.
const int  buttonPin = 11;// hằng số buttonPin mang giá trị là chân digital được nối với button
const int ledPin = 2;   // hằng số ledPin mang giá trị là chân digital đươc nối với led

// Các biến này có thể thay đổi giá trị được
int buttonPushCounter = 0;   // số lần button được nhấn
int buttonState = 0;         // trạng thái hiện tại của button
int lastButtonState = 0;     // trạng thái trước đó của button

void setup() {
  pinMode(buttonPin, INPUT); // Cài đặt button là INPUT
  pinMode(ledPin, OUTPUT); // Cài đặt đèn LED là OUTPUT

  Serial.begin(9600); //Bật cổng Serial ở baudrate 9600
}


void loop() {
  // đọc giá trị hiện tại của button
  buttonState = digitalRead(buttonPin);

  // so sánh với giá trị trước đó
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      // Nếu trạng thái bây giờ là button đang được nhấn
      // thì hiển nhiên trước đó là button chưa được nhấn (điều kiện trên)
      // chúng ta sẽ tăng số lần nhấn button lên 1
      buttonPushCounter++;
      Serial.println("Dang nhan");
      Serial.print("So lan nhan button la: ");
      Serial.println(buttonPushCounter);
    }
    else {
      // Nếu trạng thái bây giờ là button đang được THẢ
      // thì hiển nhiên trước đó là button đang được nhấn (điều kiện trên)
      // Chúng ta sẽ thông báo là button đang được thả và không làm gì cả
      Serial.println("off");
    }
  }
  // lưu lại trạng thái button cho lần kiểm tra tiếp theo
  lastButtonState = buttonState;
  
  // Đã đếm được số lần nhấn button, bây giờ sẽ là phần sau bao nhiêu 
  // lần thì button sẽ làm đèn sáng
  // Trong ngôn ngữ lập trình Arduino, chúng ta có thêm một phép toán mới
  // đó là phép chia lấy dư (khác với các phép +, -, *, / được học trong trường
  // phép này sẽ trả về phần dư của một phép chia.
  // Ví dụ: 6 % 4 = 2 (% là toán tử) (vì 6 chia 4 = 1 dư 2). Xem thêm tại: http://arduino.vn/reference/modulo
  // Áp dụng:
  // Chẳng hạn, bạn làm button này cứ sau 4 lần bấm sẽ làm đèn led sáng vì bạn làm như sau: 
  // Mới upload code thì đèn sáng do buttonPushCounter = 0. 0 % 4 = 0
  // Sau đó cứ mỗi lần nhấn nút thì buttonPushCounter được tăng lên. 
  //... 1 % 4 = 1 --> tắt
  //... 2 % 4 = 2 --> tắt
  //... 3 % 4 = 3 --> tắt
  //... 4 % 4 = 0 --> bật
  //... 5 % 4 = 1 --> tắt
  //...
  if (buttonPushCounter % 4 == 0) { 
    digitalWrite(ledPin, HIGH);
    Serial.println("Da bat den");
  } else {
   digitalWrite(ledPin, LOW);
  }
 
}
lên
27 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Kết nối mạng cho Intel Galileo từ máy tính laptop (Windows version)

Các bạn sẽ biết được cách kết nối Internet (để cài đặt các gói, để debug, để code, để vào Internet...) từ máy tính laptop của bạn. Thật là chuyên nghiệp phải không nào. Mỗi lần muốn code thì không cần có router, không cần usb tll. Cứ dây LAN gắn vô máy tính là ok ngay!

lên
5 thành viên đã đánh giá bài viết này hữu ích.

Lưu các biến CHỈ ĐỌC với PROGMEM

Trong bài Tiết kiệm RAM trong Arduino?, chúng ta đã biết cách lưu chuỗi hằng vào bộ nhớ FLASH thay cho việc lưu hết bọn chúng vào RAM. Như vậy, một hằng chuỗi có thể được lưu vào bộ nhớ FLASH thay vì lưu vào RAM. Vậy, câu hỏi đặt ra là, những biến hằng khác (hằng số, hẳng mảng, hẳng số thực) có thể được lưu vào FLASH thay vì vào RAM hay không?

Trong thực tế, các biến hằng (trừ hằng chuỗi) hầu hết chỉ tốn vài chục byte để lưu trữ nên RAM, nên chúng ta cũng chưa gặp vấn đề gì trong việc lưu trữ hằng số hay hằng mảng cả. Nhưng thỉnh thoảng, có những lúc, ta phải tìm cách lưu trữ chúng ở một nơi khác, ví dụ Bài 12: Phát nhạc bằng Arduino với một cái loa hoặc buzzer.

Chần chừ gì nữa, biết muốn phám khá khả năng của Arduino - hay không?

lên
8 thành viên đã đánh giá bài viết này hữu ích.