External Interrupts
External Interrupts trong Arduino
Interrupts (ngắt) là cơ chế cho phép một chương trình dừng công việc hiện tại để xử lý một sự kiện cụ thể, sau đó quay lại công việc ban đầu. Arduino hỗ trợ external interrupts để phản hồi nhanh với các tín hiệu từ bên ngoài, chẳng hạn như nút nhấn hoặc cảm biến.
1. attachInterrupt()
Mô tả:
- Gắn một hàm xử lý ngắt vào một chân cụ thể.
Cú pháp:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
Giải thích:
digitalPinToInterrupt(pin)
: Chuyển đổi chân digital thành số interrupt (tùy thuộc vào board Arduino).ISR
: Tên hàm sẽ được gọi khi ngắt xảy ra (Interrupt Service Routine).mode
:LOW
: Gọi ISR khi tín hiệu ở mức thấp.CHANGE
: Gọi ISR khi tín hiệu thay đổi (từ LOW sang HIGH hoặc ngược lại).RISING
: Gọi ISR khi tín hiệu chuyển từ LOW sang HIGH.FALLING
: Gọi ISR khi tín hiệu chuyển từ HIGH sang LOW.
Ví dụ:
volatile int counter = 0; // Biến được sử dụng trong ngắt phải là `volatile`.
void setup() {
pinMode(2, INPUT_PULLUP); // Cấu hình chân 2 làm INPUT với PULLUP
attachInterrupt(digitalPinToInterrupt(2), incrementCounter, RISING);
Serial.begin(9600);
}
void loop() {
Serial.println(counter);
delay(1000);
}
void incrementCounter() {
counter++;
}
2. detachInterrupt()
Mô tả:
- Hủy bỏ ngắt trên một chân cụ thể.
Cú pháp:
detachInterrupt(digitalPinToInterrupt(pin));
Giải thích:
- Sau khi gọi
detachInterrupt()
, Arduino sẽ không xử lý ngắt cho chân đó nữa.
Ví dụ:
void setup() {
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), toggleLED, RISING);
pinMode(13, OUTPUT);
}
void loop() {
delay(5000);
detachInterrupt(digitalPinToInterrupt(2)); // Hủy bỏ ngắt sau 5 giây
}
void toggleLED() {
digitalWrite(13, !digitalRead(13));
}
3. digitalPinToInterrupt()
Mô tả:
- Trả về số interrupt tương ứng với một chân digital trên Arduino.
Cú pháp:
int interruptNumber = digitalPinToInterrupt(pin);
Giải thích:
- Sử dụng khi bạn cần biết số interrupt của một chân digital.
Ví dụ:
void setup() {
int interruptNum = digitalPinToInterrupt(2);
Serial.begin(9600);
Serial.print("Interrupt number for pin 2: ");
Serial.println(interruptNum);
}
Tóm tắt bảng
Hàm | Mô tả | Cú pháp |
---|---|---|
attachInterrupt() |
Gắn hàm xử lý ngắt cho một chân. | attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); |
detachInterrupt() |
Hủy bỏ ngắt trên một chân. | detachInterrupt(digitalPinToInterrupt(pin)); |
digitalPinToInterrupt() |
Trả về số interrupt của một chân digital. | int interruptNum = digitalPinToInterrupt(pin); |