Chạy hàm song song với delay

Xin chào các bạn! Trong cuộc sống, đôi khi chúng ta đang làm một việc gì đó và sẽ có lúc chúng ta phải đợi một khoảng thời gian rồi mới làm tiếp công việc ấy, và khi ấy ta sẽ tận dụng khoảng thời gian ấy để làm một việc khác. Vậy trong arduino ta có thể làm tương tự không, trong khi ta cho chương trình delay thì ta lại cho nó thực hiện một việc gì đó. Đáp án là được, bài viết này sẽ chia sẻ thủ thuật khá hay này.

Cách thực hiện

Chúng ta sẽ tạo một hàm delay khác và ta sẽ sử dụng hàm này thay cho hàm delay của arduino. Trong đó ta sẽ sử dụng millis() để đếm thời gian và sẽ cho nó chạy lặp lại một hàm chứa các lệnh mà ta muốn nó chạy khi delay cho tới khi đếm tới thời gian đích. Nói thẳng ra thì chúng ta sẽ sử dụng Timer ý mà :D. Hiểu rồi thì vào code luôn nha, mà chưa hiểu cũng đọc code luôn, bởi vì có một số bạn đọc code hiểu hơn lời nói mà :)).

Code của hàm

Vì trong arduino đã có hàm delay nên ta sẽ tạo một hàm khác với tên gọi là Delay. Hàm này sẽ gồm 2 phần tử: Thời gian delay và hàm chứa các câu lệnh cần chạy khi delay. Code đây:

void Delay(float delayTime, void (func)()){
    unsigned long endTime = millis() + delayTime;
    while(millis() < endTime)
    {
      func();
      while(millis() < endTime){};  //Xóa dòng này nếu muốn lặp hàm func, giữ nếu muốn chạy hàm func 1 lần.
    }
}

Ví dụ mẫu

Các bạn chỉ cần chuẩn bị 1 con arduino bất kì và ngắm nghía đoạn code sau là được:

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}


void Delay(float delayTime, void (func)()){
    unsigned long endTime = millis() + delayTime;
    while(millis() < endTime)
    {
      func();
      while(millis() < endTime){};  //Xóa dòng này nếu muốn lặp hàm func, giữ nếu muốn chạy hàm func 1 lần.
    }
}
void led()
{
  digitalWrite(13,1);
}
void loop() {
  Serial.println("Cho");
  Delay(2000,led);
  digitalWrite(13,0);
  Serial.println("Ok");
  delay(1000);
}

Sau khi up code và bật serial monitor lên bạn sẽ thấy rằng khoảng thời gian chờ từ lúc in "Cho" tới lúc in"Ok" là khoảng thời gian đèn 13 sáng.

Kết luận

Tuy nhiên hàm này vẫn còn điểm yếu là số lượng lệnh chạy nhiều nhất phụ thuộc vào thời gian delay, nếu bạn không cẩn thận thì sẽ làm lố thời gian delay mất (Vì sao thì quá đơn giản, bạn cứ nghĩ kĩ là sẽ hiểu). Mình hi vọng rằng mẹo vặt mình vừa chia sẻ sẽ giúp ích cho mọi người. Cảm ơn các bạn đã theo dõi, chúc các bạn thành công, sáng tạo, lập trình thật vui và có nhiều phát minh sáng chế thú vị và bổ ích.

lên
22 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

iNut cảm biến - Bài 1: Bước đầu tiến vào thế giới IoT

Xin chào mọi người, cùng với AI thì IoT cũng là một xu thế chắc chắn sẽ phát triển trong cuộc cách mạng công nghiệp 4.0. Ngày trước, khi mới làm quen với các dự án liên quan đến IoT, mọi người thường gặp nhiều khó khăn do phải chuẩn bị gần như mọi thứ từ server tới client và tính ổn định, bảo mật của mô hình cũng khó được đảm bảo. Kể từ khi các nền tảng IoT ra đời thì mọi thứ đã trở nên dễ dàng hơn. Sự đơn giản và tiện lợi khi làm các dự án IoT cũng ngày càng tăng theo dòng phát triển của các nền tảng ấy. Inut Platform chính là một trong những nền tảng như vậy, đây là một nền tảng do người Việt sáng lập nên chắc chắn việc hỗ trợ khi làm dự án sẽ dễ dàng hơn rất nhiều. Chính vì vậy, hôm nay mình xin giới thiệu với các bạn seri bài viết hướng dẫn sử dụng iNut Cảm Biến - Một sản phẩm đa năng của nền tảng iNut.

lên
2 thành viên đã đánh giá bài viết này hữu ích.

Lập trình Arduino không cần viết code - Phần 6: Điều khiển led bằng nút nhấn kiểu 2

Đây là phần 6 của chuỗi bài viết "Lập trình arduino không cần viết code".

- Xem lại phần 5 tại đây

​Ở phần trước, mình đã hướng dẫn lập trình điều khiển led bằng nút nhấn kiểu 1, tuy nhiên kiểu này có 1 điểm yếu là giữ nút thì mới sáng led. Và ở phần này, mình sẽ nói đến kiểu 2 khắc phục nhược điểm trên. Tuy nhiên có thể nó cũng không phải là nhược điểm nếu như bạn cần nó vào 1 việc gì đó.

lên
27 thành viên đã đánh giá bài viết này hữu ích.