Menu
CoddyTech

Vòng lặp bỏ lỡ một lần nhấn

Thuộc phần Định thời không dùng delay trong hành trình Arduino của Coddy. Bài học 12 trên 18.

Bản sketch đôi khi bận thực hiện một tác vụ chậm hoặc một lệnh delay() kéo dài. Vòng lặp chỉ đọc nút bấm giữa các tác vụ sẽ bỏ lỡ một lần nhấn bắt đầu rồi kết thúc trong lúc đang thực hiện một tác vụ.

Ngắt sẽ giải quyết vấn đề đó: khi một chân thay đổi, bo mạch dừng việc đang làm, chạy một hàm bạn chọn rồi tiếp tục. Chip tự theo dõi chân đó, ngay cả trong lúc chạy delay().

void onPress() {
  digitalWrite(ledPin, HIGH);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

attachInterrupt() nhận ba thứ: ngắt dành cho chân đó (digitalPinToInterrupt(buttonPin) tìm ngắt này), hàm cần chạy và thời điểm chạy. FALLING là thời điểm chân chuyển từ HIGH sang LOW: với điện trở kéo lên, đó là lúc nút được nhấn xuống.

Hàm này được gọi là hàm phục vụ ngắt, viết tắt là ISR. Hãy giữ hàm ngắn gọn: không dùng delay() và không dùng Serial.

challenge icon

Thử thách

Dễ

Báo động này chỉ kiểm tra nút bấm 2 giây một lần, nên thao tác nhấn nhanh sẽ bị bỏ lỡ. Hãy làm cho đèn LED sáng ngay khi nhấn:

  • viết một ISR, onPress(), để bật đèn LED
  • trong setup(), gắn ISR vào chân nút bấm với FALLING

Giữ nguyên tác vụ chậm trong loop(). Đèn LED vẫn sáng sau khi nhấn, giống như một báo động. Nhấn Chạy, chạm vào nút bấm, rồi nhấn Kiểm tra.

Tự làm thử

const int ledPin = 13;
const int buttonPin = 2;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // gắn ngắt tại đây
}

void loop() {
  // tác vụ chạy chậm: giữ nguyên như hiện tại
  Serial.println("working");
  delay(2000);

  // đoạn này chỉ kiểm tra nút một lần mỗi 2 giây,
  // nên sẽ bỏ lỡ thao tác nhấn nhanh
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(ledPin, HIGH);
  }
}
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 Định thời không dùng delay

Tự luyện tập: Playground Arduino