工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

部品と材料

部品 数量
Arduino UNO 1
NodeMCU ESP8266 ブレークアウトボード 1
NeoPixel WS2811 LED 96個
5V 2.5A スイッチング電源 1

必要な工具と機材

アプリとオンラインサービス

プロジェクト概要

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

HexMatrixは、三角形ピクセルで構成されるLEDマトリックスです。6つのピクセルで1つの六角形を形成します。FastLEDライブラリの多彩なアニメーション表示に加え、マトリックス上で10セグメント風に0〜9の数字を表示し、IoTクロックとして動作させます。

材料

ステップ1: 3Dプリント

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

ステップ2: 回路接続

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

ステップ3: 注意事項

ステップ4: 組み立て

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

ステップ5: プログラミング

HexMatrix.ino (アニメーション版)

  1. Arduino IDEでコードを開く
  2. FastLEDライブラリをインストール
  3. ボードタイプ・ポート選択して書き込み

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

Clock1 / Clock2 コード (IoTクロック版)

  1. Arduino IDEでコードを開く
  2. 色設定を好みに変更可能
// 数字の色 (RGB)
int r = 255;
int g = 255;
int b = 255;

// 背景色 (RGB)
int br = 0;
int bg = 20;
int bb = 10;
  1. Wi-Fi名とパスワードを設定
const char* ssid = "Wifi_Name";
const char* password = "Password";
  1. タイムゾーンを設定(日本は UTC+9 = 9.0 * 3600)
// タイムゾーン (秒単位)
int timezone = 9.0 * 3600;  // 日本の場合
  1. ボードタイプをESP8266に設定、ポート選択して書き込み

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

この他にも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と同一 */

回路図

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

RGB HexMatrix IoTクロック – ダイナミック六角形LEDディスプレイ

製造プロセス

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