Menu
CoddyTech

Đồng hồ NeoPixel: kết hợp kim đồng hồ

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

Kim giờ có màu đỏ. Mặt đồng hồ hiển thị 12 giờ, nên giờ là (now / 3600) % 12: từ 0 đến 11, trong đó 0 là 12 giờ. Giá trị đó đã là số pixel rồi.

Bây giờ các kim có thể gặp nhau. Lúc 10:24:52, kim giây nằm ở pixel 10, ngay trên kim giờ. Khi vẽ lần lượt, kim thứ hai che mất kim thứ nhất và một kim biến mất.

Thay vào đó, ánh sáng có thể hòa trộn. Gán cho mỗi kim một thành phần màu riêng (đỏ cho giờ, xanh lá cho phút, xanh dương cho giây), rồi tạo từng pixel dựa trên các kim nằm tại đó:

for (int i = 0; i < pixelCount; i++) {
  int r = 0;
  int g = 0;
  int b = 0;
  if (i == hourPixel) {
    r = 255;
  }
  if (i == minutePixel) {
    g = 255;
  }
  if (i == secondPixel) {
    b = 255;
  }
  ring.setPixelColor(i, ring.Color(r, g, b));
}

Khi các kim gặp nhau, các thành phần màu cộng lại: đỏ và xanh dương tạo thành màu đỏ tươi, xanh lá và xanh dương tạo thành màu lục lam, đỏ và xanh lá tạo thành màu vàng. Mỗi pixel đều được thiết lập trong mỗi lượt, nên vòng lặp cũng thay thế ring.clear().

challenge icon

Thử thách

Khó

Thêm kim giờ và phối màu các kim:

  • giờ được tính bằng (now / 3600) % 12, hiển thị trên điểm ảnh đó
  • dựng từng điểm ảnh trong vòng lặp for: màu đỏ có giá trị 255 nếu kim giờ ở đó, màu xanh lá có giá trị 255 cho kim phút, màu xanh dương có giá trị 255 cho kim giây

Nhấn Chạy: đồng hồ bắt đầu lúc 10:24:50, với kim giây và kim giờ trùng nhau. 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);

// Thời điểm đồng hồ bắt đầu, tính bằng giây kể từ nửa đêm: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

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

void loop() {
  unsigned long now = startTime + millis() / 1000;  // Thời gian trong ngày, tính bằng giây
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // Kim giây: màu xanh dương
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // Kim phút: màu xanh lá
  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