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ừHIGHsangLOW(khi dùng điện trở kéo lên, đây là lúc nhấn nút)RISING: chân chuyển từLOWsangHIGH(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);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:LOWbật đèn LED,HIGHtắt đèn - gắn
onChange()vào chân nút bấm bằngCHANGE
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);
}
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