Blog

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

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