PIRセンサー連動 インタラクティブLEDマトリクスドアディスプレイ - ホリデーグリーティング
必要なパーツと材料
| パーツ | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | メイン制御(3枚マトリクス制御) |
| Arduino Nano R3 | 1 | 階段センサー・LEDストリップ制御用 |
| PIR人感センサー | 2 | 玄関前用、階段用 |
| 5V リレー | 1 | 12V LEDストリップ制御用 |
| 8×8 NeoPixelパネル (WS2812B) | 3 | 横24×縦8ドットマトリクス構成 |
| RGB LEDストリップ | 1 | 12V、延長コード経由でリレー制御 |
| PC電源ケーブル(5V 30A電源用) | 1 | |
| ジャンパーワイヤー | 1式 |
必要なツール
- はんだごて、ワイヤーストリッパー
プロジェクト概要
3枚の8×8 NeoPixelマトリクス(計192 LED)とPIRセンサーを組み合わせ、訪問者を「Happy Holidays & Happy New Year!」のスクロールテキストで出迎えるドアディスプレイ。無人時はスクリーンセーバーのように多彩なLEDエフェクトを再生します。
2段階センサー構成
- 階段付近(Nano制御): 最初のPIRセンサーが動きを検知 → リレー経由で12V LEDストリップと既存イルミネーションを点灯
- 玄関前(UNO制御): 2番目のPIRセンサーが近接検知 → 3枚マトリクスにテキストスクロール表示
ソフトウェア構成
以下のコードを統合・改造:
- FastLEDライブラリの
DemoReel100例(アイドル時エフェクト) - PIRセンサー検知ロジック
- Adafruit NeoMatrixライブラリによるテキストスクロール表示
Arduino UNO コード(メインディスプレイ制御)
#include <FastLED.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define DATA_PIN 6
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS 192 // 24x8
#define BRIGHTNESS 50
#define FRAMES_PER_SECOND 120
CRGB leds[NUM_LEDS];
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(24, 8, DATA_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
NEO_GRB + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255,0,0), matrix.Color(0,255,0), matrix.Color(0,0,255),
matrix.Color(0,255,255), matrix.Color(255,0,255), matrix.Color(255,255,0), matrix.Color(255,255,255)
};
int pirPin = 5;
bool pirState = true; // 初期状態:動きなし
int textPos = 24; // スクロール開始位置
int colorIdx = 0;
unsigned long lastEffectChange = 0;
void setup() {
delay(3000);
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
matrix.setTextWrap(false);
matrix.setBrightness(40);
matrix.setTextColor(colors[0]);
pinMode(pirPin, INPUT);
}
void loop() {
int val = digitalRead(pirPin);
if (val == HIGH) { // 動き検知 → テキスト表示
matrix.fillScreen(0);
matrix.setCursor(textPos, 0);
matrix.print(F("Happy Holidays & Happy New Year!"));
if (--textPos < -200) { // テキスト幅に合わせてリセット
textPos = matrix.width();
if (++colorIdx >= 7) colorIdx = 0;
matrix.setTextColor(colors[colorIdx]);
}
matrix.show();
delay(100);
if (pirState) pirState = false; // 状態遷移
} else { // 無人時 → エフェクト再生
// FastLED内蔵パターンを順次実行
static uint8_t pattern = 0;
static uint8_t gHue = 0;
switch (pattern) {
case 0: rainbow(); break;
case 1: rainbowWithGlitter(); break;
case 2: confetti(); break;
case 3: sinelon(); break;
case 4: juggle(); break;
case 5: bpm(); break;
case 6: cylon(); break;
}
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
EVERY_N_MILLISECONDS(20) { gHue++; }
EVERY_N_SECONDS(10) { pattern = (pattern + 1) % 7; }
}
}
// 以下、FastLED標準エフェクト関数群(rainbow, confetti, sinelon, bpm, juggle, cylon等)
// DemoReel100例から抜粋・適応
void rainbow() { fill_rainbow(leds, NUM_LEDS, gHue, 7); }
void rainbowWithGlitter() { rainbow(); addGlitter(80); }
void addGlitter(fract8 chance) { if (random8() < chance) leds[random16(NUM_LEDS)] += CRGB::White; }
void confetti() { fadeToBlackBy(leds, NUM_LEDS, 10); leds[random16(NUM_LEDS)] += CHSV(gHue + random8(64), 200, 255); }
void sinelon() { fadeToBlackBy(leds, NUM_LEDS, 20); leds[beatsin16(13, 0, NUM_LEDS-1)] += CHSV(gHue, 255, 192); }
void bpm() { /* 省略 */ }
void juggle() { fadeToBlackBy(leds, NUM_LEDS, 20); for(int i=0;i<8;i++) leds[beatsin16(i+7,0,NUM_LEDS-1)] |= CHSV(i*32,200,255); }
void cylon() { /* 省略 */ }
void fadeall() { for(int i=0;i
回路図

ソーシャルメディア
- Facebook: fb.me/HeathenHacks
- Twitter: @HeathenHacks
- Instagram: @HeathenHacks
製造プロセス
- 自作LUMAZOID:Arduino音楽ビジュアライザーDIYガイド
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- 川の健康を見守る:Arduinoベース水質監視システム「MyRiver」
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Arduino Nanoで作るスマートな動体検知水鉄砲
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- Arduino Nanoで自作オシロスコープ(10Hz〜50kHz)128×64 LCD搭載
- Arduino Nanoで作る8×8 LEDマトリックスのフリップクロック - 自作リアルタイムクロック
- Arduino Unoで8×8 LEDマトリックスを制御:ステップバイステップガイド