Menu
CoddyTech

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)。色は緑で描画されます。

challenge icon

チャレンジ

中級

分針を追加します。

  • 時計は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回再描画
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

プロジェクトのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド