Hai đèn LED, hai tốc độ
Thuộc phần Định thời không dùng delay trong hành trình Arduino của Coddy. Bài học 4 trên 18.
Với delay(), khiến hai đèn LED nhấp nháy với tốc độ khác nhau là một bài toán hóc búa: mỗi lần chờ đều làm đèn LED kia phải chờ theo. Với millis(), việc này rất dễ vì không có gì phải chờ.
Hãy dùng các biến riêng cho từng tác vụ: một biến lưu thời điểm gần nhất và một biến lưu trạng thái riêng. Sau đó, dùng một câu lệnh if riêng cho mỗi tác vụ trong loop(). Ở mỗi vòng lặp, từng tác vụ kiểm tra đồng hồ riêng và chỉ hoạt động khi đến thời điểm:
unsigned long redPrevious = 0;
unsigned long greenPrevious = 0;
void loop() {
unsigned long now = millis();
if (now - redPrevious >= 500) {
redPrevious = now;
// Chuyển trạng thái đèn LED đỏ
}
if (now - greenPrevious >= 200) {
greenPrevious = now;
// Chuyển trạng thái đèn LED xanh lá
}
}Hai tác vụ không bao giờ cản trở nhau. Bạn có thể thêm tác vụ thứ ba và thứ tư theo cách tương tự: mỗi tác vụ có một bộ biến riêng và một câu lệnh if riêng.
Đừng bao giờ dùng chung một biến lưu thời điểm gần nhất cho hai tác vụ. Tác vụ nhanh hơn đặt lại biến đó thường xuyên đến mức tác vụ chậm hơn không bao giờ đạt đến khoảng thời gian của nó.
Thử thách
DễĐèn LED màu đỏ ở chân 13 đã nhấp nháy mỗi 500 ms. Hãy cho đèn LED màu xanh lá ở chân 12 nhấp nháy mỗi 200 ms cùng lúc:
- thêm các biến
greenPreviousvàgreenState - thêm một câu lệnh
ifthứ hai trongloop()cho đèn LED màu xanh lá
Nhấn Chạy và quan sát cả hai đèn nhấp nháy, sau đó nhấn Kiểm tra.
Tự làm thử
const int redLed = 13;
const int greenLed = 12;
unsigned long redPrevious = 0;
int redState = LOW;
// Thêm hai biến (variable) của đèn LED xanh lá vào đây
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
// Đèn LED đỏ chuyển trạng thái sau mỗi 500 ms
if (now - redPrevious >= 500) {
redPrevious = now;
if (redState == LOW) {
redState = HIGH;
} else {
redState = LOW;
}
digitalWrite(redLed, redState);
}
// Cho đèn LED xanh lá chuyển trạng thái sau mỗi 200 ms tại đây
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Định thời không dùng delay
1millis()
Đồng hồ millis()Thời gian trong unsigned longNhấp nháy không trì hoãnHai đèn LED, hai tốc độNhấp nháy khi nút bấm chuyển trạng tháiĐèn hẹn giờTự luyện tập: Playground Arduino