Hi Guys,
I´m having trouble getting good readings from my BBQ Temp probe attached to a NodeMCU. I measure aroung 245 °C room temperature where should be 22°C...
I´m using a 10K resistor and I measured a resistance of the probe of 50.000 Ohm at 24 °C. Below you can find my code and hopefully you can give me some hints what I am doing wrong...
I´m using this probe, unfortunately I have no datasheet: https://smile.amazon.de/gp/product/B071HC9S75/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
// which analog pin to connect
#define THERMISTORPIN A0
// resistance at 25 degrees C
#define THERMISTORNOMINAL 50000
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000
uint16_t samples[NUMSAMPLES];
void setup(void) {
Serial.begin(9600);
// analogReference(EXTERNAL);
}
void loop(void) {
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
Serial.print("Average analog reading ");
Serial.println(average);
// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);
float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");
delay(1000);
}
PS This code is from Adafruit
edit:
I also made this readings and added them to this online calculator (I hope I am on the right track...):
So I changed my code to this:
// which analog pin to connect
#define THERMISTORPIN A0
// resistance at 25 degrees C
#define THERMISTORNOMINAL 47945
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3716
// the value of the 'other' resistor
#define SERIESRESISTOR 10000
uint16_t samples[NUMSAMPLES];
void setup(void) {
Serial.begin(9600);
// analogReference(EXTERNAL);
}
void loop(void) {
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
Serial.print("Average analog reading ");
Serial.println(average);
// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);
float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");
delay(1000);
}
which gives me. again, false readings:
Average analog reading 943.80
Thermistor resistance 119166.69
Temperature 4.70 *C
edit2:
I also noticed, that the temp shown in the serial monitor is getting higher when it should go lower (cup full of hot water is cooling down...)
edit3:
below is my actual setup, maybe you see some wiring problem!?
5V into 10K resistor, A0 to resistor, probe to resistor and probe to ground.
What makes me curious is, that my attached multimeter is showing a minus value. When removing probe from ground it´s returning back to 45.000-50.000 Ohm which is the actual resistance of the probe.
edit4:
Ok, I found out I get bad readings from my multimeter when the probe is connected to the MCU. So below is my actual code for testing the resistance measurements now. Unfortunately the resistor readings of the MCU are stille different to what my multimeter says. The MCU reports a restistance of 78189.65 and my multimeter says 56300. Because of this difference I cannot get correct temperature measurements.
I have no idea what I could improve now, I hope you can still support me here! I also updated my measurements for the steinhart calculation:
// the value of the 'other' resistor
#define SERIESRESISTOR 10000
// What pin to connect the sensor to
#define THERMISTORPIN A0
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
float reading;
reading = analogRead(THERMISTORPIN);
Serial.print("Analog reading ");
Serial.println(reading);
// convert the value to resistance
reading = (1023 / reading) - 1; // (1023/ADC - 1)
reading = SERIESRESISTOR / reading; // 10K / (1023/ADC - 1)
Serial.print("Thermistor resistance ");
Serial.println(reading);
delay(1000);
}
edit 6:
I changed my resistor from 10K to 100K, now I get resistance readings of around 54.000 which is much closer to 56.000 but still makes a difference of 5°C...