Click here for a free subscription to "HDE" our site newsletter.

Arduino Programming the HC-SR04 Project Interrupt Driven Software

Software sketch for the Arduino HC-SR04 programming project

If you don't have an oscilloscope then get a copy of my book: Sound Card Oscilloscope and build yourself some very powerful test gear to examine the inner workings of the HC-SRO4.

The sketch below takes advantage of the ATmega328 16 bit timer 1. Before you can use the code you must download and install the TimerOne library.

Download the timerOne library from https://code.google.com/p/arduino-timerone/downloads/detail?name=TimerOne-v9.zip&can=2&q= and install it using the guide https://arduino.cc/en/Guide/Libraries

Copy and paste the sketch below

Load the sketch onto your Arduino Uno and let it run. If all is well then you will see the Arduino onboard LED start to flash. This LED is located near to the USB connector. Place an object in front of the HC-SR04 sensor and vary the distance. The flash rate of the onboard LED will change to reflect the distance. Just like the parking sensor on a new car.

How the program works

The code sketch above is well commented but I will explain briefly how it works here.

When the program is loaded the first thing it does is execute the setup() function. The various pins of the Arduino are set to input or output as appropriate. Timer 1 is initialized, the interrupt service routines attached to the appropriate interrupts and the serial port is initialized.

The background loop() function then begins to run. Any routines placed in loop() are executed continuously. All of the code required to handle the HC-SR04 and the onboard LED is contained in interrupts routines so the only task in the loop() function is to send the distance measured in centimeters to the serial monitor port every 100 mS.

timerIsr() is called every time the timer 1 times out and creates an interrupt. The simplify the code this function calls two more functions. One to handle the trigger pulse and the other one to flash the onboard LED.

The trigger_pulse() function is called from timerIsr() every 50 uS and creates a trigger pulse every 4000 calls or 200 mS. The pulse generator is implemented with a simple finite state machine contained in the switch() statement. Every time this routine is called exactly one of the cases is executed. When the count reaches 200 mS the state is changed from 0 to 1 which immediately causes the trigger output to be set high and the state changed to 2. When the function is next called 50 mS later, case 2 is called which resets the trigger output to low and the state reset to 0.

echo_interrupt() is called every time the echo input signal changes state and generates an interrupt. The echo input is tested to determine whether this is the start or end of the echo pulse and start and end times recorded accordingly. If the input has changed from high to low then this is the end of the pulse and the duration is computed.

The distance_flasher() function is called from timerIsr() every 50 uS. A counter is decremented and if it reaches zero then the onboard LED is toggled and the counter is reloaded with the value of the computed echo pulse duration. This has the effect of flashing the LED faster the closer the object is to the sensor.

If you have followed this project you should now have a working model of an ultrasonic range finder or parking sensor and along the way you may have picked up a few new skills. Now please sign up to our free newsletter.



Now subscribe to our newsletter and don't miss a thing
 



Comments (13)

Topic: Arduino Programming the HC-SR04 with Interrupts
Full StarFull StarFull StarFull StarHalf Star 4.5/5 (9)
Facebookdel.icio.usStumbleUponDiggGoogle+Twitter
Full StarFull StarFull StarFull StarFull Star
Kim (South Korea) says...
amazing post of interrupt and operating ultrasonic module. great help for my advanced project! thx a lot Smile
11th August 2022 4:31pm
Full StarFull StarFull StarFull StarEmpty Star
Biomedical engineering project (India) says...
nice information
3rd March 2021 6:54am
Full StarFull StarFull StarFull StarFull Star
Fabri (Italy) says...
Hi, i'm testing you code on arduino mega,
is it possible that the only working pin for Echo signal is 2?
Why can't I put it on a random digital input, since the interrupt is generated by the timer?
20th April 2020 12:42pm
Full StarFull StarFull StarEmpty StarEmpty Star
Juan Alberto Guerrero Ramírez (Spain) says...
I´m quite new in Arduino and I´m trying to understanding interrupts and etc...

I guess this code is super, however, it is a bit difficult for me to understand.

In any case, many thanks for sharing and useful info.

Best Regards,
Juan Alberto
4th January 2020 1:02pm
ElysiumPro (India) says...
Excellent information about working HC-SR04. Thanks you so much for sharing the valuable information.
28th January 2019 11:31am
Full StarFull StarFull StarFull StarEmpty Star
embeddedschool (India) says...
Informative content about arduino programming.simple and Easy to understand embedded beginners. Thanks for sharing this kind of post
4th August 2018 10:23am
Mahdi (Iran) says...
hi
for my lesson i need your code .
can you send it for me please.
i observe publisher's rights, and introduce your site to my friends.
23rd June 2018 6:55am
Full StarFull StarFull StarFull StarFull Star
Mohamed says...
hello

i want to use input capture in the timer so i can see in your code that you are using timer and intrrupt , however is this intrrupt is ( the intrrupt for the timer ) or normal intrrupt , im asking about that cuz my all intrrupt pins is totaly busy and i want to use the input capture feature in the arduino mega ...??
11th May 2017 12:56pm
Full StarFull StarFull StarFull StarFull Star
Reema Shrestha (Nepal) says...
I've been trying to use Interrupt and timer for two ultrasonic sensors to measure time interval between when the first sensor's echo pin is HIGH to second sensor's echo pin is HIGH. So could help me with it?
16th February 2017 5:31pm
Forest Cooper (US) says...
I don't know those circuit details.
16th February 2017 5:56pm
Reema Shrestha (Nepal) says...
If you could,just help me with the algorithm.The circuit is similar to the one used above but I've used two sensors. When the moving object is detected by the first sensor then the interrupt should be called and timer should record the time until the object is detected by the second sensor. What I've been stuck to is,mode of Interrupts(). According to your code the timer measures the value from one state of the pin to the change of pin. But in mine the case should be HIGH for both. I mean when ... Read More
17th February 2017 11:09am
Full StarFull StarFull StarFull StarEmpty Star
Bob Jones (US) says...
Steve, I have been reading as much as I can find about how to program the HC-SR04 Ultrasonic Sensor using a timer interrupt. I got your sketch working and am adapting it, but hitting a question about delays. In your code, you use a for loop to simulate a delay. Your comment says that a delay won't work. So what I have done is use the micros() function to do the same. Only problem is that it doesn't work... yet. Would you be willing to take a quick look at my code and help me make it ... Read More
20th December 2015 4:52am
Full StarFull StarFull StarFull StarFull Star
Forest Cooper (US) says...
Hello, I am looking for 35 of the HC-RS04 modules and cards. Do you know where I can purchase these in the US? I need them in 1-2 days! Thanks for your help.
21st May 2014 4:36pm

Add Comment

* Required information
(will not be published)
 
Bold Italic Underline Strike Superscript Subscript Code PHP Code Quote Insert line Bullet list Numeric list Link Email Image Video
 
Smile Sad Huh Laugh Mad Tongue Crying Grin Wink Scared Cool Sleep Blush Unsure Shocked
Captcha
Refresh
 
Enter code:
 
Notify me of new comments via email.
 
Remember my form details on this computer.
 
I have read and understand the privacy policy. *
 
I have read and agree to the terms and conditions. *
 
Click here for a free subscription to "HDE" our site newsletter.