こんにちは。前回はArduinoでLEDを点滅させる「Lチカ」に挑戦しました。
👉 【Arduino】ブレッドボードに接続したLEDを点滅させる(Lチカ)
今回はその応用として、HC-SR04超音波センサを使って距離を測定し、距離に応じてLEDとブザーで警告する回路を作ってみました。
イメージとしては、車が障害物に接近することで警告を発するパーキングセンサーのような仕組みを想定しています。
スターターキットのチュートリアルを参考にしつつ、理解を定着させるために自分なりに組み立ててみた内容です。
やりたいこと
- 距離が30cmより遠い → 青LED点灯(安全)
- 距離が11〜30cm → 黄LEDが0.5秒周期で点滅(注意)
- 距離が10cm以下 → 赤LEDとブザーが0.1秒周期で点滅(警告)
使用部品
- Arduino Uno
- HC-SR04 超音波距離センサ
- LED(青・黄・赤)
- アクティブブザー
- 抵抗(220Ω × 3)
- ブレッドボード、ジャンパーワイヤー
※各部品の画像は後述の配線写真を参照
回路図・配線写真
ソースコード
#include "SR04.h"
// 各ピン番号を定義
#define TRIG_PIN 12 // HC-SR04のトリガー信号
#define ECHO_PIN 11 // HC-SR04のエコー信号
#define BLUE_LED 2 // 青LED
#define YELLOW_LED 3 // 黄LED
#define RED_LED 4 // 赤LED
#define BUZZER_PIN 5 // アクティブブザー
// グローバル変数の宣言
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN); // センサのインスタンスを作成
long distance; // 測定された距離(cm)
// LEDの点滅制御用のタイマー変数
unsigned long preYellowMillis = 0; // 黄LEDの前回更新時刻
unsigned long preRedMillis = 0; // 赤LEDの前回更新時刻
bool yellowState = false; // 黄LEDの状態(ON/OFF)
bool redState = false; // 赤LEDとブザーの状態(ON/OFF)
void setup() {
Serial.begin(9600); // シリアル通信を開始
// 各出力ピンを設定
pinMode(BLUE_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// 距離を測定
distance = sr04.Distance();
// シリアルモニタに距離を表示
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// 現在の時刻を取得(点滅制御用)
unsigned long currentMillis = millis();
// 距離が30cmより遠い → 緑LEDを点灯(安全)
if (distance > 30) {
digitalWrite(BLUE_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// 距離が10〜30cm → 黄LEDを0.5秒周期で点滅(注意)
else if (distance > 10) {
digitalWrite(BLUE_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
// 0.5秒経過したら黄LEDの状態を反転
if (currentMillis - preYellowMillis >= 500) {
yellowState = !yellowState;
digitalWrite(YELLOW_LED, yellowState);
preYellowMillis = currentMillis;
}
}
// 距離が10cm以下 → 赤LEDとブザーを0.1秒周期で点滅(警告)
else {
digitalWrite(BLUE_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
// 0.1秒経過したら赤LEDとブザーの状態を反転
if (currentMillis - preRedMillis >= 100) {
redState = !redState;
digitalWrite(RED_LED, redState);
digitalWrite(BUZZER_PIN, redState);
preRedMillis = currentMillis;
}
}
delay(200); // 測定の安定化用にdelayする
}
注意点
このコードで使用している SR04.h ライブラリは、Arduino IDEの「ライブラリを管理」からはインストールできませんでした。(見つけきれないだけかもしれませんが・・・)
代わりに、以下の手順でGitHubから手動で導入する必要があります。
- SR04ライブラリのGitHubページ にアクセス
- 「Code」ボタン → 「Download ZIP」でライブラリをダウンロード
- ZIPファイルを解凍
- 解凍したフォルダを Arduino のライブラリフォルダ(例:
Documents/Arduino/libraries)に配置 - Arduino IDEを再起動すると、
#include "SR04.h"が使えるようになります
ライブラリが正しく導入されていないと、コンパイル時に「SR04.hが見つかりません」というエラーが出るので注意してください。
工夫したポイント
- LEDやブザーを点滅させる際に delay() を使わず、代わりに millis() を使って非同期に制御しています。
delayは指定した時間だけArduinoの処理を完全に止めてしまうため、その間は他の処理(センサの測定や別のLED制御など)ができません。
そこで、millis を使って「前回の点滅からどれだけ時間が経ったか」を自分で計算し、一定時間が経過したらLEDやブザーの状態を反転させるというロジックを取り入れました。
動作確認
実際に回路を組んで動作確認を行いました。以下の写真は、コップまでの距離ごとにLEDとブザーが正しく反応しているかを確認した様子です。
-
緑LED点灯(距離31cm以上) → シリアルモニターにも「Distance: 31 cm」と表示されており、境界値が正しく判定されています。

-
黄LED点滅(距離11〜30cm) → メジャーで約15cmを確認。LEDが0.5秒周期で点滅しており、シリアルモニターにも「Distance: 15 cm」と表示されています。

-
赤LED+ブザー点滅(距離10cm以下) → メジャーで約10cmを確認。赤LEDとブザーが0.1秒周期で点滅・鳴動しており、シリアルモニターにも「Distance: 10 cm」と表示されています。

いずれの状態でも、距離と表示・出力が一致しており、境界値の判定もバッチリでした。
おわりに
Lチカから始めて、センサやブザーを組み合わせたことで、 「自分で考えて作る」電子工作の楽しさを実感できました。
次はLCD表示やサーボ連動など、さらに応用してみたいです。 初心者の方にも参考になれば嬉しいです!

