NeoPixel時計:時刻を設定する
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 24/24。
時計は常に10:24:50から始まり、1日に1回だけ正確な時刻になります。2つのボタンで時刻を調整できます。ピン2の赤いボタンで時計を1時間進め、ピン3の緑のボタンで分針を1ピクセル分、5分進めます。
時刻は1つの数値なので、設定するには秒を加算します。ボタンで加えた分を変数に保持し、合計に含めます。
unsigned long adjust = 0; // ボタンによって加算された秒数
unsigned long now = startTime + adjust + millis() / 1000;1時間は3600秒、5分は300秒です。ボタンが押されたとき、つまり今回がLOWで前回がHIGHのときに、押された回数を1回として数えます。押している間、毎回加算すると時計がぐるぐる回ってしまいます。このボタンはチャタリングしません。
int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
adjust = adjust + 3600;
}
lastHour = hourState;すべての針はnowから求めるため、すべて連動します。また、余りを使うことで、時は11の後に、分は55の後に折り返します。
チャレンジ
中級時刻を設定できるようにします。
- ピン 2 と 3 は
INPUT_PULLUPにします - ピン 2 を押すと 3600 秒、ピン 3 を押すと 300 秒加算します。ボタンが押されたときに、それぞれ 1 回だけ加算します
- その秒数を
nowに加算します
Run を押して時計を現在の時刻に合わせてから、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;
int hours = (now / 3600) % 12;
int secondPixel = seconds / 5;
int minutePixel = minutes / 5;
int hourPixel = hours;
// 各ピクセルには、時針から赤、分針から緑が割り当てられ、
// 秒針から青が割り当てられるため、針が同じピクセルに重なると色が混ざる。
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.show();
delay(100); // 1秒間に10回再描画する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド