Pages: [1] 2   Go Down
Author Topic: decimal point in temp reading  (Read 1885 times)
0 Members and 1 Guest are viewing this topic.
The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
* 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
}
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45982
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45982
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fare enough,

Code:
vfd.print(int(Thermister(analogRead(1))));

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

Offline Offline
Edison Member
*
Karma: 31
Posts: 1417
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
Logged

Where are the Nick Gammons of yesteryear?

Austin, TX
Offline Offline
Faraday Member
**
Karma: 63
Posts: 6049
Baldengineer
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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?
Logged

Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45982
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The VFD is using,
Code:
#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....
Logged

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45982
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Austin, TX
Offline Offline
Faraday Member
**
Karma: 63
Posts: 6049
Baldengineer
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
}

Logged

The people's republic of Massachusetts
Offline Offline
Full Member
***
Karma: 0
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...  smiley-wink
Logged

Pages: [1] 2   Go Up
Jump to: