検索コード

ESP32-S3 RGB LEDマトリックスインターネット時計プロジェクト - 4つのランダムカラー

ESP32-S3 RGB LEDマトリックスインターネット時計プロジェクト - 4つのランダムカラー

ESP32-S3インターネット時計 ランダムRGBカラー付き

このプロジェクトは、Wi-Fiに接続し、NTPサーバーからローカル時間を同期し、時間をスクロール表示するESP32-S3 RGBマトリックスインターネット時計です。HH:MM組み込まれた8×8 RGB NeoMatrix全体のフォーマット。このバージョンでは、時間、コロン、分がそれぞれ描画されます。ランダムな色すべてのフルスクロールサイクルで選択され、常に変化する動的で遊び心のある時計表示を作り出します。

ESP32-S3インターネット時計アニメーション

この時計がどのように動くか

USB-Cを介してボードに電源を入れると、ESP32-S3はWi-Fiネットワークに接続し、インターネットから現在のローカル時間を取得します。時間は3つの部分に分かれています—時、コロン、分—それぞれの部分はRGBマトリクス上に別々に描画されます。テキストが画面から完全にスクロールすると、新しいランダムな色が次のパスのために選ばれます。

使用したライブラリ

このスケッチは以下のライブラリを使用しています:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

インストールアダフルート ネオマトリックスArduinoライブラリマネージャーから。必要な依存関係としてAdafruit GFX LibraryそしてAdafruit NeoPixel自動的にインストールされます。

重要なユーザー設定

マトリックスデータピン(組み込みRGBマトリックス)

RGBマトリックスは基板上に統合されていますが、データピンはコード内でまだ定義する必要があります。

#define MATRIX_PIN 14

GPIO 14は、ESP32-S3 RGBマトリックスボードで一般的に使用されます。ボードのバリアントが異なるピンを使用している場合は、この値を適宜更新してください。

Wi-Fi SSIDとパスワード(大文字と小文字を区別)

Wi-Fiの認証情報を自分のネットワークの詳細に置き換えてください:

const char* WIFI_SSID     = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";

重要:Wi-Fi SSIDは大文字と小文字を区別するSSIDという名前の"Book"は同じではない"book"大文字と小文字が正確に一致しない場合、ESP32-S3は接続に失敗します。

NTPサーバー、タイムゾーン、および夏時間

時刻同期はインターネットNTPサーバーを使用して行われます:

const char* ntpServer = "pool.ntp.org";

ローカル時間はUTCと夏時間のオフセットを使用して計算されます。

// Toronto-ish: UTC-5, plus 1 hour DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_secUTCオフセット(秒単位)(お住まいの場所に応じて調整してください)
  • daylightOffset_sec: 使用3600DSTがアクティブな場合、または0そうでなければ

これらの設定は、以下を使用して適用されます:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

自動昼夜明るさ

時計は現在の時間に基づいて明るさを自動的に調整します。

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

午後10時から午前6時の間、表示は暗い環境での眩しさを軽減するために暗くなります。昼間は、マトリックスは通常の明るさに戻ります。

ランダムRGBカラーの挙動

RGBカラーの事前定義リストは配列に格納されており、各色は0から255までの範囲の赤、緑、青の値を使用して定義されています。

uint8_t userColors[][3] = {
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {0, 0, 255},    // Blue
  {255, 165, 0},  // Orange
  {255, 0, 255},  // Magenta
  {0, 255, 255},  // Cyan
  {255, 255, 0}   // Yellow
};

すべてのフルスクロールサイクルで:

  • 時間の数字ランダムな色が割り当てられます。
  • Theコロン異なるランダムな色を受け取る
  • 分の桁別のランダムな色を受け取る

これにより、時計の見た目が常に興味深い、絶えず変化する色の組み合わせが生成されます。自分だけのカスタムカラーを作成するには、RGBカラーピッカーツールを使用できます。RGBカラーピッカー.

時間レンダリングロジック

時間は三つの要素に分けられます:

  • 時間: HH
  • コロン: :
  • 分数: MM

各パーツは個別に描かれているため、それぞれ異なる色を持つことができ、すべてのパーツが連動して8×8ディスプレイ全体でスムーズなスクロールアニメーションを形成します。

ランダムカラー生成

色のランダム性を確保するために、スケッチは起動時に未接続のアナログピンを使用して乱数生成器のシードを設定します。

randomSeed(analogRead(0));

これにより、すべてのパワーアップとすべてのスクロールサイクルで色の組み合わせが異なることが保証されます。

デモンストレーション

スケッチをアップロードし、USB-C経由でボードに電源を入れた後:

  • ESP32-S3はあなたのWi-Fiネットワークに接続します。
  • 時間はインターネットから同期されています。
  • 時間が巻き戻っていくHH:MMフォーマット
  • 時間、コロン、分は各サイクルでランダムな色に変わります。
  • ディスプレイは夜間自動的に暗くなります。

ダウンロードとリンク

この記事の下に完全なソースコードが提供されています。この記事の下に便利なツールと参考資料へのリンクがあります。

画像

ESP32 S3 Matrix
ESP32 S3 Matrix
ESP32 S3 Matrix  pin out
ESP32 S3 Matrix pin out
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3_RGB_8x8_matrix-2
ESP32-s3_internet_clock_animation
ESP32-s3_internet_clock_animation
873-ESP32-S3 RGB LED Matrix Internte Clock Project 4 - Random Color
言語: C++
/*
 * =====================================================================================
 * ESP32-S3 インターネット RGB クロック (8x8 マトリックス) - プロジェクト 4 - ランダムカラー
 * =====================================================================================
 * ビデオを視聴 https://youtube.com/shorts/4iWjLiD7fS8
 * 📚⬇️ ダウンロードおよびリソースページ https://robojax.com/RJT838
 * 著者: ジェミニ (AI 思考パートナー) & アフマド・シャムシリ (Robojax.com)
 * 日付: 2026年1月7日
 * 
 * 特徴:
 * 1. WiFi/NTP 時間: インターネット時間サーバーと自動的に同期します。
 * 2. サイクルベースのカラー: 時間が完全に終了した後のみ色が変わります。
 * 3. 自動明るさ: 夜間にLEDの明るさを落とします(ユーザー設定可能)。
 * =====================================================================================
 * 
 * =====================================================================================
 * ESP32-S3 インターネット クロック - マルチカラー要素
 * =====================================================================================
 * 時間の各部分 (HH : MM) がリストから異なるランダムカラーを取得します。
 * フルスクロールサイクルが終了するまで色は変わりません。
 * =====================================================================================
 */
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define MATRIX_PIN 14

 // --- 設定 ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

uint8_t userColors[][3] = {
  {255, 0, 0}, // 赤
  {0, 255, 0}, // 緑
  {0, 0, 255}, // 青
  {255, 165, 0}, // オレンジ
  {255, 0, 255}, // マゼンタ
  {0, 255, 255}, // シアン
  {255, 255, 0} // 黄色
};
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

 // 現在のランダムカラーインデックスを保存するための変数
int hourColorIdx = 0;
int colonColorIdx = 1;
int minColorIdx = 2;

 // --- グローバル ---
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS   + NEO_MATRIX_PROGRESSIVE,
  NEO_RGB           + NEO_KHZ800);

char hourText[3], minText[3];
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

 // 👇 本物の自宅WiFi名とパスワードに置き換えてください
const char* WIFI_SSID     = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";

void updateTimeParts() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;

  snprintf(hourText, sizeof(hourText), "%02d", timeinfo.tm_hour);
  snprintf(minText, sizeof(minText), "%02d", timeinfo.tm_min);

  if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
    matrix.setBrightness(NIGHT_BRIGHTNESS);
  } else {
    matrix.setBrightness(DAY_BRIGHTNESS);
  }
}

void scrollTime() {
  matrix.fillScreen(0);

  int x = scrollX;

 // 1. 描画時間
  matrix.setTextColor(matrix.Color(userColors[hourColorIdx][0], userColors[hourColorIdx][1], userColors[hourColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(hourText);
  x += 12; // 12ピクセル移動(2桁 * 6px)

 // コロンを描く
  matrix.setTextColor(matrix.Color(userColors[colonColorIdx][0], userColors[colonColorIdx][1], userColors[colonColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(":");
  x += 6; // 6ピクセル移動してください

 // 3. 分を描く
  matrix.setTextColor(matrix.Color(userColors[minColorIdx][0], userColors[minColorIdx][1], userColors[minColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(minText);

  matrix.show();
  scrollX--;

 // 合計幅はおおよそ30ピクセルです(HH=12、:=6、MM=12)
  if (scrollX < -30) {
    scrollX = matrix.width();

 // 次のサイクルのために新しいランダムな色を選んでください。
    hourColorIdx = random(0, totalColors);
    colonColorIdx = random(0, totalColors);
    minColorIdx = random(0, totalColors);
  }
}

void setup() {
  Serial.begin(115200);

 // 未接続のアナログピンを使用して乱数生成器をシードする
  randomSeed(analogRead(0));

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  configTime(-5 * 3600, 3600, "pool.ntp.org");
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
}

void loop() {
  if (millis() % 1000 == 0) updateTimeParts();

  if (millis() - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = millis();
    scrollTime();
  }
}

ファイル📁

フリッツィングファイル