Arduino Ultrasonic Ranging With HC-SR04

HC-SR04 not only inexpensive but also practical, use a sample AVR development boar –Arduino , with a LCD screen , you can make a easy rangefinder device , which can ranging 2cm to 500cm .

Now first connect the circuit as below :

With module : pin13 to Trig ; pin 12 to Echo ; VCC to VCC; GND to GND ; pin 2 to INT
With LCD: RS => pin 11   RW => pin 10  EN => pin 9
D4, D5, D6, D7 => pins 7, 6, 5, 4

Download the code below :

LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7);
int pingPin = 13;
int inPin = 12;
void setup() {
lcd.begin(16, 2);
void loop()
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;
  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  digitalWrite(pingPin, HIGH);
  digitalWrite(pingPin, LOW);
  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(inPin, INPUT);
  duration = pulseIn(inPin, HIGH);
  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  lcd.setCursor(0, 0);
  lcd.print("in, ");
long microsecondsToInches(long microseconds)
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  return microseconds / 74 / 2;
long microsecondsToCentimeters(long microseconds)
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;

Reset the Arduino , then you can see the distance of object in front on the LCD.

Responses to “Arduino Ultrasonic Ranging With HC-SR04

  1. Hi,
    The sensor connects the LCD screen via a circuit. Actually, I don’t know how to make the circuit. Can I buy or make the circuit ??

  2. Did you had any problems with this sensor? I need 5 of these for my project and I bought one to try it but it has a noisy output, sometimes it gives me the correct distance but sometimes on the LCD appears a weird number(about 40m..) I’m not sure if mine has a problem or not. i used the same code you did. What should I see on the lcd if the sensor has nothing in front?

    • The code just a demo so it’s not so preciseness… If there is nothing in front, there would be a long continuous wave – you can find detailed time in datasheet – but in demo code it will mistake identified as a distance – like 40m…

  3. hi
    is ther a typo error in the lcd lines : LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7);
    on an other web site i’ve seen : LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    i have on my 2×16 lcd griberish unreadable values accents etc … but if i paste this code :
    #include “Ultrasonic.h”
    Ultrasonic ultrasonic( 12, 13 );
    void setup()
    Serial.begin( 9600 );
    void loop()
    Serial.print( ultrasonic.Ranging(CM) );
    Serial.println( “cm” );
    it work in a serial terminal ??? is there an error in the lcdlibrary or something ?
    i have the arduino 022 package.

    • Hi,
      we don’t know which type LCD you use, so we can not give you any suggestion of that… But if you use the code above , you should can read the data from serial terminal.

  4. There is mistake in circuit picture, data lines must be reversed. Or you may reverse those lines in code by change
    LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7) to
    LiquidCrystal lcd(11, 10, 9, 7, 6, 5, 4).

  5. Ok, I changed the order from LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7) to
    LiquidCrystal lcd(11, 10, 9, 7, 6, 5, 4), but Arduino IDE (0022) returns:
    sketch_aug09a.cpp:1:11: error: #include expects “FILENAME” or
    sketch_aug09a:2: error: ‘LiquidCrystal’ does not name a type
    sketch_aug09a.cpp: In function ‘void setup()’:
    sketch_aug09a:8: error: ‘lcd’ was not declared in this scope
    sketch_aug09a.cpp: In function ‘void loop()’:
    sketch_aug09a:36: error: ‘lcd’ was not declared in this scope
    What’s wrong?

  6. With module : pin13 to Trig ; pin 12 to Echo ; VCC to VCC; GND to GND ; pin 2 to INT
    Module HC-SR04 has only: VCC, trig, Echo, GND.
    What is INT ?

  7. there are 2 mistakes in the code in first 2 lines
    change #include in to #include
    change LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7); in to LiquidCrystal lcd(11, 10, 9, 7, 6, 5, 4);

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>