Menu
CoddyTech

Thời gian trong unsigned long

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

Một biến chỉ có thể lưu số đến một giới hạn, tùy theo kiểu dữ liệu của nó. Kiểu int trên Uno lưu được từ -32768 đến 32767. Sau 32,8 giây, giá trị millis() lớn hơn giới hạn đó, và kiểu int cố lưu giá trị này sẽ quay vòng thành một số âm.

Kiểu unsigned không có số âm, nên có thể đạt giá trị cao gấp đôi: kiểu unsigned int lưu được từ 0 đến 65535, tương đương khoảng 65 giây tính bằng mili giây. Vẫn chưa đủ.

Kiểu unsigned long lưu được từ 0 đến 4,294,967,295. Tính bằng mili giây, con số này tương đương hơn 49 ngày, và đây cũng là kiểu dữ liệu mà millis() trả về. Hãy lưu mọi thời điểm bằng kiểu này:

unsigned long now = millis();
unsigned long startTime = 0;

Sketch dùng sai kiểu dữ liệu sẽ chạy được nửa phút rồi gặp lỗi, nên bạn rất dễ bỏ sót bug.

challenge icon

Thử thách

Dễ

Sketch này in thời gian mỗi giây một lần, nhưng sau 32 giây, nó in ra các số âm. Hãy đổi kiểu dữ liệu của now để thời gian vẫn chính xác trong nhiều ngày.

Nhấn Chạy và đợi quá 33 giây để thấy bug, sau đó sửa lỗi và nhấn Kiểm tra.

Tự làm thử

void setup() {
  Serial.begin(9600);
}

void loop() {
  int now = millis();   // Kiểu dữ liệu này không đủ lớn để lưu thời gian: hãy đổi kiểu khác
  Serial.println(now);
  delay(1000);
}
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