Pages: [1]   Go Down
Author Topic: UltraSonic Tape Measure Using 2 HC-SR04s  (Read 948 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


I have seen a lot of people asking in various forums about using 2 ultrasonic sensors together.  I could not find a solution so I decided to give it a go.  What i made is an ultrasonic tape measure that is in a box.  there are sensors on either side and a parallax 2x16 LCD in the middle.  The two sensors take readings from each side to given objects (ie walls of a room).  The code takes the two readings, adds them together along with the distance between each sensor, and displays the total inches between the two objects on the LCD.  The other cool part of this project is that when the two sensor are equal (IE in the center of the two objects being measured) a red LED is lit to tell you are are half way between the objects.  The good thing about this tape measure is that it does not matter how far you are from each object, you will still get the same reading.  I have tested this up to 25' and it is accurate +/-1"

Here is the code.  If anyone is interested i can upload some video of it working.  I hope this helps....

//This is some code for a tape measure that reads distances opposite sides of each other using 2 HC SR04 Ultrasonic Sensors
//reads both of the sensor data, adds them together, along with the length of the
//box they are in and then prints the total distance from one object (walls, beams, etc.)
//to the other on a 2x16 Parallax LCD Screen.  A red LED will light up when both sensors are approx. equal distance
//from an object.

//Define LCD Pin first
const int TxPin = 6;
//Start LCD Library (Parallax)
#include <SoftwareSerial.h>
SoftwareSerial mySerial = SoftwareSerial(255, TxPin);
//Define Pins for both sensors and LED
const int trigA = 2;
const int trigB = 4;
const int echoA = 3;
const int echoB = 5;
const int led = 8;

void setup()
//Begin LCD Connection and set pins to output and input
  pinMode(trigA, OUTPUT);
  pinMode(trigB, OUTPUT);
  pinMode(echoA, INPUT);
  pinMode(echoB, INPUT);
  pinMode(led, OUTPUT);
  pinMode(TxPin, OUTPUT);
  digitalWrite(TxPin, HIGH);

void loop()
  //Items declared later in the loop
  long durationA, durationB;
  float inchesA, inchesB, Total, diff, box;
  // This is the Code for Sensor A
  digitalWrite(trigA, LOW);
  digitalWrite(trigA, HIGH);
  digitalWrite(trigA, LOW);
  durationA = pulseIn(echoA, HIGH);
  inchesA = microsecondsToInches(durationA);
  // This is the Code for Sensor B
  digitalWrite(trigB, LOW);
  digitalWrite(trigB, HIGH);
  digitalWrite(trigB, LOW);
  durationB = pulseIn(echoB, HIGH);
  inchesB = microsecondsToInches(durationB);
// Get the difference between inchesA and inchesB
diff = inchesA-inchesB;
// if the difference is negative, multiply by -1 to make it positive.
if (diff < 0) diff = diff * -1;
// if the difference is less than or equal to ¼ inch, turn on red LED.
if (diff <= 0.25)
digitalWrite(led, HIGH);
digitalWrite(led, LOW);
  //Total the two sensors together (including the length of the box they are attached to
   box = 3.45;
   Total = inchesA + inchesB + box;
 //Write Results to Parallax LCD:  
  mySerial.write(12);                 // Clear            
  mySerial.write(17);                 // Turn backlight on
  delay(5);                           // Required delay
  mySerial.print(Total);              // First line
  mySerial.write(13);                 // Form feed
  mySerial.print("Inches Total");     // Second line

//Convert Microseconds to Inches (default Parallax conversion is no good
float microsecondsToInches(long microseconds)
   //return microseconds / 148.0;
    return microseconds * 0.00675676;
« Last Edit: February 06, 2013, 01:44:07 pm by Steelcity74 » Logged

Pages: [1]   Go Up
Jump to: