この記事の結論
- HC-SR501の出力をdigitalRead()で受け取り、検知したらLEDを点灯、一定時間後に自動で消灯するナイトライトを作る
- 点灯を維持する時間の管理には、delay()ではなくmillis()を使うと、消灯までの間も次の検知を取りこぼさない
- 基板上の感度・遅延時間つまみと、コード内のmillis()による時間管理は役割が別物、両方を意識して調整する
- 発展として、CdSセルを組み合わせれば「周囲が暗いときだけ動作する」本格的なナイトライトに進化させられる
人感センサー(HC-SR501)の基本的な使い方は、人感・超音波距離センサーの使い方の記事ですでに紹介しました。
この記事では、その知識を土台にして、実際に「人が近づいたらLEDが点灯し、一定時間後に自動で消える」という、廊下や玄関で使えるナイトライトを組み立てながら、実践的なセンサー活用のコツを学んでいきます。
単にセンサーの値を読み取るだけでなく、「点灯を何秒維持するか」という時間の管理をどう実装するかが、この工作のいちばんの見どころです。
このプロジェクトで作るもの、必要な部品
今回作るのは、人が近づくとLEDが点灯し、しばらくすると自動的に消灯する、シンプルなナイトライトです。
必要な部品は、いずれも電子部品店やAmazon・楽天で手に入りやすいものばかりです。
| 部品名 | 型番・規格の目安 | 数量 | 概算価格の目安 |
|---|---|---|---|
| Arduino本体 | Arduino Uno相当 | 1台 | 3,000円前後 |
| 人感センサー | HC-SR501 | 1個 | 200〜400円程度 |
| LED | 5mm程度の砲弾型LED | 1個〜(複数本にも拡張可) | 数円〜数十円程度 |
| 電流制限抵抗 | 220Ω〜330Ω程度 | LEDの数だけ | 数円程度 |
| ブレッドボード | 汎用サイズ | 1枚 | 300〜500円程度 |
| ジャンパー線 | オス-オス | 数本 | 数百円(セット購入が一般的) |
LEDを複数本使えば、廊下の足元を広く照らすナイトライトにも発展させられます。
紹介した商品:ELEGOOエントリー向けArduinoキット
ELEGOO UNO R3基本部品 初心者スターター 互換キット チュートリアル Arduino用
本体・ブレッドボード・LED・抵抗器・ジャンパー線など、エントリーグレードの構成に近い基本部品がまとまったキットです。
Amazon ¥2,999
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
紹介した商品:人感センサーモジュール(HC-SR501)
HC-SR501 人体赤外線感応モジュール
配線ピンが少なく、初めてのセンサーとして扱いやすいモデルです。
Amazon ¥475
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。

HC-SR501の出力を読み取る基本のおさらい
HC-SR501の詳しい仕組みや配線は、人感・超音波距離センサーの使い方の記事で解説していますが、このプロジェクトに必要な範囲だけ、ここでも簡単におさらいします。

配線(VCC/OUT/GND)
HC-SR501は、VCC・OUT・GNDの3本足で構成されており、VCCをArduinoの5Vピンに、GNDをGNDピンに、OUTを任意のデジタル入力ピンにつなぎます。
OUT出力は3.3V、多くの場合はデジタル入力としてそのまま使える
HC-SR501のOUT出力は、HIGHのときでも3.3V程度と、Arduino UnoのロジックレベルであるHIGH(5V)より少し低い電圧です。
Arduino Uno(ATmega328P、5V動作)は、おおよそ3.0V以上をHIGHと判定する仕様のため、多くの場合はそのままdigitalRead()で読み取れます。
ただし判定の境目までの余裕は0.3Vほどしかありません。
配線が長い、電源電圧が下がっているなどで反応が不安定になる場合は、配線を短くするか、レベル変換やトランジスタで5Vに引き上げる方法を検討しましょう。
H/Lジャンパー、リピートトリガかどうかを必ず確認する
HC-SR501の基板には、「H」「L」と書かれた3ピンのジャンパーが付いています。
この記事で紹介するロジックは、検知するたびにlastDetectedTimeを更新し続ける「リピートトリガ」動作を前提にしています。
ジャンパーがH側(リピートトリガ)になっていると、人が動き続けている間はOUTがHIGHを維持し続けますが、L側(ノンリピート/シングルトリガ)だと、遅延時間つまみで決まる時間だけHIGHを出力したあと必ず一度LOWに落ち、そこからさらに約2.5秒程度のブロッキング時間(基板側で固定されており、つまみでは変えられません)は次の検知を受け付けません。
多くの製品は出荷時にH側に設定されていますが、購入したモジュールのジャンパー位置を必ず確認してください。
L側のままだと、この記事の「人が動き続けている間はずっと点灯を維持する」という動作が期待通りになりません。
自動点灯・自動消灯のロジックを組み立てる
ここからが、この記事の本題です。
検知したらLEDを点灯する
まずはシンプルに、digitalRead(sensorPin)がHIGHのときにLEDを点灯させる処理を作ります。
LEDと直列に入れる電流制限抵抗は、5V・一般的な砲弾型LEDであれば220Ω〜330Ω程度が目安です。
紹介した商品:LED 10色セット 200個入り
DiCUNO 発光ダイオード 3mm 10色 透明LEDセット 各20個入り 200個セット
赤・青・緑など10色が揃っているので、音の高さごとに光らせる色を変える演出にも使いやすいセットです。
Amazon ¥749(200個入り)
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
紹介した商品:よく使う値がそろった抵抗器セット
ELEGOO 17値1%抵抗器、0オーム〜1Mオーム(525本)
220Ω・1kΩ・10kΩなど、この記事で紹介した値を含む17種類がまとまった1%精度品です。
Amazon ¥1,500
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
抵抗値の考え方や色・明るさによる選び方の違いは、LEDの選び方の記事で詳しく解説しています。
ここまでなら、HC-SR501の基本的な使い方の延長で、それほど難しくありません。
delay()ではなくmillis()で時間を管理する理由
「検知後30秒間だけ点灯させたい」という処理を、delay(30000);のように書いてしまうと、その30秒間はloop()全体が止まってしまい、次の検知を一切受け付けられなくなります。
この問題を避けるコツは、delay()を使わず、millis()で「経過時間」を管理することです。
millis()は、Arduinoの電源を入れてからの経過時間をミリ秒単位で返し続ける関数で、loop()を止めることなく時間の計測ができます。
「検知した時刻を記録しておき、現在時刻との差が設定時間を超えたら消灯する」という考え方に切り替えることで、点灯中も別の処理(新しい検知)を受け付けられるようになります。
const int sensorPin = 7;
const int ledPin = 8;
const unsigned long litDuration = 30000; // 点灯を維持する時間(ミリ秒)、まずは30秒に設定
unsigned long lastDetectedTime = 0;
bool isLit = false;
void setup() {
pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(sensorPin) == HIGH) {
lastDetectedTime = millis(); // 検知するたびに基準時刻を更新
if (!isLit) {
digitalWrite(ledPin, HIGH);
isLit = true;
Serial.println("検知: LED点灯");
}
}
if (isLit && (millis() - lastDetectedTime > litDuration)) {
digitalWrite(ledPin, LOW);
isLit = false;
Serial.println("時間経過: LED消灯");
}
}
このコードでは、検知するたびにlastDetectedTimeを更新しているため、人が動き続けている間はずっと点灯を維持し、動きが止まってからlitDuration(この例では30秒)経過したタイミングで消灯します。
delay()を使わないことで、点灯中でも新しい検知をきちんと拾い続けられるのが、このロジックのポイントです。

複数LEDを使う場合の配線・コードの拡張
LEDを複数本使いたい場合は、それぞれのLEDに合わせた抵抗を用意し、別々のデジタルピンにつなぎます。
コード側は、digitalWrite(ledPin, HIGH);の行を、使うピンの数だけ並べて書くか、ピン番号を配列にまとめてfor文で一括に処理する方法もあります。
遅延時間・感度つまみの調整のコツ
HC-SR501の基板には、感度と遅延時間を調整できる2つのつまみ(可変抵抗)が付いています。
感度のつまみは反応する距離(目安3〜7m程度)、遅延時間のつまみは検知後にOUTがHIGHを維持する時間(目安3〜5秒から200〜300秒程度、製品ロットにより幅があります)を調整するものです。

基板上の遅延時間つまみと、コード内のlitDuration(millis()による時間管理)は、どちらも「点灯を維持する時間」に関わりますが、役割が異なる2つの調整箇所です。
基板のつまみは「センサーのOUTがHIGHを維持する時間」を決め、コードのlitDurationは「その信号を受けてLEDを何ミリ秒点灯させ続けるか」を決めています。
両方を同時に調整しようとすると意図が混乱しやすいため、まずは基板のつまみを最短側に固定してテストし、コード側のlitDurationだけで点灯時間を調整するとわかりやすくなります。
実際に設置する場所(廊下の幅、人が通る速さ)に合わせて、litDurationの秒数を少しずつ調整しながら試してみてください。
発展、CdSセルと組み合わせて「暗い時だけ」動作させる
ここまでのコードでは、明るい昼間でも人が近づけばLEDが点灯してしまいます。
本物のナイトライトのように「夜だけ動作する」ようにしたい場合は、CdSセル(光センサー)で明るさを読み取る記事で紹介した分圧回路をあわせて配線し、暗いと判定されたときだけ人感センサーの判定を有効にする、という条件を追加します。
紹介した商品:CdSセル(GL5528)
Kaito Denshi(海渡電子) CdSセル 光可変抵抗器 5mm GL5528 10個
明るさで抵抗値が変わる、5mmタイプの定番CdSセル。10個入りで分圧回路の実験にも使えます。
Amazon ¥750(10個入り) / 楽天市場 ¥1,010(10個入り)
※価格は記事執筆時点のものです。購入前に最新価格をご確認ください。
まずconst int darkThreshold = 300;を、スケッチ先頭のlitDurationなどと同じ場所に追加します。
そのうえでloop()の中にint lightValue = analogRead(A0);を追加し、既存のif (digitalRead(sensorPin) == HIGH)の条件を、次のように暗さの判定と組み合わせた形に書き換えます。
const int darkThreshold = 300; // CdSセルの実測値から決める、値が小さいほど暗いと判定
int lightValue = analogRead(A0); // CdSセルの分圧回路からの読み取り
if (lightValue < darkThreshold && digitalRead(sensorPin) == HIGH) {
// 暗い、かつ人を検知した場合だけ点灯処理へ(元のif文の中身をここに移す)
}
if文の条件を「かつ(&&)」でつなぐだけなので、既存のコードへの追加は難しくありません。
暗い時・明るい時のCdSセルの実測値をもとにしきい値(darkThreshold)を決める手順は、CdSセルの記事で紹介している考え方がそのまま使えます。
まとめ:調整パターンの早見表
最後に、このプロジェクトでの調整パターンを表にまとめます。
| やりたいこと | 調整する場所 | 目安 |
|---|---|---|
| 点灯を維持する時間を変える | コード内のlitDuration | 10秒(短め)〜60秒(長め)程度から試す |
| 反応する距離を変える | HC-SR501の感度つまみ | 3〜7m程度の範囲で調整 |
| 夜だけ動作させる | CdSセルのif文条件を追加 | 暗い時・明るい時の実測値からしきい値を決める |
| 照らす範囲を広げる | LEDの本数・配置 | 複数ピンに分けて配線 |
取り組む前に、以下の点がなんとなくつかめているか確認してみてください。
- delay()の代わりにmillis()で時間を管理すると、点灯中も次の検知を取りこぼさないという理由がイメージできている
- 基板上の遅延時間つまみと、コード内のlitDurationは役割が別物という違いの見当がついている
- CdSセルを組み合わせて「暗い時だけ」動作させる条件追加の考え方がだいたいわかっている
millis()を使った時間管理の考え方は、このナイトライトに限らず、複数のセンサーやモーターを同時に扱いたくなったときにも役立つ基本テクニックです。
廊下や玄関で常時稼働させたい場合は、パソコンとの接続を前提にしたUSB給電ではなく、ACアダプタなどでの電源供給も検討したいところです。
Arduinoの電源供給方法の選び方については、電源の選び方の記事で詳しく整理しています。
自由研究のテーマとしても取り組みやすい工作なので、夏休みの作品作りのアイデアとしても検討してみてください。
関連記事
- 関連記事:➔ 人感・超音波距離センサーの使い方
- 関連記事:➔ CdSセル(光センサー)で明るさを読み取る記事
- 関連記事:➔ 自由研究にもできる電子工作テーマ集と安全に楽しむための注意点まとめ


コメント