Skip to content
E

Distance

Interfacing HC-SR04 Distance with ESP32

What is the HC-SR04?

The HC-SR04 measures distance by timing how long it takes a 40kHz ultrasonic pulse to bounce off an object and return. You send it a short trigger pulse, it fires eight ultrasonic bursts, and the ECHO pin stays high for exactly as long as the round trip took — convert that time to distance and you're done. No library is strictly required since the whole protocol is just two GPIO pins and a stopwatch.

It's a great first sensor for obstacle avoidance, parking sensors, liquid-level gauges, and non-contact proximity switches. The catch that trips people up most is voltage: the sensor runs on 5V and its ECHO pin outputs a 5V pulse, which will drive a 3.3V-only board's GPIO out of spec. Every board below except the 5V-native Arduino Uno needs a simple voltage divider on ECHO — see the per-board wiring notes.

Specifications

Operating voltage
5 V DC
Operating current
~15 mA
Measuring range
2cm to 400cm
Accuracy
±3mm
Measuring angle
~15° effective beam angle
Ultrasonic frequency
40 kHz
Trigger pulse width
10 µs TTL pulse to start a measurement
Interface
Digital trigger/echo pulse pair — no library or bus protocol required

Pinout

PinNameDescription
1VCCPower, 5V DC
2TRIGTrigger input — send a 10µs HIGH pulse to start a measurement
3ECHOEcho output — goes HIGH for the duration of the ultrasonic round trip. Outputs at VCC level (5V) regardless of board voltage.
4GNDGround

Swipe sideways to see every column →

TRIG is a standard input and is safe to drive from a 3.3V GPIO — most boards read a 3.3V HIGH as a valid trigger. ECHO is the pin that causes problems: it always swings up to the sensor's 5V supply rail, so wiring it straight into a 3.3V-only GPIO (ESP32, Raspberry Pi, STM32) risks damaging that pin over time. Use a simple resistor voltage divider on ECHO — 1kΩ in series with the signal and 2kΩ from the tap point to GND works well — to bring the HIGH level down to a safe ~3.3V before it reaches a 3.3V board.

Variants

HC-SR04
~$1–3
HY-SRF05
~$2–4
JSN-SR04T
~$3–6
US-100
~$3–5

The plain HC-SR04 is the default choice for indoor, dry, breadboard-range projects. If the sensor needs to live outdoors or in a tank, use the waterproof JSN-SR04T instead — same trigger/echo timing concept, but check its longer minimum range before swapping it in. If you want native 3.3V operation without a voltage divider, the US-100 is the more forgiving pick.

Setting Up HC-SR04 with ESP32

Library

None — uses built-in pulseIn() by Arduino core

No installation needed — TRIG/ECHO timing uses only digitalWrite(), digitalRead(), and pulseIn(), all part of the standard Arduino API.

Wiring

Component pinESP32 pinNote
VCC5V (VIN)The sensor needs a real 5V rail to reach its rated range — power it from VIN/5V, not 3V3.
TRIGGPIO5Safe to drive directly from a 3.3V GPIO — the sensor reads a 3.3V HIGH as a valid trigger.
ECHOGPIO18REQUIRED: add a voltage divider (e.g. 1kΩ in series, 2kΩ from the tap to GND) before this pin — ECHO swings to 5V and will exceed the ESP32's 3.3V-only GPIO rating without it.
GNDGNDCommon ground with the 5V supply is required for the divider math to work.

Swipe sideways to see every column →

C++
  • Do not skip the voltage divider on ECHO. It's a resistor divider, not a library setting, so there's nothing in code that protects the pin — the protection has to be in the wiring.
  • If you're running Wi-Fi/BLE at the same time, pulseIn() will occasionally return 0 during heavy radio activity because it briefly blocks interrupts; the retry-next-loop pattern above handles that fine for most projects.
  • For time-critical or interrupt-driven distance sensing, consider attaching a hardware interrupt to ECHO and timing it with micros() instead of pulseIn(), which is a blocking call.

Related Components

Related Guides & Projects