Menu
CoddyTech

Đo bằng micros()

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

millis() đếm số mili giây nguyên, nên không đủ chính xác cho những khoảng thời gian ngắn: một lần nhấn dài 2.5 ms sẽ cho kết quả là 2 hoặc 3. micros() là loại đồng hồ tương tự, nhưng đếm micro giây, tức một phần triệu giây: mỗi mili giây có 1000 micro giây.

Trên Uno, giá trị tăng theo từng bước 4 micro giây và hàm này cũng trả về unsigned long. Để đo thời gian, hãy đọc giá trị trước và sau, rồi lấy hiệu:

unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took);   // khoảng 110: analogRead() mất khoảng 0.1 ms

Vì đếm nhanh như vậy nên micros() hết số sớm hơn nhiều so với millis(): sau khoảng 70 phút, giá trị bắt đầu lại từ 0. Hãy dùng hàm này để đo khoảng thời gian ngắn và dùng millis() cho những khoảng thời gian dài hơn vài phút.

challenge icon

Thử thách

Dễ

Đo thời gian giữ nút, tính bằng micro giây:

  • khi nhấn nút, lưu micros() vào pressedAt
  • khi nhả nút, in ra micros() - pressedAt

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

Tự làm thử

const int buttonPin = 2;

bool wasPressed = false;
unsigned long pressedAt = 0;

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

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;

  if (pressed && !wasPressed) {
    // Nút vừa được nhấn: ghi nhớ thời điểm này
  }

  if (!pressed && wasPressed) {
    // Nút vừa được thả: in ra thời gian giữ nút, tính bằng micro giây
  }

  wasPressed = pressed;
}
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