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,并以绿色绘制。
挑战
中等添加分针:
- 时钟从 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 次
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
项目中的所有课
自己练习: Arduino 在线编辑器