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
36 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

Vòng đeo tay hỗ trợ người mù

Dự án là một vòng đeo tay hỗ trợ cho người mù có trọng lượng khá nhẹ chỉ khoảng 65g, có thể sạc pin khi hết, sử dụng cảm biến khoảng cách hc-sr04 và những thứ sẵn có xung quanh chúng ta. Mình mong muốn đóng góp sản phẩm này với hy vọng, nó sẽ sẽ giúp người mù đi lại được tốt hơn bằng việc thông báo cho họ âm thanh hoặc rung động khi đến gần vật cản. Với một chút kiến thức về Arduino bất cứ ai cũng có thể làm được điều này. Thiết bị dễ dàng đeo và tháo ra khỏi tay một cách nhanh chóng. Các bạn cùng chiêm ngưỡng nhé!

lên
14 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

detachInterrupt()

Hàm detachInterrupt() sẽ tắt các ngắt đã được kích hoạt tương ứng với thông số truyển vào. Giả sử sau khi nhấn nút bấm lần đầu tiên đèn led sẽ tắt nhưng nhấn lần thứ 2 đèn sẽ không tắt nữa. Lúc này cần dùng đến detachInterrupt() để tắt ngắt chúng ta đã tạo ra.

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

"Dấu hiệu nhận biết" của Cộng đồng Arduino Việt Nam - Gây quỹ cộng đồng

Cũng đã hơn 1 năm kể từ ngày Cộng đồng Arduino Việt Nam của chúng ta ra đời, và đây cũng là lúc tri ân đến các thành viên tích cực trong cộng đồng và cũng là lúc đẩy Cộng đồng Arduino Việt Nam lên một bước phát triển mới.

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