Menu
CoddyTech

NeoPixel 时钟:分钟

本课属于 Coddy Arduino 学习旅程的“项目”单元。第 22 课,共 24 课。

Uno 不知道当前时间:millis() 只会从通电时开始计数。因此,草图会将时钟设为写入其中的时间,再加上通电后经过的秒数。最后一步会添加按钮来设置时间。

用一个数字表示时间,也就是午夜以来经过的秒数。10:24:50 表示 10 小时、24 分钟和 50 秒:

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

3600 后面的 UL 会让总和成为 unsigned long 类型。如果没有它,开发板会用 int 进行乘法运算,数值上限是 32767,而 10 乘以 3600 会超出这个范围。

秒和分钟都是余数,因此每当达到 60,就会从 0 重新开始:

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

分针还会每过 5 分钟移动一个像素,即 minutes / 5,并以绿色绘制。

challenge icon

挑战

中等

添加分针:

  • 时钟从 10:24:50 开始:startTime 表示从午夜开始计算的秒数
  • now 是 startTime 加上通电后经过的秒数
  • 秒针:(now % 60) / 5,蓝色
  • 分针:((now / 60) % 60) / 5,绿色 ring.Color(0, 255, 0)

点击运行:到 10:25 时,分针会前进一步。然后点击检查。

亲手试试

#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;  // 通电后经过的秒数
  int secondPixel = (seconds % 60) / 5;     // 每 5 秒对应一个像素

  ring.clear();
  ring.setPixelColor(secondPixel, ring.Color(0, 0, 255));
  ring.show();
  delay(100);  // 每秒重绘 10 次
}
quiz icon自我测试

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

项目中的所有课

自己练习: Arduino 在线编辑器