There are some discrepancies between what is read by the analog channel for a thermistor, ohms values directly obtained on the thermistor using an ohmmeter, and another digital temperature sensor.
Figure 1: Left column (y axis) is degree Celcius; x axis is time (minutes). Orange is what was read by the analog channel (thermistor); in yellow the reading by a commercial digital sensor; and in green, manual readings of the thermistor using a ohm-meter.
A bit more context, we are building a simple system to read the temperature from a thermistor via an analog channel. Code algorithm is very similar to what is found here and the electronic layout inspired from here. When we ran into problems, we just went back to the working basics as instructed by those two above-mentioned references.
Pad resistor is 7K Ohms @ +/-1%, measured resistance was 6690 ohms Thermistor is 2252 Ohms @ 25 degree Celsius. Coefficients are as follow, coefficient were solved following a calibration in a thermal bath:
- COEFF_A = 0.0014644
- COEFF_B = 0.00023888
- COEFF_C = 9.8996E-08
Specs from vendor are here (PDF) factory coefficient are about the same. I tried to calculate with either factory and in-house calibrated and there is a few thousandth of a degree of difference between the two - not enough yet to explain the current problem
While investigating I saw some sketch with the same resistance for pad resistor and thermistor, but have seen other differing thus assume this is not an issue.
To troubleshoot and isolate the origin of the discrepancies of the orange line VS other reading, we used
- other thermistors (every single one behave similarly as the orange line in the figure 1)
- other digital temperature sensors (every single one behave similarly as the yellow line in the figure 1)
- we try to put 2 analog thermistors and 2 digital temperature sensors on the same arduino - analog were consistant between each other (discrepancies) and the digital one were behaving as expected (correctly)
- we switched the pad resistor, no effect
- other arduinos (did not changed anything, every single one was repeatedly demonstrating the same behaviour )
- used the system in a temperature controlled room and the discrepancy was still present for the analog channel and absent for the digital sensor.
To be clear, green and yellow are what we think is the 'real' temperature; and the orange is the discrepancy. About 1 - 2 degree differences
We used the raw analog value read by the arduino as an input to manually feed and solve the Steinhart–Hart equation (like using IPYTHON and by hand) and output is the same as the orange line. Did the same with the thermistor obtained by the ohm-meter (Green dots on figure).
What should be investigated next to solve the discrepancy between what is read by the analogue channel connected to a thermistor and what the same thermistor provide to the ohm-meter?
Sketch follows
#define THERMISTORPIN_0 0 // analog pin 0 on the board
#define SERIESRESISTOR_0 6990 // balance/pad resistor value (ohm)
#define THERMISTORNOMINAL 2252 // resistance at 25 degrees C
#define ZEROABS -273.15 // zero Kelvin (Celsius)
#define COEFF_A 1.4644E-03 // Coefficient A for Steinhart-Hart eq.
#define COEFF_B 2.3888E-04 // Coefficient B for Steinhart-Hart eq.
#define COEFF_C 9.8996E-08 // Coefficient C for Steinhart-Hart eq.
void setup()
{
Serial.begin(9600);
}
void loop()
{
float temp1;
temp1 = Thermistor(analogRead(THERMISTORPIN_0),SERIESRESISTOR_0);
Serial.println(temp1);
}
float Thermistor(int RawADC, long padResistance) {
long Resistance;
float Temp;
Resistance = padResistance / ((1023.0 / RawADC) - 1);
Temp = log(Resistance);
Temp = 1 / (COEFF_A + (COEFF_B * Temp) + (COEFF_C * pow(Temp,3)));
Temp += ZEROABS;
return Temp;
}