Menu
CoddyTech

Đèn hẹn giờ

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 6 trên 18.

Đèn cầu thang bật sáng khi bạn nhấn nút và tự tắt sau một lúc. Nếu đèn đang sáng mà bạn nhấn nút lần nữa, bộ đếm thời gian sẽ bắt đầu lại.

Việc này cần hai thứ: thời điểm nhấn nút lần cuối và trạng thái đèn đang bật hay tắt. Lưu thời điểm vào một biến unsigned long khi nút được nhấn:

if (digitalRead(buttonPin) == LOW) {
  pressedAt = millis();     // Bắt đầu (hoặc bắt đầu lại) tính thời gian
  lightOn = true;
  digitalWrite(ledPin, HIGH);
}

Sau đó, ở mỗi vòng lặp, kiểm tra thời gian đã trôi qua:

if (lightOn && millis() - pressedAt >= onTime) {
  lightOn = false;
  digitalWrite(ledPin, LOW);
}

Hai phần này không bao giờ phải chờ, nên hệ thống sẽ nhận biết thao tác nhấn vào bất kỳ lúc nào, kể cả khi đèn đang sáng. Nếu dùng delay(2000) sau khi nhấn nút, thao tác nhấn lần thứ hai trong lúc chờ sẽ bị bỏ qua.

challenge icon

Thử thách

Dễ

Lắp đèn cầu thang:

  • nhấn nút thì đèn LED ở chân 13 sáng ngay lập tức
  • 2 giây sau khi nhấn, đèn tự tắt
  • nhấn nút khi đèn đang sáng sẽ bắt đầu lại khoảng thời gian 2 giây

Nhấn Chạy, nhấn nút vài lần, rồi nhấn Kiểm tra.

Tự làm thử

const int ledPin = 13;
const int buttonPin = 2;
const unsigned long onTime = 2000;   // thời gian đèn sáng

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // khi nhấn nút: bật đèn LED và ghi nhớ thời điểm đó

  // khi đã qua onTime kể từ thời điểm đó: tắt đèn LED
}
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