Menu
CoddyTech

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() の代わりにもなります。

challenge icon

チャレンジ

難しい

時針を追加して、針を混色します:

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

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

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

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