Arduino UNOとリレーで作るスマート照明:超音波センサーで自動ON/OFF
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| 超音波距離センサー HC-SR04 | 1 |
| リレーモジュール(1チャネル以上、アクティブLOW推奨) | 1 |
| 省電力電球(LED電球推奨)+ ソケット・プラグ付きコード | 1セット |
| 5V DCアダプター(Arduino電源用) | 1 |
| ジャンパーワイヤー、ブレッドボード、ドライバー | 適量 |
使用ソフトウェア
- Arduino IDE または Visual Studio 2015+(Arduino拡張)
- NewPingライブラリ(超音波センサー用)
プロジェクト概要

部屋を出ると自動で消灯、戻ると点灯するスマート照明をArduinoで自作します。超音波センサーで人の通過を検知し、リレーでAC100V照明を制御。基本的なArduino知識があれば短時間で実装可能です。
ハードウェア接続
超音波センサー HC-SR04

- VCC → 5V
- Trig → デジタルピン12
- Echo → デジタルピン11
- GND → GND
リレーモジュール

- VCC → 5V
- GND → GND
- IN1 → デジタルピン8
アクティブLOW/ HIGHの確認方法:VCC/GND接続後、INピンを5Vに繋いで反応なければアクティブLOW、GNDに繋いで動作すればアクティブLOW確定。
照明・リレー・コンセントの結線


電球の片側をコンセント直結、もう片側を途中で切断し、リレーのCOMとNO(ノーマルオープン)に接続。リレーOFFで遮断、ONで通電。絶縁はビニールテープまたは熱収縮チューブで確実に。

超音波センサーのノイズ対策と安定読み取り
HC-SR04は時折異常値(0や極端な値)を返します。これを放置すると照明がチカチカします。対策としてメディアンフィルタ(中央値フィルタ)を適用:複数回測定→ソート→中央値を採用。NewPingライブラリに標準搭載されています。
// 7回測定して中央値を取得(単位:μs)
unsigned int echoTime = sonar.ping_median(7);
// cmに変換
unsigned int distance = sonar.convert_cm(echoTime);
// 0(測定不能)なら最大距離として扱う
if (distance == 0) distance = MAX_DISTANCE;
通過検知ロジック
ドア幅の半分を閾値(critical_distance_cms)に設定。この距離内に物体が検知されたら「誰かが通過した」と判定し、物体が閾値外に出るまで待機、その後リレー状態をトグル(ON↔OFF)。静止している人には反応しません。
if (distance < critical_distance_cms) {
while (distance < critical_distance_cms) {
distance = readDistance();
delay(5);
}
state = !state;
digitalWrite(RELAY_PIN, state ? LOW : HIGH); // アクティブLOW前提
}
スケッチ全文
メイン:スマート照明制御
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
#define RELAY_LINE1_PIN 8
#include "NewPing.h"
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
unsigned int critical_distance_cms = 50; // ドア幅/2 目安
bool state = 0;
void setup() {
Serial.begin(9600);
pinMode(RELAY_LINE1_PIN, OUTPUT);
digitalWrite(RELAY_LINE1_PIN, HIGH); // 初期状態:消灯(アクティブLOW)
}
void loop() {
delay(50);
unsigned int distance = readDistance();
Serial.print("Ultrasonic: "); Serial.print(distance); Serial.println("cm");
if (distance < critical_distance_cms) {
while (distance < critical_distance_cms) {
distance = readDistance();
delay(5);
}
state = !state;
if (state) {
Serial.println("Door Open!");
digitalWrite(RELAY_LINE1_PIN, LOW); // 点灯
} else {
Serial.println("Door Closed!");
digitalWrite(RELAY_LINE1_PIN, HIGH); // 消灯
}
}
}
unsigned int readDistance() {
unsigned int distance = sonar.convert_cm(sonar.ping_median(7));
if (distance == 0) distance = MAX_DISTANCE;
return distance;
}
テスト用:超音波センサー読み取り確認
#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() { Serial.begin(115200); }
void loop() {
delay(50);
Serial.print("Ping: "); Serial.print(sonar.ping_cm()); Serial.println("cm");
}
リソース
- Visual Studioプロジェクト(ライブラリ修正済み):GitHub
回路図

製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoで温湿度ロガーを作る – DHT11とEthernetシールドでSDカード記録
- Arduinoで作る全自動植物水やりシステム - 湿度センサーとRTCで最適制御
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- スマート自動靴紐シューズ:発電機能内蔵で実用性抜群
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- 光と音で祝おう:Arduinoで作るDIYバースデープロジェクト
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション