HC-SR04 Ultrasonic Distance Sensor
Complete engineering manual covering physical operating principles, pinout architecture, circuit schematics, non-blocking Arduino/ESP32 code, and troubleshooting.

What is the HC-SR04 Ultrasonic Sensor?
The HC-SR04 is an acoustic distance measuring sensor operating on the principle of echolocation (Time of Flight). It incorporates an ultrasonic transmitter that emits a burst of 40 kHz acoustic energy, and an ultrasonic receiver that detects the reflected sound waves bouncing back from an object in its field of view.
Operating over a detection range of 2 cm to 400 cm with a theoretical resolution of 3 mm, the HC-SR04 is a cornerstone in robotics obstacle avoidance, automated liquid tank level monitoring, parking assist sensors, and automated contactless industrial measurement systems.
Key Technical Specifications
Measurement Range
Detects targets reliably between 2 cm and 400 cm with up to 3 mm precision.
5V Operating Voltage
Operates on standard 5V DC with a modest 15 mA active current draw.
15° Effective Cone
Conical acoustic beam pattern offers focused forward obstacle sensing.
50 ms Refresh Cycle
Capable of taking up to 20 distance readings per second without signal overlap.
Direct GPIO Interface
Requires only two digital pins (Trigger input and Echo output) for interfacing.
Non-Contact Measurement
Unaffected by surface optical color or transparent glass/plastic targets.
Components Required
| Component | Quantity | Engineering Purpose |
|---|---|---|
| HC-SR04 Ultrasonic Module | 1x | Primary physical environmental sensing module |
| Arduino Uno R3 or ESP32 DevKit | 1x | Microcontroller for ADC sampling and digital processing |
| Solderless Breadboard (830 tie-points) | 1x | Prototyping circuit layout and common power rail distribution |
| Jumper Wires (Male-to-Male, Male-to-Female) | 6x | Interconnecting microcontroller GPIO, power, and ground |
| Decoupling Capacitor (100nF Ceramic) | 1x | Filtering power rail high-frequency switching transient noise |
| Pull-up / Current Limiting Resistor (10kΩ / 220Ω) | 1x | Level conditioning and bus stability |
Pin Configuration & Connection Diagram
VCC
5V DC power supply input. Connect to regulated 5V on the microcontroller board.
Trig
Trigger input pin. Apply a 10 microsecond HIGH pulse to initiate sound burst.
Echo
Echo output pin. Emits a HIGH pulse whose duration matches sound transit time.
GND
Common 0V ground return path. Connect directly to MCU ground rail.
| Sensor Pin | Arduino Uno | ESP32 Node | Signal Description |
|---|---|---|---|
| VCC | 5V | VIN (5V external) | 5V DC supply line. Note: Standard HC-SR04 fails to trigger reliably below 4.5V. |
| GND | GND | GND | Common electrical ground return. |
| Trig | Digital Pin 9 | GPIO 5 | Digital output from microcontroller to sensor trigger. |
| Echo | Digital Pin 10 | GPIO 18 (via 2:1 divider) | Digital input to MCU. For 3.3V MCUs, use 1kΩ/2kΩ voltage divider to prevent overvoltage. |
Electrical Best Practices & Noise Mitigation:
- When wiring the HC-SR04 Ultrasonic, ensure power leads are kept short to minimize stray loop inductance and inductive bounce during rapid current draw changes.
- If using an analog sensor output with a 3.3V microcontroller like an ESP32 or STM32, verify the maximum sensor output does not exceed 3.3V. If operating from a 5V supply, insert a 2:1 resistive voltage divider (e.g. 2kΩ / 1kΩ) on the signal line.
- Place a 100nF ceramic capacitor across the sensor VCC and GND pins as close to the module package as physically possible to shunt high-frequency ripple generated by nearby motors, servos, or Wi-Fi transients.
Working Principle & Mathematical Modeling
Acoustic Time of Flight & Physics Modeling
The transmitter transducer converts electrical energy into mechanical acoustic vibrations via a piezoelectric crystal excited at its mechanical resonant frequency (40 kHz). The sound propagates through air at the acoustic speed of sound: approximately 343 m/s at 20°C (68°F).
The speed of sound in air varies with temperature according to the formula: c = 331.3 + (0.606 × T), where T is temperature in °C. Because the acoustic pulse travels to the target and back, the total distance traveled is twice the physical target distance.
Standard Distance Calculation Equations:
Speed of Sound (at 20°C): c = 343 m/s = 0.0343 cm/µs
One-Way Distance (cm) = (Echo Pulse Width in µs × 0.0343) / 2
Simplified Integer Division: Distance (cm) = Echo Pulse Width in µs / 58.2
Distance in Inches: Distance (inches) = Echo Pulse Width in µs / 148
Note: For high-precision applications, fuse an ambient temperature reading from a DHT22 or BMP280 into the calculation formula to eliminate ambient thermal drift.
Arduino & ESP32 Implementation Code
// Production-Grade Non-Blocking HC-SR04 Driver
// Platform: Arduino Uno / ESP32 (volt-X Lab Implementation)
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const unsigned long PING_INTERVAL = 60; // 60ms between pings to avoid ghost echoes
unsigned long lastPingTime = 0;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
delay(50); // Settle power rails
Serial.println(F("HC-SR04 Ultrasonic System Ready"));
}
float measureDistanceCm() {
// Transmit clean 10us trigger pulse
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(4);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure pulse duration (timeout at 25000us = ~4.3 meters)
unsigned long durationUs = pulseIn(ECHO_PIN, HIGH, 25000);
if (durationUs == 0) {
return -1.0; // Out of range or timeout
}
return (durationUs * 0.0343f) / 2.0f;
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - lastPingTime >= PING_INTERVAL) {
lastPingTime = currentMillis;
float distance = measureDistanceCm();
if (distance > 0) {
Serial.print(F("Distance: "));
Serial.print(distance, 1);
Serial.println(F(" cm"));
} else {
Serial.println(F("Warning: Target out of range or reflected away"));
}
}
}Code Architecture Breakdown:
- 25ms Timeout Guard: The pulseIn() function is bounded with a 25,000 µs timeout parameter, preventing the microcontroller from hanging if no echo returns.
- 60ms Inter-Ping Settling Time: Prevents previous ultrasonic pulses from reverberating in the room and triggering false readings on subsequent pings.
- Floating-Point Resolution: Computes exact fractional distance in centimeters while returning -1.0 as a discrete error code on timeout.
Real-World Engineering Applications
Autonomous Robot Obstacle Avoidance
Allows mobile robot rovers to detect walls and furniture 30 cm ahead and pivot before collisions occur.
Non-Contact Tank Liquid Level Sensing
Mounts above water, oil, or chemical reservoirs to monitor fluid height without liquid contact.
Smart Parking Assist System
Detects vehicle clearance against garage walls with multi-stage LED and buzzer proximity alerts.
Smart Automation Trash Bin
Detects hand gesture approach at 20 cm to trigger a servo-actuated bin lid opening mechanism.
✅ Engineering Advantages
- Unaffected by target color, surface reflectivity, or ambient optical darkness unlike infrared sensors.
- Inexpensive, rugged, and supported by extensive community libraries and documentation.
- Narrow 15° cone avoids false triggering from objects on the immediate perimeter.
⚠️ Physical Constraints & Limitations
- Acoustic blind spot: Cannot accurately measure targets closer than 2 cm.
- Soft materials (clothing, wool, plush foam) absorb ultrasound pulses and fail to reflect an echo.
- Angled smooth targets can deflect the sound cone away from the receiver like a mirror.
Diagnostic & Troubleshooting Guide
| Fault / Symptom | Probable Root Cause | Corrective Action |
|---|---|---|
| pulseIn() continuously returns 0 or times out | Echo pin is disconnected, or Trig pulse is shorter than 10 µs. | Verify wiring with a multimeter and ensure digitalWrite(TRIG_PIN, HIGH) holds for a full 10 microseconds. |
| Readings randomly spike to maximum range | Specular reflection on slanted targets or acoustic interference from nearby ultrasound sources. | Align sensor perpendicular to target surface and introduce a median filter across 5 samples. |
| Sensor fails to operate on ESP32 or Raspberry Pi Pico | HC-SR04 VCC is supplied with 3.3V, which drops transmitter amplifier power below threshold. | Supply 5V to HC-SR04 VCC and use a 1kΩ/2kΩ resistor divider on the Echo pin before connecting to 3.3V GPIO. |
Frequently Asked Questions (EE/ECE Reference)
Q: How does the HC-SR04 calculate distance using sound waves?
The HC-SR04 emits an 8-cycle burst of ultrasound at 40 kHz from its transmitter when triggered. It times how long the sound wave takes to travel to the target, bounce off, and return to the receiver. Using the known speed of sound in air (343 m/s), distance is calculated as (Time × Speed) / 2.
Q: Can the HC-SR04 be safely used with an ESP32 or Raspberry Pi?
Yes, but caution is required. While you can power the sensor with 5V, the Echo pin will also output 5V logic, which exceeds the 3.3V maximum rating of ESP32 and Raspberry Pi GPIOs. You must install a simple 2:1 resistor voltage divider (such as 1kΩ and 2kΩ) on the Echo line to step down the signal to 3.3V.
Q: Why does the sensor give erratic zero or max-distance readings?
Erratic readings typically stem from three causes: acoustic absorption (sound-absorbing fabrics or carpets), steep surface angles deflecting the pulse away from the receiver, or electrical ripple on the 5V power supply caused by servos and DC motors switching concurrently.
Q: What is the minimum and maximum reliable range of the HC-SR04?
The practical operational range is 2 cm to 400 cm. Below 2 cm, the receiver crystal is still ringing from the transmitter blast, creating a blind zone. Beyond 400 cm, acoustic dissipation weakens the reflected signal below the detection threshold of the receiver comparator.