Bài 10. Cách sử dụng ngắt ngoài trên ESP8266

Ngắt ngoài trên esp8266 là một tính năng hữu ích cho phép esp8266 phản ứng nhanh chóng với các sự kiện bên ngoài, như thay đổi trạng thái của một chân GPIO, mà không cần kiểm tra liên tục trong vòng lặp chính. Ngắt giúp tiết kiệm tài nguyên và năng lượng của vi xử lý, đồng thời tăng hiệu suất và độ tin cậy của chương trình.

Trong bài viết này, Điện thông minh E-smart sẽ cùng bạn tìm hiểu cách sử dụng ngắt ngoài trên esp8266 nodemcu, cũng như một số lưu ý khi sử dụng ngắt. Chúng ta sẽ cũng thực hiện một ví dụ đơn giản để minh họa cách sử dụng ngắt để đọc giá trị của một nút nhấn.

Ngắt ngoài trên esp8266 - GPIO interrupt esp8266

Cách sử dụng ngắt ngoài trên esp8266 nodemcu

Để sử dụng ngắt ngoài trên esp8266 nodemcu, chúng ta cần thực hiện hai bước chính:

  • Bước 1: Khai báo và định nghĩa hàm ngắt (interrupt handler function), là hàm sẽ được gọi khi có ngắt xảy ra. Hàm ngắt phải có kiểu void và không có tham số và đặt thêm lệnh ICACHE_RAM_ATTR phía trước. Hàm ngắt nên được viết ngắn gọn và tránh các thao tác phức tạp hoặc chậm, như giao tiếp với thiết bị ngoại vi, in ra màn hình, hay delay.
  • Bước 2: Đăng ký ngắt (attach interrupt) cho một chân GPIO cụ thể, bằng cách sử dụng hàm attachInterrupt(). Hàm này có ba tham số: số chân GPIO, hàm ngắt, và kiểu ngắt. Kiểu ngắt là một hằng số chỉ định điều kiện để kích hoạt ngắt, có thể là RISING (từ mức thấp lên cao), FALLING (từ mức cao xuống thấp), CHANGE (thay đổi mức), hoặc LOW (mức thấp).

Ví dụ:

// Khai báo và định nghĩa hàm ngắt
ICACHE_RAM_ATTR void buttonPressed() {
  // Thực hiện các thao tác khi có ngắt
}

// Đăng ký ngắt cho chân GPIO 5, gọi hàm buttonPressed khi có tín hiệu từ mức cao xuống thấp
attachInterrupt(5, buttonPressed, FALLING);

Lưu ý khi sử dụng ngắt GPIO trên esp8266 nodemcu

Khi sử dụng ngắt ngoài trên esp8266 nodemcu, chúng ta cần lưu ý một số điểm sau:

  • Không phải tất cả các chân GPIO đều có thể sử dụng được ngắt. Theo tài liệu của Espressif, chỉ có các chân GPIO 0, 2, 4, 5, 12, 13, 1415 mới có thể sử dụng được ngắt. Các chân GPIO khác có thể gây ra lỗi hoặc không hoạt động như mong muốn khi sử dụng ngắt.
  • Khi sử dụng ngắt, chúng ta cần cẩn thận với các nhiễu điện từ hoặc độ trễ của tín hiệu, có thể gây ra các ngắt giả (false interrupt) hoặc bỏ sót các ngắt thực (true interrupt). Để giải quyết vấn đề này, chúng ta có thể sử dụng các phương pháp như bỏ nhiễu (debounce), lọc tần số (filtering), hoặc xác nhận ngắt (interrupt confirmation).
  • Khi sử dụng ngắt, chúng ta cũng cần tránh các xung đột ngắt (interrupt conflict), là tình huống khi có nhiều ngắt xảy ra cùng một lúc hoặc gần nhau, làm cho vi xử lý không thể xử lý kịp hoặc bị mất ngắt. Để giải quyết vấn đề này, chúng ta có thể sử dụng các phương pháp như ưu tiên ngắt (interrupt priority), khóa ngắt (interrupt lock), hoặc hàng đợi ngắt (interrupt queue).

Ví dụ thực hành: Đọc giá trị của một nút nhấn bằng ngắt ngoài trên esp8266

Trong ví dụ này, chúng ta sẽ sử dụng một nút nhấn kết nối với chân GPIO 0 của esp8266 nodemcu để đọc giá trị của nút nhấn bằng ngắt GPIO. Khi nút nhấn được nhấn, chương trình sẽ in ra màn hình số lần nhấn nút. Chúng ta sẽ sử dụng một biến toàn cục để lưu trữ số lần nhấn nút, và một biến cờ để kiểm tra xem có ngắt xảy ra hay không.

Code mẫu

// Khai báo biến toàn cục
int buttonCount = 0; // Biến lưu trữ số lần nhấn nút
volatile bool buttonFlag = false; // Biến cờ kiểm tra có ngắt xảy ra hay không

// Khai báo và định nghĩa hàm ngắt
ICACHE_RAM_ATTR void buttonPressed() {
  // Tăng biến đếm số lần nhấn nút
  buttonCount++;
  // Đặt biến cờ thành true
  buttonFlag = true;
}

void setup() {
  // Khởi tạo Serial
  Serial.begin(9600);
  // Đăng ký ngắt cho chân GPIO 0, gọi hàm buttonPressed khi có tín hiệu từ mức cao xuống thấp
  attachInterrupt(0, buttonPressed, FALLING);
}

void loop() {
  // Kiểm tra biến cờ
  if (buttonFlag) {
    // In ra số lần nhấn nút
    Serial.print("Button pressed ");
    Serial.print(buttonCount);
    Serial.println(" times");
    // Đặt biến cờ thành false
    buttonFlag = false;
  }
}

Kết quả

Ngắt ngoài trên esp8266 - GPIO interrupt esp8266

Sau khi chúng ta nạp chương trình xong, các bạn sẽ mở cổng Serial Monitor trên Arduino IDE, chỉnh tốc độ baud về 9600 chúng ta tiến hành ấn nút, mỗi lần ấn giá trị biến sẽ tăng lên 1 đơn vị và hiển thị ra cổng Serial Monitor qua giao tiếp UART giữa esp8266 với máy tính.

5/5 - (4 bình chọn)

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo