RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| NodeMCU ESP8266 ブレークアウトボード | 1 |
| NeoPixel WS2811 LED | 96個 |
| 5V 2.5A スイッチング電源 | 1 |
必要な工具と機材
- はんだごて
- 鉛フリーはんだ
- はんだフラックス
- ニッパー(143mm)
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要


HexMatrixは、三角形ピクセルで構成されるLEDマトリックスです。6つのピクセルで1つの六角形を形成します。FastLEDライブラリの多彩なアニメーション表示に加え、マトリックス上で10セグメント風に0〜9の数字を表示し、IoTクロックとして動作させます。
材料
- ESP8266 または Arduino (Uno/Nano)
- WS2811 LED (96個)
- 5V/2A 電源
- 3Dプリンター(パーツ出力用)
ステップ1: 3Dプリント





- すべてのSTLファイルを3Dプリント: STLファイルとコード
- スクリーン層は白色PLAで出力
ステップ2: 回路接続


- 回路図通りに配線
- GND → マイナス
- Vin → 5V → プラス
- DataIn → ピン2
- 電源線を最終LEDまで延長し、そこにも接続して電圧降下を防止
ステップ3: 注意事項
- Arduinoボード使用時: アニメーション表示のみ可能。時刻表示は不可。
- ESP8266ボード使用時: 時刻表示とアニメーションの両方が可能。
ステップ4: 組み立て
- LEDをスネーク配線(ジグザグ)順に配置
- すべてを組み立て
- LED列の反対側端にあるコネクタをマイコンボードにはんだ付け








ステップ5: プログラミング
- コード: こちら
- 3種類のコード:
HexMatrix.ino,clock1.ino,clock2.ino HexMatrix.ino: アニメーション表示用。どのマイコンでも動作clock1.ino,clock2.ino: ESP8266専用。時刻表示機能付き
HexMatrix.ino (アニメーション版)
- Arduino IDEでコードを開く
- FastLEDライブラリをインストール
- ボードタイプ・ポート選択して書き込み



Clock1 / Clock2 コード (IoTクロック版)
- Arduino IDEでコードを開く
- 色設定を好みに変更可能
// 数字の色 (RGB)
int r = 255;
int g = 255;
int b = 255;
// 背景色 (RGB)
int br = 0;
int bg = 20;
int bb = 10;
- Wi-Fi名とパスワードを設定
const char* ssid = "Wifi_Name";
const char* password = "Password";
- タイムゾーンを設定(日本は UTC+9 = 9.0 * 3600)
// タイムゾーン (秒単位)
int timezone = 9.0 * 3600; // 日本の場合
- ボードタイプをESP8266に設定、ポート選択して書き込み


この他にもFastLEDライブラリのサンプルに多くのアニメーションがあります。
コード
clock1.ino
#include <ESP8266WiFi.h>
#include <time.h>
#include <FastLED.h>
#define LED_PIN 2
#define NUM_LEDS 96
#define BRIGHTNESS 255
#define LED_TYPE WS2811
#define COLOR_ORDER RGB
CRGB leds[NUM_LEDS];
// 数字の色 (RGB)
int r = 255;
int g = 255;
int b = 255;
// 背景色 (RGB)
int br = 0;
int bg = 20;
int bb = 10;
const char* ESP_HOST_NAME = "esp-" + ESP.getFlashChipId();
// Wi-Fi設定
const char* ssid = "Wifi_Name";
const char* password = "Password";
// タイムゾーン (日本は 9.0 * 3600)
int timezone = 9.0 * 3600;
int dst = 0;
WiFiClient wifiClient;
void connectWifi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected!");
Serial.println(WiFi.localIP());
Serial.println();
}
void setup() {
Serial.begin(115200);
delay(500);
connectWifi();
Serial.println();
Serial.println("\n\nNext Loop-Step: " + String(millis()) + ":");
configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print("-------------------------------------------------\n");
Serial.print("Date & Time : ");
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
int hour = p_tm->tm_hour;
int minute = p_tm->tm_min;
if (hour > 12) hour -= 12;
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(p_tm->tm_sec);
background();
// 時刻表示 (0-11時対応)
if (hour == 0 || hour == 12) hour12();
else if (hour == 1) hour1();
else if (hour == 2) hour2();
else if (hour == 3) hour3();
else if (hour == 4) hour4();
else if (hour == 5) hour5();
else if (hour == 6) hour6();
else if (hour == 7) hour7();
else if (hour == 8) hour8();
else if (hour == 9) hour9();
else if (hour == 10) hour10();
else if (hour == 11) hour11();
// 分表示 (0-59分対応)
if (minute == 0) min0();
else if (minute == 1) min1();
else if (minute == 2) min2();
// ... 以下 min59() まで同様
else if (minute == 59) min59();
else if (minute == 60) min60();
FastLED.show();
FastLED.clear();
FastLED.show();
}
// 背景色塗りつぶし
void background() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(br, bg, bb);
}
}
/* 時刻表示用関数 (hour0-hour11, min0-min59) は各LEDインデックスに色を設定するだけの繰り返し処理 */
/* 完全なコードはダウンロードしてご確認ください */
clock2.ino
clock1と同様の構造ですが、背景にpride()アニメーション(レインボーエフェクト)を表示するバージョンです。FastLEDのデモ機能を背景に用いています。
#include <ESP8266WiFi.h>
#include <time.h>
#include <FastLED.h>
#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif
#define DATA_PIN 2
#define LED_TYPE WS2811
#define COLOR_ORDER RGB
#define NUM_LEDS 96
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];
// 数字の色
int r = 255;
int g = 255;
int b = 255;
const char* ESP_HOST_NAME = "esp-" + ESP.getFlashChipId();
const char* ssid = "Wifi_Name";
const char* password = "Password";
int timezone = 9.0 * 3600;
int dst = 0;
WiFiClient wifiClient;
void connectWifi() { /* clock1と同じ */ }
void setup() { /* clock1と同様、FastLED初期化に.setDither追加 */ }
void loop() {
/* clock1と同様の時刻取得・表示ロジック */
pride(); // 背景アニメーション
/* 時刻・分表示関数呼び出し */
FastLED.show();
FastLED.clear();
FastLED.show();
}
// Prideアニメーション (FastLEDデモから移植)
void pride() {
static uint16_t sPseudotime = 0;
static uint16_t sLastMillis = 0;
static uint16_t sHue16 = 0;
uint8_t sat8 = beatsin88(87, 220, 250);
uint8_t brightdepth = beatsin88(341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88(203, 25*256, 40*256);
uint8_t msmultiplier = beatsin88(147, 23, 60);
uint16_t hue16 = sHue16;
uint16_t hueinc16 = beatsin88(113, 1, 3000);
uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis;
sLastMillis = ms;
sPseudotime += deltams * msmultiplier;
sHue16 += deltams * beatsin88(400, 5, 9);
uint16_t brightnesstheta16 = sPseudotime;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
hue16 += hueinc16;
uint8_t hue8 = hue16 / 256;
brightnesstheta16 += brightnessthetainc16;
uint16_t b16 = sin16(brightnesstheta16) + 32768;
uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
bri8 += (255 - brightdepth);
CRGB newcolor = CHSV(hue8, sat8, bri8);
uint16_t pixelnumber = (NUM_LEDS - 1) - i;
nblend(leds[pixelnumber], newcolor, 64);
}
}
/* 時刻・分表示関数はclock1と同一 */
回路図


製造プロセス
- コールドハンダ(冷えハンダ)を防ぐ:適切な熱で産業用電子機器の信頼性を確保
- 鳩時計:歴史、職人技、現代への進化
- Raspberry Pi、PIRセンサー、MQTTで作るモーション制御AWS IoTボタン
- GoPiGo v2をWindows 10 IoT Coreで拡張 - Raspberry Pi 3対応
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- スマートプラントIoT:ArduinoとAzureで作る接続型グリーンハウス
- インフィニティミラー時計:終わりなき美しさと正確な時刻の融合
- はんだ付けプロセス完全ガイド:手順・種類・工具・鉛フリーはんだ
- はんだ付け(ソルダリング)完全ガイド:種類・技術・ステップバイステップ手順
- エキスパートガイド:PCBウェーブはんだ問題のトラブルシューティング
- PCBはんだ付けの種類・技術・必須リソース完全解説