Go Down

### Topic: decimal point in temp reading (Read 4344 times)previous topic - next topic

#### 2660

##### Jan 31, 2012, 12:45 am
I have pieced this code together to read and average thermistor readings.  It works fine but I am trying to figure out how to show it to one decimal.

output as is = xx F
I would like = xx.x F

Code: [Select]
`/** Thermistor Function, read thermistor and return an averaged value*/double Thermister(int RawADC) { double Temp; Temp = log(((10240000/RawADC) - 10000)); Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp ); Temp = Temp - 273.15;            // Convert Kelvin to Celcius Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit //return Temp; float averageTemp; // create a float to hold running average for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0    averageTemp += ((Temp - averageTemp)/(float)i); // get next sample, calculate running average return averageTemp; // return average temperature reading}`

#### PaulS

#1
##### Jan 31, 2012, 01:04 am
That code does not output the temperature. Therefore, no code changes are required IN THAT CODE.

#### 2660

#2
##### Jan 31, 2012, 01:07 am

That code does not output the temperature. Therefore, no code changes are required IN THAT CODE.

I suppose it depends on what your definition of output is.  It does RETURN a value...

#### PaulS

#3
##### Jan 31, 2012, 01:10 am
Quote
It does RETURN a value...

Sure, and that value is a double. Therefore, it has, by definition, a fractional part.

That you do not see the fractional part means that whatever code is showing you the value is doing so in a way other than what you want. But, we can't see that code.

#### 2660

#4
##### Jan 31, 2012, 01:18 am
Fare enough,

Code: [Select]
`vfd.print(int(Thermister(analogRead(1)))); `

So I am thinking it's the int()?
How do I only display one past the decimal point?

#### el_supremo

#5
##### Jan 31, 2012, 01:21 am
Code: [Select]
` float averageTemp; // create a float to hold running average for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0    averageTemp += ((Temp - averageTemp)/(float)i); // get next sample, calculate running average`

This code doesn't do anything useful.
The declaration of averageTemp will cause it to be initialized with a random value which makes the for loop start its "running average" with a random value.
The for loop uses the same value of Temp every time so it is not generating a running average.

Pete
Don't send me technical questions via Private Message.

#### James C4S

#6
##### Jan 31, 2012, 01:24 am

Code: [Select]
`vfd.print(int(Thermister(analogRead(1)))); `

Debugging small sections of code never makes it simple for those trying to help you.  What vfd library are you using?  Does it support printing floats?
Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

#### PaulS

#7
##### Jan 31, 2012, 01:25 am
Quote
So I am thinking it's the int()?

Yes. That is casting the double to an int.

Quote
How do I only display one past the decimal point?

The first thing that you need to do is get rid of the int() part. The, you may or may not actually be able to do what you want. Again, we can't help because we have no idea what class the vfd object is an instance of.

#### 2660

#8
##### Jan 31, 2012, 01:37 am
The VFD is using,
Code: [Select]
`#include <Ncr4X20Vfd.h>`
It will print xx.xx with the int() removed from the print statement.

I am also displaying the value on webpage using the Ethernet shield with client.print()  each behave the same so far.

As for posting the full code the forum will not allow me to, it exceeds the max characters allowed....

#### 2660

#9
##### Jan 31, 2012, 01:38 am

Code: [Select]
` float averageTemp; // create a float to hold running average for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0    averageTemp += ((Temp - averageTemp)/(float)i); // get next sample, calculate running average`

This code doesn't do anything useful.
The declaration of averageTemp will cause it to be initialized with a random value which makes the for loop start its "running average" with a random value.
The for loop uses the same value of Temp every time so it is not generating a running average.

Pete

Good point, I am open to suggestions.

#### PaulS

#10
##### Jan 31, 2012, 01:45 am
If the Ncr4X20Vfd class derives from Print, then adding a 2nd argument to the vfd.print() call will allow you to specify the number of decimal places.

Code: [Select]
`vfd.print(Thermister(analogRead(1)), 1); `
should show one decimal place.

The Client class does derive, at least indirectly, from the Print class, so the optional 2nd argument CAN be used to limit (or increase) the number of decimal places.

#### 2660

#11
##### Jan 31, 2012, 01:55 am
Thank you, I did not know you could do that.

#### James C4S

#12
##### Jan 31, 2012, 01:57 am

As for posting the full code the forum will not allow me to, it exceeds the max characters allowed....

Attaching the project file or pastebin.com are alternative options.
Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

#### 2660

#13
##### Jan 31, 2012, 01:59 am

Code: [Select]
` float averageTemp; // create a float to hold running average for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0    averageTemp += ((Temp - averageTemp)/(float)i); // get next sample, calculate running average`

This code doesn't do anything useful.
The declaration of averageTemp will cause it to be initialized with a random value which makes the for loop start its "running average" with a random value.
The for loop uses the same value of Temp every time so it is not generating a running average.

Pete

I just split it back into two classes so "Temp" would change on every evaluation.
Quote

/*
* Thermistor Function, Read thermistor and return a value in deg. F
*/
double Temp;
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15;            // Convert Kelvin to Celcius
Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}

/*
*/
float AvrageTemp(int analog_pin){
float averageTemp; // create a float to hold running average
for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0
averageTemp += ((Thermister(analog_pin) - averageTemp)/(float)i); // get next sample, calculate running average
return averageTemp; // return average temperature reading
}

#### 2660

#14
##### Jan 31, 2012, 02:01 am

As for posting the full code the forum will not allow me to, it exceeds the max characters allowed....

Attaching the project file or pastebin.com are alternative options.

Or the forum settings could be changed to allow larger posts...

Go Up

Please enter a valid email to subscribe