Menu
CoddyTech

Đồng hồ bấm giờ bằng nút

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

Đồng hồ bấm giờ có hai trạng thái, đang chạy và đã dừng, và một lần nhấn sẽ chuyển đồng hồ từ trạng thái này sang trạng thái kia. Đồng hồ đo thời gian theo cách an toàn: lưu millis() ở thời điểm bắt đầu rồi lấy thời điểm kết thúc trừ đi thời điểm đó.

if (!running) {
  running = true;
  startTime = millis();
} else {
  running = false;
  Serial.println(millis() - startTime);
}

Nút được xử lý chống dội giống như nút chọn chế độ: chỉ thao tác khi giá trị đọc thay đổi, rồi chờ 20 ms. Cả hai lần nhấn đều chờ cùng 20 ms, nên khoảng thời gian giữa chúng vẫn chính xác.

LED hiển thị trạng thái: sáng khi đồng hồ bấm giờ đang chạy.

challenge icon

Thử thách

Trung bình

Nút đã được đọc và xử lý chống dội, còn onPress() chạy một lần cho mỗi lần nhấn. Viết onPress():

  • nếu đồng hồ bấm giờ chưa chạy: khởi động đồng hồ, lưu millis() vào startTime và bật LED
  • nếu đồng hồ đang chạy: dừng đồng hồ, tắt LED và in thời gian tính bằng mili giây

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

Tự làm thử

const int ledPin = 13;
const int buttonPin = 2;

bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// Gọi một lần mỗi khi nhấn nút.
void onPress() {
  // chưa chạy: bắt đầu, ghi nhớ thời điểm, bật đèn LED
  // đang chạy: dừng, tắt đèn LED, in ra thời gian tính bằng ms
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // chờ các tiếp điểm ổn định
  }
}
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