Guide for HC-SR04 Ultrasonic Distance Sensor Module
HC-SR04 Ultrasonic Distance Sensor Module
Precise Non-Contact Distance Measurement for Arduino Projects
Introduction
The HC-SR04 ultrasonic sensor is a popular module for measuring distances from 2cm to 400cm with 3mm accuracy. Using sound waves beyond human hearing (40kHz), it provides reliable non-contact distance measurement for robotics, automation, and IoT applications.

HC-SR04 ultrasonic sensor
Key Features
Precise Measurement
2cm-400cm range with 3mm accuracy
Ultrasonic Technology
40kHz sound waves for reliable detection
Simple Interface
Only 4 pins (VCC, GND, Trig, Echo)
Easy Integration
Works with 5V microcontrollers
Technical Specifications
| Operating Voltage | 5V DC |
|---|---|
| Working Current | 15mA |
| Measuring Angle | 15° |
| Resolution | 0.3cm |
| Measuring Cycle | ≥50ms |
| Dimensions | 45mm × 20mm × 15mm |
Pin Configuration

| Pin | Label | Description | Arduino Connection |
|---|---|---|---|
| 1 | VCC | Power (5V) | 5V |
| 2 | Trig | Trigger Input | Digital Pin |
| 3 | Echo | Echo Output | Digital Pin |
| 4 | GND | Ground | GND |
Note: The Echo pin outputs 5V which may need a voltage divider for 3.3V microcontrollers
Wiring with Arduino
// For 3.3V boards (ESP8266/ESP32):
// Echo → Voltage divider (5V to 3.3V)
Important: Avoid placing objects closer than 2cm for accurate readings

// Basic Connections: // VCC → 5V // GND → GND // Trig → D9 // Echo → D10
Basic Distance Measurement
// HC-SR04 Basic Example
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// Clear trigger pin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Send 10μs pulse
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure echo pulse duration
long duration = pulseIn(echoPin, HIGH);
// Calculate distance (cm)
float distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(100);
}
Advanced Applications
Obstacle Avoidance
// Robot obstacle detection
if(distance < 20) { // 20cm threshold
stopMotors();
turnRight();
}
Liquid Level Monitoring
// Tank level measurement
float tankHeight = 50; // cm
float level = tankHeight - distance;
float percentage = (level/tankHeight)*100;
Multiple Sensors
// Array of sensors
const int sensors = 3;
const int trigPins[sensors] = {2,4,6};
const int echoPins[sensors] = {3,5,7};
void readAllSensors() {
for(int i=0; i<sensors; i++) {
// Add sensor reading logic
}
}
Moving Average Filter
// Smooth noisy readings
float readings[5];
int index = 0;
float getFilteredDistance() {
readings[index] = getDistance();
index = (index+1)%5;
float sum = 0;
for(int i=0; i<5; i++) {
sum += readings[i];
}
return sum/5;
}
Troubleshooting
Inconsistent Readings
- Ensure stable power supply (5V)
- Keep sensor perpendicular to target
- Add delay between measurements (≥50ms)
No Readings
- Check wiring connections
- Verify trigger pulse (10μs)
- Test with different objects
Incorrect Distance
- Calibrate speed of sound constant
- Check for acoustic interference
- Avoid soft/angled surfaces
