Ultrasonic distance sensor (HC-SR04) in Arduino - Time & Space Complexity
We want to understand how the time taken by the ultrasonic sensor code changes as we measure distances repeatedly.
How does the program's running time grow when we take more distance readings?
Analyze the time complexity of the following code snippet.
const int trigPin = 9;
const int echoPin = 10;
long duration;
int distance;
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);
distance = duration * 0.034 / 2;
Serial.println(distance);
delay(500);
}
This code sends an ultrasonic pulse, waits for the echo, calculates the distance, and prints it every half second.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop() function runs repeatedly, sending pulses and measuring echoes.
- How many times: It runs indefinitely, repeating the distance measurement every 500 milliseconds.
Each distance measurement takes roughly the same time regardless of the distance value.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 readings | About 10 times the measurement steps |
| 100 readings | About 100 times the measurement steps |
| 1000 readings | About 1000 times the measurement steps |
Pattern observation: The total time grows linearly with the number of readings taken.
Time Complexity: O(n)
This means the time to complete n distance measurements grows directly in proportion to n.
[X] Wrong: "The time to measure distance depends on how far the object is."
[OK] Correct: The sensor waits for the echo pulse, and the code timing depends on the echo time, so time per reading varies slightly with distance but is mostly fixed per measurement cycle.
Understanding how sensor reading loops scale helps you write efficient embedded programs that handle repeated tasks smoothly.
"What if we added a loop inside loop() to take multiple readings before printing? How would the time complexity change?"
Practice
trigger pin on the HC-SR04 ultrasonic sensor?Solution
Step 1: Understand the role of the trigger pin
The trigger pin is used to send a short pulse that starts the ultrasonic burst.Step 2: Differentiate from echo pin
The echo pin listens for the returning pulse, not the trigger pin.Final Answer:
To send a short ultrasonic pulse to start distance measurement -> Option AQuick Check:
Trigger pin sends pulse = A [OK]
- Confusing trigger with echo pin
- Thinking trigger powers the sensor
- Assuming trigger resets the sensor
Solution
Step 1: Identify function to measure pulse duration
ThepulseIn()function measures the length of a pulse on a pin.Step 2: Exclude other functions
digitalWrite()sets pin output,analogRead()reads analog values,delay()pauses execution.Final Answer:
pulseIn() -> Option BQuick Check:
pulseIn measures pulse length = B [OK]
- Using digitalWrite() to read pulse
- Confusing analogRead() with pulse measurement
- Using delay() instead of measuring pulse
distance = (echoTime / 2) / 29.1.Solution
Step 1: Calculate half of echo time
Half of 1160 microseconds is 580 microseconds.Step 2: Divide by 29.1 to get distance
580 / 29.1 ≈ 19.93 cm, approximately 20 cm.Final Answer:
20 cm -> Option DQuick Check:
(1160/2)/29.1 ≈ 20 cm [OK]
- Forgetting to divide echo time by 2
- Using wrong divisor instead of 29.1
- Mixing units of time and distance
digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); echoTime = pulseIn(echoPin, LOW);
Solution
Step 1: Check pulseIn usage
The echo pulse is HIGH when the echo is received, so pulseIn should measure HIGH pulse.Step 2: Verify other code parts
delayMicroseconds(10) is correct for 10 microseconds pulse; triggerPin sequence is correct; echoTime type depends on usage but not an error here.Final Answer:
pulseIn should measure HIGH pulse, not LOW -> Option CQuick Check:
pulseIn measures HIGH pulse = D [OK]
- Measuring LOW pulse instead of HIGH
- Using delay() instead of delayMicroseconds()
- Setting triggerPin LOW before HIGH incorrectly
Solution
Step 1: Check trigger pulse sequence
The correct sequence is to set trigger LOW for 2 microseconds, then HIGH for 10 microseconds, then LOW again.Step 2: Verify echo measurement and distance formula
pulseIn measures HIGH pulse duration; distance = (echoTime / 2) / 29.1 converts time to cm correctly.Final Answer:
Code snippet C correctly triggers and calculates distance -> Option AQuick Check:
Trigger LOW-2us-HIGH-10us-LOW, pulseIn HIGH, distance formula = C [OK]
- Skipping initial LOW trigger pulse
- Measuring LOW pulse instead of HIGH
- Incorrect distance formula with wrong multiplication/division
Ready to prove it?
Pass the test and this pattern moves unknown
