loading
After buying a HC-SR04 from Amazon, I could not get it to work out of the box. Not wanting to concede I had a DOA sensor on my hands, I searched for a simple example setup. After spending far too long on this than I felt I needed to, I decided to make this instructable to help other emerging tinkerers get their project off the ground.

I admit this example is more than bare-bones in that it has LEDs, but this lets me test it without needing a PC to show distance and check the accuracy of the sensor.

Step 1: Parts List

Arduino UNO R3 (I use the Adafruit mount)
One (1) HC-SR04 Ultrasonic Sensor
One (1) Red LED
One (1) Green LED
Two (2) 560 ohm (Green, Blue, Brown, Gold) Resistors
Half Breadboard
Eight (8) Male/Male hookup wires
A ruler that measures centimeters (or use the serial monitor)

Step 2: Connect the components

Connect the components and wires as shown in the two pictures.

Step 3: Upload the sketch

Copy the sketch to your Arduino and watch the blinky lights.
 


 
/*
HC-SR04 Ping distance sensor]
VCC to arduino 5v GND to arduino GND
Echo to Arduino pin 13 Trig to Arduino pin 12
Red POS to Arduino pin 11
Green POS to Arduino pin 10
560 ohm resistor to both LED NEG and GRD power rail
More info at: http://goo.gl/kJ8Gl
Original code improvements to the Ping sketch sourced from Trollmaker.com
Some code and wiring inspired by http://en.wikiversity.org/wiki/User:Dstaub/robotcar
*/

#define trigPin 13
#define echoPin 12
#define led 11
#define led2 10

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 4) {  // This is where the LED On/Off happens
    digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off
  digitalWrite(led2,LOW);
}
  else {
    digitalWrite(led,LOW);
    digitalWrite(led2,HIGH);
  }
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}
<p>Great work, I did this with my Nano and works like a charm thanks.</p><p>Had to switch Echo and Trig cables around thou.</p>
<p>I'm new to Arduinos, but have done other hardware projects. I followed the instructions, but I am always seeing &quot;Out of range&quot;. I modified the code to see what distance it thought it was seeing, and it is always zero. Any suggestions on how to debug this?</p>
<p>dude you need to make the arduino and the sensor communicate with each other, add the required driver and library updates to make that happen :) good luck </p>
<p>Sorry, but that doesn't make any sense to me. The HC-SR04 doesn't have a driver. </p><p>In the end, I just switched to the PING sensor. More expensive, but it works totally reliably.</p>
I have seen this same issue with mine. Constantly seeing zero. Make sure all your inputs are defined and are landed on the correct pins. Also make sure your trigger and your Echo are not switched around. I have code for what I did because I kept getting it to stick on zero and needed to unplug the sensor for it to work unless I put my finger on the left upper corner of the hc Hr04. So I ended up making and input that when it senses 0 it will set this pin to high then low. I will upload more later for people having problems. My way seemed to fix it getting stuck on 0
<p>Be sure the Echo and Trig are connected correctly. In the .txt file the header says one way but the actual pin definitions in the next section are backwards (12 and 13 are reversed)</p>
<p>Also check the specs on the HC-SR04 for which voltage is appropriate to use - I find mine works better on 3V instead of 5V</p>
<p>Thanks for the suggestions, Patrick. I verified that the Echo and Trig were correct. The spec says it takes 5V. I just tried it with an RFduino which puts out 3V, and still only saw zeros returning from the pulseIn function. I have gotten it to work with 5V, but I had to constantly disconnect and reconnect to reset it. I'm surprised more people haven't seen this -- I tried it with two different devices and had the same problem. I have had much better reliability with the PING sensor. I wish I could use it at 3V with the RFduino, but it doesn't seem to work reliably at that voltage. </p><p>Let me know if you have any other ideas.</p>
<p>I also got it to work by unplugging the sensor and plugging it back in again. Which pin did you set to high and then low to get it to work?</p>
<p>The distance formula can be explained if you look up the data sheet of the HC-SR04 where it says :</p><p>&quot;This popular ultrasonic distance sensor provides stable and accurate distance measurements from 2cm to 450cm. It has a focus of less than 15 degrees and an accuracy of about 2mm.</p><p>This sensor uses ultrasonic sound to measure distance just like bats and dolphins do. Ultrasonic sound has such a high pitch that humans cannot hear it. This particular sensor sends out an ultrasonic sound that has a frequency of about 40 kHz. The sensor has two main parts: a transducer that creates an ultrasonic sound and another that listens for its echo. To use this sensor to measure distance, the robot's brain must measure the amount of time it takes for the ultrasonic sound to travel.</p><p><strong>Sound travels at approximately 340 meters per second. This corresponds to about 29.412&micro;s (microseconds) per centimeter. To measure the distance the sound has travelled we use the formula: Distance = (Time x SpeedOfSound) / 2. The &quot;2&quot; is in the formula because the sound has to travel back and forth. First the sound travels away from the sensor, and then it bounces off of a surface and returns back. The easy way to read the distance as centimeters is to use the formula: Centimeters = ((Microseconds / 2) / 29). For example, if it takes 100&micro;s (microseconds) for the ultrasonic sound to bounce back, then the distance is ((100 / 2) / 29) centimeters or about 1.7 centimeters.&quot;</strong></p><p><strong><br></strong></p><p>Source: https://www.bananarobotics.com/shop/HC-SR04-Ultrasonic-Distance-Sensor</p>
<p>distance = (duration/2) / 29.1;</p><p>would you like to explain this line, thanks!!</p>
<p>From what I can <br>get, &quot;duration&quot; in the code is a number showing the milliseconds needed <br>for the signal to go and return. This is why duration is then divided by<br> 2, to find out the time needed for the signal one-way. We know that <br>sound speed on air is 344 m/sec. So, we have the time and speed and <br>using the formula S=U*t (Distance = Speed * time) we can calculate the <br>distance. If you change this line in code with:</p><p>distance = (duration/2) * 0.0344 </p><p>you'll get the same result, because 1/29.1 = 0.0344!</p><p>I hope I helped! It all has to do with sound speed anyway...</p>
<p>I'll add my thanks for the clear explanation on this converstion factor. Much appreciated. </p>
<p>Thanks for answering the questions, @gtricho. I had the same question as @MohammedE74. If the duration is given in milliseconds then the speed of sound would also have to be expressed in milliseconds. Using dimensional analysis, this can be done by dividing the speed of sound by 1000 milliseconds. The result is 0.343 m/ms. 1 divided by 0.343 is 2.91, whereas 1 divided 29.1 equals 0.0344.</p><p>speed of sound = 343 meters per second (343 m/s)</p><p>343 m/s * (1 second/1000 milliseconds) = 0.343 meters per millisecond</p>
<p>This was super easy and simple. Thanks for sharing!! -- ArduinoNewbie</p>
<p>HC - SR04</p>
<p>HC - SR04</p>
great instruction! Can't wait to use it
<p>This worked very well! I have one question though: </p><p>Where does this line come from in the code -</p><p> distance = (duration/2) / 29.1;</p><p>I get that the duration is divided by two to account for the echo. I can't figure out where the 29.1 comes from though. Any thoughts?</p>
<p>From what I can get, &quot;duration&quot; in the code is a number showing the milliseconds needed for the signal to go and return. This is why duration is then divided by 2, to find out the time needed for the signal one-way. We know that sound speed on air is 344 m/sec. So, we have the time and speed and using the formula S=U*t (Distance = Speed * time) we can calculate the distance. If you change this line in code with:</p><p>distance = (duration/2) * 0.0344 </p><p>you'll get the same result, because 1/29.1 = 0.0344!</p><p>I hope I helped! It all has to do with sound speed anyway...</p>
<p>Dividing it by 29.1 makes the distance value equal to centimeters instead of whatever it would originally be. Hope this helps. :D</p>
<p>I triple-checked everything and I don't know what's wrong. I put in the code and built the circuit but when I run the program, it keeps displaying &quot;Out of range.&quot; Does anyone know why?</p>
<p>I am working on a project ( designing of quad copter with obstacles avoidance ) so i am using an four ultrasonic sensor hc sr 04 for ( front , back, right and left) .... so i need help of coding in arduino......thanks</p>
<p>Try the library http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/ very easy to use and supports more than one sensors.</p>
<p>So what is your question?</p>
<p>Can you please link us to that thing on which you have kept the arduino and the breadboard ?</p>
<p>Excellent example project, thank you for sharing. </p>
<p>Thanks for sharing the project. I was just wondering if you used </p><p>if (distance &gt;= 200 || distance &lt;= 0){<br> Serial.println(&quot;Out of range&quot;);</p><p>as an arbitrary number or is that a limitation on the sensor?</p>
Glad to! I haven't checked this in a while and so my apologies to all of the comments I have missed.<br><br>Yes, 200 was completely arbitrary to test the sensor. However, if I remember correctly the sensor tends to lose accuracy around 3-4 feet.<br><br>Thanks for the comment!
<p>Thanks for sharing the project. I was just wondering if you used </p><p>if (distance &gt;= 200 || distance &lt;= 0){<br> Serial.println(&quot;Out of range&quot;);</p><p>as an arbitrary number or is that a limitation on the sensor?</p>
Works but the sensor is a little in acurate
<p>this sensor is supposed to be the most accurate one, but obviously there will be fluctuaions in the sound and it may be a little in accurate. that should not cause too many prolems.</p>
Works but the sensor is a little in acurate
<p>Thanks! It worked! </p>
<p>thank you works perfectly</p>
<p>Thanks dude!</p><p>It works very well.</p>
<p>hi i connected the components as shown. sketch was uploaded successfully. unfortunately, LED does not turn on and there is no trigger. btw: thanks for the great tutorial.</p>
<p>Thanks I was looking for the same simple code and couldn't find anything until I came upon your Instructable. Thanks for the great write up.</p>
Thanks you.
<p>Where do i connect power <strong>source/battery</strong> on this circuit.</p><p>i AM a student and i haven't any experienc in this field </p><p>please give me detailed circuit</p><p><strong><br></strong></p>
<p>These are your 2 power sources. Note that the USB jack should only be 5 volts! The DC jack has a voltage leveler that will convert anything from +5 volts - 9 volts to 5 volts. Anything over 5 volts can fry your boards! So, be careful!</p>
<p>Some corrections, the voltage also can be given in the vin pin,and powering the board using the usb connector is extremely dangerous!! Anything over 5v in the usb will fry your board. You can power upto 30v in the dc jack,it got a voltage regulator but no polarity protection,so be careful about the polarity.</p>
<p>The power should be connected to the Arduino. You can power it through USB from your computer, or from a 5 volt - 9 volt power supply (or a 9 volt battery with a DC jack adapter) through the DC jack on the board. Good luck!</p>
<p>Digital vernier caliper:</p><p>Is it possible this device can be use for measurement? Digital caliper sending to pc are very costly. If you have any idea please share.</p>
Thanks! Now the kids habe to wait at the slide in the children room ;)
<p>instead of wasting power, by keeping one led on always... 1 led which glows when the object comes near is a better approach. Here is the code for that :-</p><p>void setup() {</p><p> Serial.begin (9600);</p><p> pinMode(trigPin, OUTPUT);</p><p> pinMode(echoPin, INPUT);</p><p> pinMode(led, OUTPUT);</p><p>}</p><p>void loop() {</p><p> long duration, distance;</p><p> digitalWrite(trigPin, LOW);</p><p> delay(1)</p><p> digitalWrite(trigPin, HIGH);</p><p> delay(5)</p><p> digitalWrite(trigPin, LOW);</p><p> duration = pulseIn(echoPin, HIGH);</p><p> distance = (duration/2) / 29.1;</p><p> if (distance &lt; 10) {</p><p> digitalWrite(led, LOW);</p><p> }</p><p> else{</p><p> digitalWrite(led, HIGH)</p><p> }</p><p> if (distance &gt; 200){</p><p> Serial.println(&quot;Out of range&quot;);</p><p> }</p><p> if (distance &lt; 0){</p><p> Serial.println(&quot;Out of Range&quot;)</p><p> }</p><p>}</p>
<p>Great example ! I suggest getting rid of the floating point math. I tested both ways</p><p>and saved 500 bytes of program space doing away with the floating point.</p><p>How about scaling up by 10 to get rid of 29.1 (becomes 291). </p><p>distance = ( (distance &gt;&gt;1) *10)/291;</p><p>// (distance &gt;&gt;1) is division by two</p>
<p>Very nice !</p>
<p>Thanks for writing this up - worked like a charm. Minor code suggestion : </p><p>int ledState = distance &lt; 4;</p><p>digitalWrite(led, ledState);</p><p> digitalWrite(led2, !ledState);</p><p>can replace - </p><p>if (distance &lt; 4) { // This is where the LED On/Off happens<br> digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off<br> digitalWrite(led2,LOW);<br>}<br> else {<br> digitalWrite(led,LOW);<br> digitalWrite(led2,HIGH);<br> }</p>
<p>BEER THEFT ALARM!!! I modified this project slightly to make a beer theft alarm as demonstrated in the video. Just added a 1.5V buzzer between the red LED anode and GND. :-D</p>

About This Instructable

761,113views

278favorites

License:

More by jsvester:Simple Arduino and HC-SR04 Example 
Add instructable to: