Bài 7: Cách viết chương trình không sử dụng hàm delay

Nội dung chính, cần nắm

Thông thường trong chương trình Arduino, khi cần dừng lại để chờ qua 1 khoảng thời gian chúng ta thường sử dụng hàm delay để thực hiện việc chờ này. Tuy nhiên cách làm này gây hao phí thời gian của CPU một cách vô ích, chúng ta không thể vừa dừng lại để chờ, vừa chạy 1 đoạn chương trình khác được.

Kĩ thuật trong bài này sẽ giúp bạn chạy được nhiều đoạn chương trình song song với nhau.

Phần cứng

Lắp mạch

Chương trình

Mục tiêu của đoạn chương trình này là nhấp nháy cùng lúc 2 đèn led, mỗi đèn có chu kì nháy sáng khác nhau.

byte led1 = 5;
byte led2 = 6;
unsigned long time1 = 0;
unsigned long time2 = 0;

void setup()
{
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop()
{
    if ( (unsigned long) (millis() - time1) > 1000 )
    {
        if ( digitalRead(led1) == LOW )
        {
            digitalWrite(led1, HIGH);
        } else {
            digitalWrite(led1, LOW );
        }
        time1 = millis();
    }
    
    if ( (unsigned long) (millis() - time2) > 300  )
    {
        if ( digitalRead(led2) == LOW )
        {
            digitalWrite(led2, HIGH);
        } else {
            digitalWrite(led2, LOW );
        }
        time2 = millis();
    }
}

Phân tích

Đoạn chương trình trên có chức năng kiểm tra các biến thời gian time1, time2 so với giá trị của hàm millis(). Nếu vượt quá thời gian quy định 1000ms với biến time1 và 300ms với biến time2 thì sẽ thay đổi trạng thái đèn led. Nếu với cách làm thông thường chúng ta sẽ viết:

void loop()
{
   if ( digitalRead(led1) == LOW )
   {
        digitalWrite(led1, HIGH);
   } else {
        digitalWrite(led1, LOW );
   }
   delay (700); // giảm thời gian để tổng thời gian chờ của led 1 là 700 + 300 = 1000ms
   
   if ( digitalRead(led2) == LOW )
   {
        digitalWrite(led2, HIGH);
   } else {
        digitalWrite(led2, LOW );
   }
   delay (300);
}

Với cách viết thông thường, chương trình sẽ dừng lại ở hàm delay và chờ ở đó. Trong khi với cách viết dùng hàm millis() như ở trên, chúng ta có thể nhấp nháy nhiều led song song với nhau.

lên
40 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 
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ả

Hướng dẫn làm bài tập Arduino trên Cộng đồng Arudino Việt Nam - Vừa có kiến thức và có điểm cộng đồng

Như các bạn đã biết, hệ thống bài tập của Cộng đồng Arduino Việt Nam đã được ra đời từ đầu năm Bính Thân đến bây giờ, trải qua quá trình thử nghiệm với kết quả là sự hoạt động hoàn hảo của hệ thống. Hôm nay, đại diện cho BQT Arduino, tôi sẽ hướng dẫn các bạn tham gia làm bài tập tại đây. Với các bài tập được chọn lọc kỹ từ ban Kiểm tra viên, các bạn hoàn toàn có thể tin tưởng vào chất lượng và các đề bài mà BQT đưa ra nhé.

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

noInterrupts()

Giới thiệu

Nếu bạn chưa biết Ngắt (interrupt) là gì, vui lòng tham khảo thêm tại bài attachInterrupt().

Khi cần chạy các đoạn chương trình yêu cầu chính xác về thời gian, bạn cần tắt các ngắt để Arduino chỉ tập trung vào xử lý các tác vụ cần thiết và chỉ duy nhất các tác vụ này. Các ngắt chạy nền sẽ không được thực thi sau khi gọi hàm noInterrupts().

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