Go Down

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

2660

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

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

2660


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

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

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

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

James C4S


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

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

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


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

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

Thank you, I did not know you could do that.


James C4S


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


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


How about this,
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 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;
}

/*
* avrage temp sensor reading
*/
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



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