Bài 9. Cách dùng ngắt timer trên ESP8266 NodeMCU

Ngắt timer trên esp8266 là loại ngắt do sự kiện tràn bộ đếm thời gian gây ra. Ngắt timer cho phép thực hiện các hàm một cách định kỳ mà không phụ thuộc vào delay() hay vòng lặp. 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 dùng ngắt timer trên esp8266 để tạo các bộ đếm hoặc xử lý các sự kiện. 

Ngắt timer trên esp8266 nodemcu

Ngắt timer trên esp8266 là gì?

Ngắt timer trên esp8266 là một chức năng cho phép bạn thực hiện một hành động nào đó sau một khoảng thời gian xác định, bất kể chương trình đang làm gì. Ví dụ, bạn có thể dùng ngắt timer để gửi dữ liệu lên server mỗi 10 phút, hoặc để kiểm tra nhiệt độ mỗi giây. Có hai loại ngắt timer trên esp8266: ngắt timer cứngngắt timer mềm.

1. Ngắt timer cứng

Ngắt timer cứng là ngắt do bộ đếm thời gian (timer) của chíp esp8266 tạo ra. Chíp esp8266 có 2 bộ đếm thời gian: timer0, timer1 trong đó timer0 dùng cho chức năng wifi do vậy chúng ta chỉ dùng được timer1. Mỗi bộ đếm thời gian có một thanh ghi lưu giá trị đếm và một thanh ghi lưu giá trị ngưỡng. Khi giá trị đếm bằng hoặc vượt qua giá trị ngưỡng, bộ đếm thời gian sẽ tạo ra một tín hiệu ngắt và gọi hàm callback tương ứng. Bạn có thể thiết lập các tham số của bộ đếm thời gian như tần số, chế độ (lặp lại hoặc một lần) và hàm callback bằng các hàm của thư viện ESP8266TimerInterrupt.h

2. Ngắt timer mềm

Ngắt timer mềm là ngắt do các thư viện phần mềm tạo ra. Các thư viện này sử dụng các hàm của chíp esp8266 để tạo ra các sự kiện ngắt theo khoảng thời gian xác định. Ví dụ, bạn có thể sử dụng thư viện SimpleTimer.h hoặc Ticker.h để tạo và thiết lập các đối tượng timer với khoảng thời gian lặp lại và gọi hàm callback. Bạn cũng có thể bắt đầu hoặc dừng các timer này bằng các phương thức start()stop(). Bạn cần chạy các timer này trong hàm loop() bằng phương thức run() để kiểm tra xem có cần gọi hàm callback hay không

Cài đặt và sử dụng ngắt timer trên esp8266

1. Ngắt timer cứng

Để sử dụng ngắt timer cứng chúng ta cần cài đặt thư viện ESP8266TimerInterrupt vào Arduino IDE.

Bạn cần khai báo #include <ESP8266TimerInterrupt.h> ở đầu chương trình. Sau đó, bạn cần tạo một đối tượng timer bằng lệnh ESP8266Timer ITimer;. Bạn có thể đặt tên khác cho đối tượng timer nếu muốn.

Để thiết lập timer, bạn cần gọi phương thức attachInterruptInterval(interval, callback) trong hàm setup(). Phương thức này có hai tham số:

  • interval: là khoảng thời gian lặp lại của timer, tính bằng micro giây (us).
  • callback: là hàm sẽ được gọi khi timer kết thúc. Hàm này cần có thuộc tính ICACHE_RAM_ATTR để chạy mã ngắt trong RAM.

Ví dụ, nếu bạn muốn thiết lập ngắt timer trên esp8266 với khoảng thời gian là 1 giây và hàm callback toggleLED, bạn có thể gọi phương thức như sau:

ITimer.attachInterruptInterval(1000000, toggleLED);

Trong hàm callback, bạn có thể viết mã để thực hiện các tác vụ mong muốn khi timer kết thúc. Ví dụ, nếu bạn muốn nhấp nháy LED trên chân D4, bạn có thể viết hàm như sau:

void ICACHE_RAM_ATTR toggleLED() { 
   digitalWrite(D4, !digitalRead(D4)); //đảo trạng thái LED 
}

Trong hàm loop(), bạn không cần làm gì, vì timer sẽ tự động gọi hàm callback khi đến thời điểm ngắt.

Trong code ví dụ sau bạn sẽ thấy LED nhấp nháy với tần số 1 Hz (mỗi giây bật tắt một lần). Bạn có thể thử thay đổi giá trị của interval và đơn vị của timer để xem sự khác biệt trên LED.

#include <ESP8266TimerInterrupt.h> //thư viện ngắt timer phần cứng
#define LED D4 //định nghĩa chân LED
ESP8266Timer ITimer; //tạo đối tượng timer
int interval = 1000000; //khoảng thời gian lặp lại của timer (micro giây)

//hàm callback để nhấp nháy LED
void ICACHE_RAM_ATTR toggleLED() {
  digitalWrite(LED, !digitalRead(LED)); //đảo trạng thái LED
}

void setup() {
  pinMode(LED, OUTPUT); //thiết lập chân LED là OUTPUT
  digitalWrite(LED, LOW); //tắt LED
  ITimer.attachInterruptInterval(interval, toggleLED); //thiết lập timer với khoảng thời gian 1000000 micro giây và hàm callback toggleLED
}

void loop() {
  //không cần làm gì trong hàm loop
}

2. Ngắt timer mềm

Để sử dụng ngắt timer mềm bạn cần tải thư viện SimpleTimer trên Arduino IDE. Sau đó cần khai báo #include <SimpleTimer.h> hoặc #include <Ticker.h> ở đầu chương trình, tùy thuộc vào thư viện bạn đã cài đặt. Sau đó, bạn cần tạo một hoặc nhiều đối tượng timer bằng lệnh SimpleTimer timer; hoặc Ticker timer;. Bạn có thể đặt tên khác cho các đối tượng timer nếu muốn.

Để thiết lập ngắt timer trên esp8266, bạn cần gọi phương thức setInterval(interval, callback) hoặc setTimer(interval, callback, repeat) trong hàm setup(). Phương thức này có ba tham số:

  • interval: là khoảng thời gian lặp lại của timer, tính bằng mili giây (ms).
  • callback: là hàm sẽ được gọi khi timer kết thúc.
  • repeat: là số lần lặp lại của timer. Nếu repeat là 0, timer sẽ lặp lại vô hạn.

Ví dụ, nếu bạn muốn thiết lập ngắt timer trên esp8266 với khoảng thời gian là 1 giây và hàm callback là toggleLED, bạn có thể gọi phương thức như sau:

timer.setInterval(1000, toggleLED); //sử dụng SimpleTimer timer.attach(1, toggleLED); //sử dụng Ticker

Trong hàm callback, bạn có thể viết mã để thực hiện các tác vụ mong muốn khi timer kết thúc. Ví dụ, nếu bạn muốn nhấp nháy LED trên chân D4, bạn có thể viết hàm như sau:

void toggleLED() { 
   digitalWrite(D4, !digitalRead(D4)); //đảo trạng thái LED 
}

Trong hàm loop(), bạn cần chạy các timer bằng phương thức run() (nếu sử dụng SimpleTimer) hoặc không cần làm gì (nếu sử dụng Ticker). Ví dụ:

void loop() { 
  timer.run(); //sử dụng SimpleTimer//không cần làm gì nếu dùng Ticker 
}

Ví dụ 1: Code chớp LED sau mỗi giây dùng thư viện SimpleTimer

#include <SimpleTimer.h> //thư viện ngắt timer phần mềm
#define LED D4 //định nghĩa chân LED
SimpleTimer timer; //tạo đối tượng timer

//hàm callback để nhấp nháy LED
void toggleLED() {
  digitalWrite(LED, !digitalRead(LED)); //đảo trạng thái LED
}

void setup() {
  pinMode(LED, OUTPUT); //thiết lập chân LED là OUTPUT
  digitalWrite(LED, LOW); //tắt LED
  timer.setInterval(1000, toggleLED); //thiết lập timer với khoảng thời gian 1000 mili giây và hàm callback toggleLED
}

void loop() {
  timer.run(); //chạy các timer
}

Ví dụ 2: Code chớp LED sau mỗi giây dùng thư viện Ticker

#include <Ticker.h> //thư viện ngắt timer phần mềm
#define LED D4 //định nghĩa chân LED
Ticker timer; //tạo đối tượng timer

//hàm callback để nhấp nháy LED
void toggleLED() {
  digitalWrite(LED, !digitalRead(LED)); //đảo trạng thái LED
}

void setup() {
  pinMode(LED, OUTPUT); //thiết lập chân LED là OUTPUT
  digitalWrite(LED, LOW); //tắt LED
  timer.attach(1, toggleLED); //thiết lập timer với khoảng thời gian 1 giây và hàm callback toggleLED
}

void loop() {
  //không cần làm gì trong hàm loop
}

Kết luận

Trong bài viết này mình đã giúp các bạn tìm hiểu về chức năng ngắt timer trên esp8266. Ngắt timer thường được dùng trong việc định thời gian lặp đi lặp lại một chức năng cố định như: đọc giá trị cảm biến, hiển thị cập nhật giá trị lên màn hình hoặc truyền dữ liệu lên server.

5/5 - (8 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