Menu
CoddyTech

FALLING, RISING và CHANGE

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 13 trên 18.

Uno có hai chân có thể kích hoạt ngắt: chân 2 và chân 3. Nút bấm cần dùng ngắt phải được nối với một trong hai chân đó. Bên trong chip, chúng là ngắt 0 và ngắt 1, vì vậy hãy dùng digitalPinToInterrupt() để chuyển chân thành số ngắt. attachInterrupt(3, ...) yêu cầu ngắt 3, nhưng Uno không có ngắt này nên sẽ không có gì xảy ra.

Phần cuối của attachInterrupt() cho biết cần phản ứng với thay đổi nào:

  • FALLING: chân chuyển từ HIGH sang LOW (khi dùng điện trở kéo lên, đây là lúc nhấn nút)
  • RISING: chân chuyển từ LOW sang HIGH (lúc nhả nút)
  • CHANGE: cả hai trường hợp

Với CHANGE, ISR chạy khi nhấn nút và khi nhả nút. Hàm này đọc chân để xác định thao tác nào vừa xảy ra:

void onChange() {
  if (digitalRead(buttonPin) == LOW) {
    // Nút vừa được nhấn
  } else {
    // Nút vừa được thả
  }
}

attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);
challenge icon

Thử thách

Dễ

Nút bấm được nối với chân 3, còn loop() đang bận với một tác vụ chậm. Hãy để đèn LED ở chân 13 sáng hoặc tắt ngay theo nút bấm:

  • trong onChange(), đọc trạng thái nút bấm: LOW bật đèn LED, HIGH tắt đèn
  • gắn onChange() vào chân nút bấm bằng CHANGE

Nhấn Chạy, nhấn giữ rồi thả nút bấm, sau đó nhấn Kiểm tra.

Tự làm thử

const int ledPin = 13;
const int buttonPin = 3;

// Chạy mỗi khi trạng thái chân nút nhấn thay đổi.
void onChange() {
  // Bật đèn LED khi nhấn nút, tắt đèn khi thả nút.
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // Gắn onChange() vào chân nút nhấn tại đây.
}

void loop() {
  // Tác vụ chạy chậm: giữ nguyên.
  Serial.println("working");
  delay(2000);
}
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