pitagoever gửi vào
- 100130 lượt xem
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
- Arduino Uno
- Breadboard
- Dây cắm breadboard
- 2 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm)
- 2 đèn LED siêu sá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.