Step-by-step Guide: Building a Low-cost Ultrasonic Distance Sensor for Raspberry Pi

Ever tried to measure the distance to a coffee mug on your desk and got nothing but guesswork? A cheap ultrasonic sensor can turn that guess into a precise number, and you can hook it up to a Raspberry Pi in under an hour. I first tried this for a garage‑door‑open‑alert project, and the moment the Pi shouted “2.3 meters” I knew I had to share the recipe. Below is the exact path I followed, with the little tricks that saved me time and money.

What You Need (and Why It’s Cheap)

ItemTypical CostReason
HC‑SR04 ultrasonic module$2‑3The workhorse that sends and receives sound bursts
Raspberry Pi (any model with GPIO)$5‑10 for a Zero WProvides the processing power
Breadboard + jumper wires$2‑4Makes wiring painless and reusable
5 V power supply for PiAlready in most kits
Optional: 0.1 µF capacitor$0.10Tames the noisy power line

All of these parts are available from online hobby stores or local electronics markets. The total bill stays well under $15, which is why I call it low‑cost.

Understanding the HC‑SR04

The HC‑SR04 works like a tiny bat. It sends a 40 kHz sound pulse (the Trig pin) and then listens for the echo (the Echo pin). The time it takes for the echo to return is proportional to the distance. The formula is simple:

distance (cm) = (echo_time µs) / 58

Why 58? Sound travels at roughly 340 m/s, which works out to 58 µs per centimeter for the round‑trip. No need to memorize the physics; the code will handle it.

Wiring the Sensor to the Pi

1. Power Connections

  • Connect VCC on the HC‑SR04 to the Pi’s 5 V pin (pin 2 or 4).
  • Connect GND to any ground pin (pin 6, 9, 14, 20, 25, 30, 34, 39).

2. Signal Pins

  • Trig goes to GPIO 23 (physical pin 16). You can pick another pin, just adjust the code.
  • Echo goes to GPIO 24 (physical pin 18). The Echo line swings up to 5 V, which the Pi’s 3.3 V GPIO cannot tolerate directly. Use a simple voltage divider: two resistors, 1 kΩ and 2 kΩ, in series between Echo and ground. Tap the junction and feed that to GPIO 24. This drops the voltage to about 3.3 V.

3. Optional Smoothing

If you notice erratic readings, solder a 0.1 µF capacitor across VCC and GND on the sensor. It smooths out the supply spikes caused by the Pi’s USB devices.

The Software Part

Installing the Libraries

Open a terminal on your Pi and run:

sudo apt update
sudo apt install python3-pip
pip3 install RPi.GPIO

RPi.GPIO is the standard library for accessing the Pi’s pins from Python.

The Python Script

Create a file called ultrasonic.py and paste the following:

import RPi.GPIO as GPIO
import time

# Pin definitions
TRIG = 23
ECHO = 24

GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

def measure():
    # Send a 10 µs pulse to trigger
    GPIO.output(TRIG, False)
    time.sleep(0.05)          # settle
    GPIO.output(TRIG, True)
    time.sleep(0.00001)       # 10 µs
    GPIO.output(TRIG, False)

    # Wait for echo start
    while GPIO.input(ECHO) == 0:
        start = time.time()

    # Wait for echo end
    while GPIO.input(ECHO) == 1:
        end = time.time()

    # Compute distance
    elapsed = end - start
    distance_cm = (elapsed * 34300) / 2   # speed of sound 34300 cm/s
    return distance_cm

try:
    while True:
        dist = measure()
        print(f"Distance: {dist:.1f} cm")
        time.sleep(1)
except KeyboardInterrupt:
    print("\nStopped")
finally:
    GPIO.cleanup()

A few notes:

  • The time.sleep(0.05) gives the sensor a moment to settle after power‑up.
  • The while loops wait for the echo line to change state. In a noisy environment you might add a timeout to avoid hanging forever.
  • The speed of sound is set to 343 m/s (or 34 300 cm/s). If you work in a very hot or cold room, you can tweak that number, but for most indoor projects the default is fine.

Run it with python3 ultrasonic.py. You should see a steady stream of distance values. Point the sensor at a wall, move your hand, and watch the numbers change.

Debugging Tips From My Workshop

  1. No readings at all? Double‑check the voltage divider on Echo. A common mistake is swapping the resistor positions, which leaves the pin at 5 V and trips the Pi’s protection.
  2. Fluctuating numbers – Make sure the sensor isn’t picking up reflections from nearby objects. A small piece of foam taped behind the sensor can dampen stray echoes.
  3. Too slow – The HC‑SR04 can only handle one measurement every ~60 ms. If you need faster updates, consider the newer MB‑1010 LV-MaxSonar, but that bumps the price up.

Extending the Project

Now that you have a reliable distance reading, the sky’s the limit:

  • Parking assistant: Mount the sensor on a bike rack and use the Pi to flash an LED when a car gets too close.
  • Water level monitor: Place the sensor above a tank and log the level to a cloud service.
  • Smart trash can: Detect when the bin is full and send a notification to your phone.

All of these ideas reuse the same wiring and code, only the logic after the measure() call changes.

Wrapping Up

Building a low‑cost ultrasonic distance sensor for a Raspberry Pi is a perfect entry point for anyone who wants to blend hardware with a bit of Python. The parts are cheap, the wiring is straightforward, and the code fits on a single page. Most importantly, you get instant, tangible feedback – something that keeps the hobby alive.

Give it a try, tinker with the parameters, and let the sensor become the eyes of your next DIY project. Happy hacking!

Reactions