Đồ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().
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
}
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
3Cảm biến đỗ xe
Cảm biến đỗ xe: khoảng cáchCảm biến đỗ xe: đènCảm biến đỗ xe: tiếng bípCảm biến đỗ xe: màn hình6Đồng hồ NeoPixel
Đồng hồ NeoPixel: giâyĐồng hồ NeoPixel: phútĐồng hồ NeoPixel: kết hợp kim đồng hồĐồng hồ NeoPixel: đặt giờTự luyện tập: Playground Arduino