Menu
CoddyTech

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ó.

challenge icon

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 greenPrevious và greenState
  • thêm một câu lệnh if thứ hai trong loop() 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
}
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Arduino