const unsigned long measure_distance() {
-
pinMode(PING_SENSOR_IO_PIN, OUTPUT);
25
digitalWrite(PING_SENSOR_IO_PIN, LOW);
-
delayMicroseconds(2);
-
digitalWrite(PING_SENSOR_IO_PIN, HIGH);
-
delayMicroseconds(5);
-
digitalWrite(PING_SENSOR_IO_PIN, LOW);
30
pinMode(PING_SENSOR_IO_PIN, INPUT);
-
return pulseIn(PING_SENSOR_IO_PIN, HIGH);
-
}
-
-
void output_distance(const unsigned long duration) {
35
Serial.print("Distance to nearest object: ");
-
Serial.print(microseconds_to_cm(duration));
-
Serial.println(" cm");
-
}
-
This program doesn’t differ much from our first version. First, we use the
more accurate value 29.155 for the number of microseconds it takes sound
to travel 1 centimeter. In addition, the distance calculation now takes a
potential gap between the sensor and the case into account. If you plug the
sensor into a breadboard, usually a small gap between the sensor and the
breadboard’s edge exists. This gap is defined in line 5, and it will be used in
the distance calculation later on. The gap is measured in centimeters, and it
gets multiplied by two because the sound travels out and back.
The
loop
method looks much cleaner now, because the program’s main func-
tionality has been moved to separate functions. The whole sensor control
logic lives in the
measure_distance
method, and
output_distance
takes care of out-
putting values to the serial port. The big changes happened in the
microsec-
onds_to_cm
function. It returns a float value now, and it subtracts the sensor
gap from the measured duration. To make sure we don’t get negative values,
we use the
max
function.
Compile and upload the program, and you should see something like the
following in your serial monitor window:
Distance to nearest object: 17.26 cm
Distance to nearest object: 17.93 cm
Distance to nearest object: 17.79 cm
Distance to nearest object: 18.17 cm
Distance to nearest object: 18.65 cm
Distance to nearest object: 18.85 cm
This not only looks more accurate than our previous version, it actually is
more accurate. If you have worked with floating-point numbers in any pro-
gramming language before, you might ask yourself why the Arduino rounds
report erratum • discuss
Increasing Precision Using Floating-Point Numbers • 85
www.it-ebooks.info