NeoPixel時計:分
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 22/24。
Uno は時刻を認識しません。millis()は電源投入後の経過時間だけを数えます。そのため、スケッチでは書き込まれた時刻から時計を開始し、電源投入後の経過秒数を加算します。最後に、時刻を設定するボタンを追加します。
時刻は、午前0時からの秒数を表す1つの数値として保持します。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分ごとに1ピクセル移動します(minutes / 5)。色は緑で描画されます。
チャレンジ
中級分針を追加します。
- 時計は10:24:50に開始します:午前0時からの秒数で表した
startTime nowはstartTimeに電源投入後の経過秒数を加えた値です- 秒針:
(now % 60) / 5、青 - 分針:
((now / 60) % 60) / 5、緑ring.Color(0, 255, 0)
Runを押します。10:25になると、分針が1目盛り進みます。その後、Checkを押します。
自分で試してみよう
#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秒ごとに1ピクセル
ring.clear();
ring.setPixelColor(secondPixel, ring.Color(0, 0, 255));
ring.show();
delay(100); // 1秒間に10回再描画
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド