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
1 2 3 4 5 |
// Basic Connections: // VCC → 5V // GND → GND // Trig → D9 // Echo → D10 |
Basic Distance Measurement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// 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
1 2 3 4 5 |
// Robot obstacle detection if(distance < 20) { // 20cm threshold stopMotors(); turnRight(); } |
Liquid Level Monitoring
1 2 3 4 |
// Tank level measurement float tankHeight = 50; // cm float level = tankHeight - distance; float percentage = (level/tankHeight)*100; |
Multiple Sensors
1 2 3 4 5 6 7 8 9 10 |
// 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 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