Author Topic: Need help  (Read 2374 times)

0 Members and 1 Guest are viewing this topic.

Offline tony3dTopic starter

  • Frequent Contributor
  • **
  • Posts: 393
  • Country: us
Need help
« on: February 21, 2014, 03:19:02 pm »
Just starting out with Arduino, and by piecing together code from two programs, I've managed to display distance in both cm, and inches to my LCD dsiplay! Now how do I convert the values from Integert o Floating Point? I just don't know enough about programming yet. Thanks!
 

Offline c4757p

  • Super Contributor
  • ***
  • Posts: 7799
  • Country: us
  • adieu
Re: Need help
« Reply #1 on: February 21, 2014, 03:23:04 pm »
Just store them in a floating point variable.

But using floating point in a microcontroller is generally a bad idea - the FP code takes up a ton of space and is usually unnecessary. Can we see your code?
No longer active here - try the IRC channel if you just can't be without me :)
 

Offline tony3dTopic starter

  • Frequent Contributor
  • **
  • Posts: 393
  • Country: us
Re: Need help
« Reply #2 on: February 21, 2014, 03:37:53 pm »
Sure. I would just like to be able to get a more accurate reading,

/* Ping))) Sensor and LCD Readout

This sketch reads a PING))) ultrasonic rangefinder and displays the
distance to the closest object in range. To do this, it sends a pulse
to the sensor to initiate a reading, then listens for a pulse
to return. The length of the returning pulse is proportional to
the distance of the object from the sensor.

http://www.arduino.cc/en/Tutorial/Ping
http://glennlangton.blogspot.com

created by David A. Mellis and Tom Igoe
modified to include LCD readout by Glenn Langton
*/

// include the library code:
#include  <LiquidCrystal.h>


LiquidCrystal  lcd(12, 11, 5, 4, 3, 2);

// pin number of the sensor's output:
const int pingPin = 7;

void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
// set the cursor to column 0, line 0
//lcd.setCursor(0, 0);
// Print inches to the LCD.
lcd.print("Inches");
lcd.setCursor(0, 1);
// Print cm to the LCD.
lcd.print("Centimeters");
// initialize serial communication:
Serial.begin(9600);
}

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);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
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(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);

// convert the time into a distance
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

Serial.print(inches);
Serial.print(" in, ");
Serial.print(cm);
Serial.print(" cm, ");
Serial.println();

// set the cursor to column 8, line 0
lcd.setCursor(7, 0);
lcd.print("   ");
lcd.setCursor(7, 0);
lcd.print(inches);
// set the cursor to column 8, line 1
lcd.setCursor(12, 1 );
lcd.print("   ");
lcd.setCursor(12, 1);
lcd.print(cm);

delay(500);
}

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.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
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;
}
 

Offline c4757p

  • Super Contributor
  • ***
  • Posts: 7799
  • Country: us
  • adieu
Re: Need help
« Reply #3 on: February 21, 2014, 03:43:13 pm »
That's pretty easy. What I would do is change your microsecondsToInches to return mils (thousandths of an inch) instead:

Code: [Select]
long microsecondsToMils(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.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
return (1000 * microseconds) / 74 / 2;
}

Make sure to do the multiplication first so that you don't incur rounding errors from the division. Do something similar with the Centimeters function.

Now, when you display the number, just insert the decimal point manually - instead of ABCDE mils, display AB.CDE inches.

You might have to change 'long' to 'long long' depending on the maximum length. I'd do 'unsigned long long'.
No longer active here - try the IRC channel if you just can't be without me :)
 

Offline tony3dTopic starter

  • Frequent Contributor
  • **
  • Posts: 393
  • Country: us
Re: Need help
« Reply #4 on: February 21, 2014, 04:47:17 pm »
Thanks. Sound a bit complicated for a beginner, but I'll give it a try. It would just be nice to display down to the decimal.
 

Offline Stonent

  • Super Contributor
  • ***
  • Posts: 3824
  • Country: us
Re: Need help
« Reply #5 on: February 25, 2014, 01:46:38 am »
I've been trying to figure out what to do with my Noritake displays, this sounds fun. I've got a few Chinese ultrasonic sensors (the ones with either 1 more or 1 less pin than the Parallax sensors)
The larger the government, the smaller the citizen.
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf