
定規を使わずに、手や箱までの距離を測る小さな装置です。距離センサーが耳に聞こえない音を発して反射波を捉え、ESP32が結果をセンチメートル単位で小さなディスプレイに表示します。物体が遠すぎる場合は、測定範囲外であることも知らせます。コウモリが暗闇で周囲を把握する仕組みを、机の上で体験できます。
動画
回路図

ソースコード
Arduino (C++)
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 HC-SR04 Ultrasonic Distance Sensor
4// ─────────────────────────────────────────
5// Triggers the HC-SR04 with a TRIG pulse, computes the distance (cm) from
6// the ECHO time and shows it on a 16x2 I2C LCD every 0.2 s. If no echo
7// comes back, the screen shows "Menzil disinda" (out of range).
8//
9// Pins:
10// GPIO 5 -> HC-SR04 TRIG
11// GPIO 18 -> HC-SR04 ECHO (via a voltage divider)
12// Divider: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13// GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
14// HC-SR04 and LCD VCC -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Pin definitions
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18; // Needs a 1k + 2k voltage divider
22
23// LCD addr 0x27 or 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f; // Speed of sound (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL; // Echo timeout (~5 m)
28
29void setup() {
30 pinMode(TRIG_PIN, OUTPUT);
31 pinMode(ECHO_PIN, INPUT);
32 digitalWrite(TRIG_PIN, LOW);
33
34 // DevKit V1 default I2C pins
35 Wire.begin(21, 22);
36
37 lcd.init();
38 lcd.backlight();
39
40 // Splash screen 3 s
41 lcd.setCursor(3, 0);
42 lcd.print("BlueGrays");
43 lcd.setCursor(1, 1);
44 lcd.print("HC-SR04 v1.0");
45 delay(3000);
46
47 // Main screen
48 lcd.clear();
49 lcd.setCursor(0, 0);
50 lcd.print("Mesafe:");
51}
52
53// Reads the distance in cm, -1 on error
54float readDistanceCm() {
55 // A 10 us TRIG pulse starts a measurement
56 digitalWrite(TRIG_PIN, LOW);
57 delayMicroseconds(2);
58 digitalWrite(TRIG_PIN, HIGH);
59 delayMicroseconds(10);
60 digitalWrite(TRIG_PIN, LOW);
61
62 unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63 if (duration == 0) return -1.0f;
64 // Round trip, so divide by 2
65 return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69 float distance = readDistanceCm();
70
71 // Clear bottom row
72 lcd.setCursor(0, 1);
73 lcd.print(" ");
74 lcd.setCursor(0, 1);
75
76 if (distance < 0) {
77 lcd.print("Menzil disinda");
78 } else {
79 lcd.print(distance, 1); // 1 decimal place
80 lcd.print(" cm");
81 }
82
83 delay(200);
84}
85
よくある質問
ECHOラインに分圧回路を入れるのはなぜですか?▾
HC-SR04は5 Vで動作し、ECHOピンからも5 Vを出力しますが、ESP32の入力が受け付ける電圧は最大3.3 Vです。1 kΩと2 kΩの抵抗で構成した分圧回路で5 Vを約3.3 Vに下げ、ESP32を保護します。
TRIGピンにも分圧回路は必要ですか?▾
いいえ。TRIGはESP32からセンサーへ送る信号です。ESP32の3.3 VのHIGHは、通常HC-SR04で問題なく認識されます。
HC-SR04Pでも分圧回路は必要ですか?▾
HC-SR04PやRCWL-1601などのモデルは3.3 Vで駆動できます。その場合はECHO出力も3.3 Vになるため、分圧回路は不要です。
距離の測定精度を上げるにはどうすればよいですか?▾
音速は温度によって変化します(20 °Cでは約343 m/s)。温度センサーを使って音速を補正し、複数回の測定値の中央値を取ると、精度が向上します。
