NeoPixel 时钟:组合指针
本课属于 Coddy Arduino 学习旅程的“项目”单元。第 23 课,共 24 课。
时针是红色的。钟面显示 12 个小时,所以小时数是 (now / 3600) % 12:范围是 0 到 11,其中 0 表示 12 点。这已经是一个像素编号了。
现在,指针可能会重合。在 10:24:52,秒针指向像素 10,正好位于时针上方。如果依次绘制,后绘制的指针会盖住先绘制的指针,其中一根就会消失。
也可以混合光线。给每根指针分配一种颜色分量(时针用红色,分针用绿色,秒针用蓝色),再根据每个像素上的指针合成颜色:
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));
}指针重合时,颜色分量会相加:红色和蓝色变成洋红色,绿色和蓝色变成青色,红色和绿色变成黄色。每次循环都会设置所有像素,因此这个循环也取代了 ring.clear()。
挑战
困难添加时针并混合指针:
- 小时数为
(now / 3600) % 12,在对应的像素上绘制 - 在
for循环中构建每个像素:时针所在位置的红色值为 255,分针所在位置的绿色值为 255,秒针所在位置的蓝色值为 255
按下运行:时钟从 10:24:50 开始,秒针和时针的颜色会混合。然后按检查。
亲手试试
#include <Adafruit_NeoPixel.h>
const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);
// 时钟的起始时间,以午夜起经过的秒数表示:10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;
void setup() {
ring.begin();
}
void loop() {
unsigned long now = startTime + millis() / 1000; // 一天中的当前时间,以秒为单位
int seconds = now % 60;
int minutes = (now / 60) % 60;
ring.clear();
ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255)); // 秒针:蓝色
ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0)); // 分针:绿色
ring.show();
delay(100); // 每秒重绘 10 次
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
项目中的所有课
自己练习: Arduino 在线编辑器