Menu
CoddyTech

Đồng hồ NeoPixel: phút

Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 22 trên 24.

Uno không biết giờ trong ngày: millis() chỉ đếm từ lúc bật nguồn. Vì vậy, sketch đặt đồng hồ bắt đầu từ một thời điểm được ghi sẵn trong đó, rồi cộng thêm số giây kể từ lúc bật nguồn. Bước cuối cùng sẽ thêm các nút để chỉnh giờ.

Hãy lưu thời gian dưới dạng một số, biểu thị số giây kể từ nửa đêm. 10:24:50 tương đương với 10 giờ, 24 phút và 50 giây:

const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;
unsigned long now = startTime + millis() / 1000;

UL sau 3600 khiến tổng có kiểu unsigned long. Nếu không có nó, bo mạch sẽ thực hiện phép nhân bằng int, kiểu này chỉ đạt đến 32767, còn 10 nhân 3600 thì vượt quá giới hạn.

Số giây và số phút là số dư, nên mỗi giá trị bắt đầu lại từ 0 khi đạt đến 60:

int seconds = now % 60;
int minutes = (now / 60) % 60;

Kim phút cũng di chuyển một pixel sau mỗi 5 phút, theo minutes / 5, và được vẽ màu xanh lá.

challenge icon

Thử thách

Trung bình

Thêm kim phút:

  • đồng hồ bắt đầu lúc 10:24:50: startTime tính bằng giây kể từ nửa đêm
  • now bằng startTime cộng với số giây kể từ khi bật nguồn
  • kim giây: (now % 60) / 5, màu xanh dương
  • kim phút: ((now / 60) % 60) / 5, màu xanh lá ring.Color(0, 255, 0)

Nhấn Chạy: lúc 10:25, kim phút nhích lên. Sau đó nhấn Kiểm tra.

Tự làm thử

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

void setup() {
  ring.begin();
}

void loop() {
  unsigned long seconds = millis() / 1000;  // Số giây kể từ khi bật nguồn
  int secondPixel = (seconds % 60) / 5;     // Mỗi 5 giây ứng với một điểm ảnh

  ring.clear();
  ring.setPixelColor(secondPixel, ring.Color(0, 0, 255));
  ring.show();
  delay(100);  // Vẽ lại mười lần mỗi giâ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 Dự án

Tự luyện tập: Playground Arduino