Menu
CoddyTech

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()。

challenge icon

挑战

困难

添加时针并混合指针:

  • 小时数为 (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 次
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

项目中的所有课

自己练习: Arduino 在线编辑器