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にします
Run を押します:時計は10:24:50から始まり、秒針と時針が混色されます。その後、Check を押します。
自分で試してみよう
#include <Adafruit_NeoPixel.h>
const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);
// 時計の開始時刻。午前0時からの経過秒数: 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); // 1秒間に10回再描画する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド