Need help - Page 1
Forum section: electronics / general

author: tony3d
author_rank: Frequent Contributor
timestamp: February 21, 2014, 03:19:02 pm
content: 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!

author: c4757p
author_rank: Super Contributor
timestamp: February 21, 2014, 03:23:04 pm
content: 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?

author: tony3d
author_rank: Frequent Contributor
timestamp: February 21, 2014, 03:37:53 pm
content: Sure. I would just like to be able to get a more accurate reading,/* Ping))) Sensor and LCD ReadoutThis sketch reads a PING))) ultrasonic rangefinder and displays thedistance to the closest object in range. To do this, it sends a pulseto the sensor to initiate a reading, then listens for a pulseto return. The length of the returning pulse is proportional tothe distance of the object from the sensor.http://www.arduino.cc/en/Tutorial/Pinghttp://glennlangton.blogspot.comcreated by David A. Mellis and Tom Igoemodified 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 distanceinches = 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 0lcd.setCursor(7, 0);lcd.print(" ");lcd.setCursor(7, 0);lcd.print(inches);// set the cursor to column 8, line 1lcd.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.pdfreturn 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;}

author: c4757p
author_rank: Super Contributor
timestamp: February 21, 2014, 03:43:13 pm
content: That's pretty easy. What I would do is change your microsecondsToInches to return mils (thousandths of an inch) instead:Code: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.pdfreturn (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'.

author: tony3d
author_rank: Frequent Contributor
timestamp: February 21, 2014, 04:47:17 pm
content: 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.

author: Stonent
author_rank: Super Contributor
timestamp: February 25, 2014, 01:46:38 am
content: 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)