Skip to content
R

Distance

Interfacing HC-SR04 Distance with Raspberry Pi

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 Raspberry Pi

Library

gpiozero by Raspberry Pi Foundation

Preinstalled on Raspberry Pi OS. If missing: sudo apt install python3-gpiozero

Wiring

Component pinRaspberry Pi pinNote
VCCPin 2 (5V)The sensor needs a real 5V supply to hit its rated range — do not power it from 3.3V.
TRIGGPIO23 (Pin 16)Safe to drive directly — Pi GPIOs output 3.3V, which the sensor reads fine as a trigger HIGH.
ECHOGPIO24 (Pin 18)REQUIRED: add a voltage divider (e.g. 1kΩ in series, 2kΩ from the tap to GND) before this pin. Pi GPIOs are NOT 5V-tolerant and the raw ECHO signal can damage them.
GNDPin 6 (GND)Common ground with the 5V supply is required for the divider math to work.

Swipe sideways to see every column →

Python
  • gpiozero's DistanceSensor already handles the trigger pulse, echo timing, and averaging internally — no manual pulseIn-style timing code needed on this board.
  • The Pi's GPIOs are strictly 3.3V — the voltage divider on ECHO in the wiring above is not optional, unlike the Arduino Uno where the sensor and board share a 5V logic level.
  • max_distance is in meters and defaults to 1m in gpiozero; set it to the sensor's real 4m range (as above) if you need longer readings, or tighten it if you only care about close objects and want faster timeouts.

Related Components

Related Guides & Projects