Views: 164 Author: Grace Publish Time: 2021-07-26 Origin: Site
The HC-SR04 ultrasonic sensor is one of the most popular distance measurement modules for Arduino projects. It is widely used in obstacle avoidance robots, parking sensors, level detection, smart trash bins, distance meters, and other non-contact sensing applications.
The module emits 40kHz ultrasonic waves through a transmitter. When the sound wave meets an object, it reflects back to the receiver. By measuring the echo time and using the speed of sound, Arduino can calculate the distance between the sensor and the object.
| Parameter | Value |
| Typical working voltage | 5V DC |
| Static working current | Less than 5mA on some module versions |
| Operating frequency | 40kHz ultrasonic wave |
| Detection distance | Common range: 2cm to 400cm; some gain-adjusted versions may support longer range. |
| Detection angle | Usually within 15 degrees; some versions with higher gain may reach about 30 degrees. |
| Precision | Up to about 0.3cm under suitable test conditions |
| Blind zone | About 2cm minimum measuring distance |
The HC-SR04 ultrasonic module has four pins: VCC, TRIG, ECHO, and GND. Arduino sends a short trigger pulse to the TRIG pin, then reads the return pulse from the ECHO pin.
| HC-SR04 Pin | Arduino Connection | Function |
| VCC | 5V | Power supply for the ultrasonic module. |
| TRIG | Digital pin 9 | Trigger input. Arduino applies a 10us pulse to start ranging. |
| ECHO | Digital pin 10 | Echo output. Arduino reads pulse width to calculate distance. |
| GND | GND | Ground connection. |
The HC-SR04 works by time-of-flight measurement. Arduino sends a high-level trigger signal of at least 10 microseconds to the TRIG pin. The module then automatically sends eight 40kHz ultrasonic pulses and waits for the reflected echo.
When the reflected ultrasonic signal is detected, the ECHO pin outputs a high-level pulse. The duration of this pulse is the round-trip travel time of the ultrasonic wave.
Distance = Echo high-level time × Speed of sound / 2
In Arduino code, the common simplified formula is:
Distance in cm = duration × 0.0343 / 2
The timing process is simple: Arduino keeps TRIG low briefly, sends a 10us high pulse, then returns TRIG to low. The HC-SR04 sends an ultrasonic burst and sets ECHO high until the reflected signal returns or the measurement times out.
To avoid unstable readings, leave a short delay between measurements. A measurement cycle of about 60ms is commonly used so the previous ultrasonic echo has time to disappear before the next trigger.
The Arduino pulseIn() function is used to measure how long a digital pin stays HIGH or LOW. For HC-SR04, Arduino uses pulseIn(echoPin, HIGH) to read the high-level pulse width from the ECHO pin.
| Syntax | Meaning |
| pulseIn(pin, value) | Reads the duration of a HIGH or LOW pulse. |
| pulseIn(pin, value, timeout) | Reads the pulse with a timeout value in microseconds. |
Using a timeout is recommended. If no echo is returned, the function can stop waiting and return 0 instead of blocking the program for too long.
The wiring is straightforward. Connect VCC to 5V, GND to GND, TRIG to an Arduino digital output pin, and ECHO to an Arduino digital input pin. The following example uses Arduino Uno, TRIG on pin 9, and ECHO on pin 10.
The following typical Arduino program sends a 10us trigger pulse, reads the ECHO pulse width, calculates distance in centimeters, and prints the result in the Serial Monitor.
const int trigPin = 9;
const int echoPin = 10;
long duration;
float distanceCm;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) {
Serial.println("Out of range");
} else {
distanceCm = duration * 0.0343 / 2;
Serial.print("Distance: ");
Serial.print(distanceCm);
Serial.println(" cm");
}
delay(60);
} If you see distance values in the Serial Monitor, the HC-SR04 ultrasonic sensor and Arduino wiring are working correctly. You can then use the distance data for obstacle detection, robot movement control, automatic doors, parking reminders, or liquid level projects.
Keep the measured object within the recommended distance range and outside the 2cm blind zone.
Use a flat and solid target surface for better ultrasonic reflection.
Avoid measuring soft, angled, porous, or sound-absorbing materials.
Use a stable 5V power supply and keep wiring short and secure.
Add a timeout to pulseIn() to prevent long blocking when no echo returns.
Average or median-filter several readings to reduce noise.
For higher accuracy, compensate for temperature because sound speed changes with air temperature.
| Application | How HC-SR04 Is Used |
| Obstacle avoidance robot | Detects nearby objects and helps the robot change direction. |
| Parking distance sensor | Measures distance between the vehicle and an obstacle. |
| Liquid level detection | Measures the distance from the sensor to the liquid surface without contact. |
| Smart trash bin | Detects a nearby hand or object and triggers automatic lid opening. |
To use an HC-SR04 ultrasonic sensor with Arduino, connect VCC to 5V, GND to GND, TRIG to a digital output pin, and ECHO to a digital input pin. Send a 10us trigger pulse, read the echo duration with pulseIn(), and calculate distance with the time-of-flight formula.
The HC-SR04 is inexpensive, easy to use, and suitable for many Arduino distance measurement projects. For best results, pay attention to target surface, measuring angle, blind zone, stable power, timeout handling, and temperature effects.
Arduino sends a 10us pulse to the TRIG pin. The HC-SR04 emits eight 40kHz ultrasonic pulses and sets the ECHO pin high until the reflected sound returns. Arduino measures this pulse time and calculates distance.
The formula is distance = duration × speed of sound / 2. In centimeters, a common Arduino formula is distanceCm = duration × 0.0343 / 2, where duration is measured in microseconds.
The measured echo time is the round-trip time from the sensor to the object and back to the sensor. Dividing by 2 gives the one-way distance between the sensor and the object.
You can use most Arduino digital pins. In many examples, TRIG is connected to digital pin 9 and ECHO is connected to digital pin 10. The code must match the pins used in your wiring.
Common causes include loose wiring, unstable 5V power, wrong TRIG or ECHO pin numbers, no object in range, angled target surfaces, soft materials, blocked sensor heads, or no timeout in the pulseIn() function.
The blind zone is the minimum distance where the module cannot measure reliably. For HC-SR04, the blind zone is usually about 2cm. Objects closer than this may produce unstable readings.
Yes, HC-SR04 can be used for simple non-contact water level projects if the sensor is protected from moisture and mounted above the liquid surface. For humid, outdoor, or industrial tanks, a waterproof ultrasonic sensor is recommended.
Use a stable power supply, keep the sensor perpendicular to the target, avoid soft or angled surfaces, add pulseIn timeout, take multiple readings, use median filtering, and allow about 60ms between measurements.