NTC Thermistor Wrong Reading
Your NTC thermistor temperature readings are inaccurate, non-linear, or inconsistent. The displayed temperature doesn't match the actual temperature. This guide covers voltage divider design, Beta value selection, Steinhart-Hart equation calibration, and ADC configuration for ESP32, ESP8266, and Pico W.
Last updated: April 22, 2026 | 12 min read
Symptoms
- Temperature readings consistently off by several degrees
- Error changes with temperature
- Readings inaccurate at room temperature but correct at extreme temperatures
- NTC resistance doesn't match datasheet values
- Temperature jumps or fluctuates erratically
- Different NTC sensors give different readings at same temperature
- OceanRemote offset doesn't fix error across entire temperature range
Common Causes
- Wrong Beta Value () Most common issue. NTC thermistors have different Beta values . Using wrong Beta causes large non-linear errors
- Incorrect Voltage Divider Resistor Series resistor value mismatch with NTC range. 10k NTC needs 10k series resistor for best linearity
- ADC Resolution/Saturation ADC reading at extremes indicates voltage divider out of range
- Self-Heating of NTC Too much current through NTC warms the sensor, reading high
- Poor Thermal Contact NTC not properly contacting measured surface
- ADC Reference Voltage Variation ESP32/Pico W 3.3V rail may not be exactly 3.3V
- Noise on ADC Input No capacitor filtering on ADC pin
Common NTC 10k Specifications
| Parameter | Value | Notes |
|---|---|---|
| Resistance at 25C | 10k 1% or 5% | Most common value () |
| Beta Value () | 3435, 3950, 4100 | Check datasheet! (!) |
| Temperature Range () | -40C to +125C | Varies by model () |
| Dissipation Constant () | ~2-10 mW/C | Self-heating affects accuracy () |
| Thermal Time Constant () | 5-15 seconds | Response time () |
| B Tolerance | 1-5% | Causes non-linear error () |
Most cheap NTCs have Beta=3950 . Check your datasheet.
10k NTC Resistance Reference
| Temperature | Resistance () | Voltage Divider Output | ADC Value |
|---|---|---|---|
| -10C | ~55,000 | 0.50V | ~620 |
| 0C | ~32,000 | 0.80V | ~990 |
| 10C | ~19,900 | 1.10V | ~1365 |
| 20C | ~12,500 | 1.45V | ~1800 |
| 25C | 10,000 | 1.65V | ~2048 |
| 30C | ~8,000 | 1.85V | ~2295 |
| 40C | ~5,300 | 2.20V | ~2730 |
| 50C | ~3,600 | 2.45V | ~3040 |
| 60C | ~2,500 | 2.65V | ~3290 |
| 70C | ~1,800 | 2.80V | ~3475 |
| 80C | ~1,300 | 2.90V | ~3600 |
| 100C | ~700 | 3.05V | ~3785 |
ADC should NOT be near 0 or 4095. Adjust series resistor if needed.
Voltage Divider Circuit
3.3V
NTC 10k NTC
ADC Pin
R_fixed 10k fixed resistor
GND
Vout = Vref * )
R_ntc = R_fixed * - 1)
Step-by-Step Fixes
1. Verify Beta Value in OceanRemote
Most common fix use correct Beta value for your NTC:
- Check your NTC datasheet for Beta value
- Common values: 3435, 3950, 4100
- In OceanRemote firmware generation, select correct Beta value
- If unsure, try 3950 first
- Test at known temperatures
- Adjust Beta up or down if readings are consistently off
2. Calculate Beta from Two Temperature Points
Measure actual Beta value for your specific NTC:
// Beta formula: = ln /
// R1 = resistance at T1
// R2 = resistance at T2
// Example:
// Measure resistance at 25C : R1 = 10,000
// Measure resistance at 85C : R2 = 1,400 (typical)
//
// = ln /
// = ln /
// = 1.966 / 0.000562 = 3,498
// Use this Beta value in OceanRemote configuration
3. Verify Voltage Divider Resistor Value
Series resistor should match NTC resistance at target temperature:
- For 10k NTC, use 10k 1% series resistor
- For best linearity, R_series = R_ntc at target temperature range midpoint
- For -20C to +80C, use 10k
- For high temperatures only, use lower series resistor
- For low temperatures only, use higher series resistor
- Measure actual series resistor with multimeter
4. Prevent Self-Heating
Excessive current through NTC heats the sensor:
- Power NTC only when taking readings
- Use higher series resistor to reduce current
- Take readings less frequently
- Check if temperature reading drops when power is removed
- For 3.3V, 10k series gives ~0.33mA at 0C, ~1.7mA at 100C
// Read NTC only when needed
unsigned long lastNTCRead = 0;
const unsigned long NTC_READ_INTERVAL = 5000; // Read every 5 seconds
void loop() {
if (millis() - lastNTCRead >= NTC_READ_INTERVAL) {
lastNTCRead = millis();
// Power NTC through GPIO pin (optional)
// digitalWrite;
// delay; // Allow settling
readNTC(); // Take measurement
// digitalWrite; // Turn off to save power
}
}
5. Add Capacitor Filtering
Reduce ADC noise with capacitor:
// Hardware fix - Add 0.1F - 1F capacitor between ADC pin and GND
// This filters high-frequency noise
// Software filter - Average multiple readings
float readNTCAverage {
long sum = 0;
for {
sum += analogRead(pin);
delayMicroseconds;
}
return sum / samples;
}
6. Calibrate Using OceanRemote Offset
After fixing hardware and Beta, use offset calibration:
- Place NTC and reference thermometer in ice water
- Wait 10 minutes for temperature to stabilize
- Record OceanRemote temperature reading
- Calculate offset = Reference - Reading
- Enter offset in OceanRemote dashboard
- Verify at room temperature
- If error persists, adjust Beta value further
7. Check ADC Reference Voltage
ESP32/Pico W 3.3V may not be exactly 3.3V:
// Measure actual 3.3V pin voltage with multimeter
// Let's say you measure 3.28V
// Use actual reference voltage in calculations
const float ACTUAL_VREF = 3.28; // Replace with your measured value
// In Steinhart-Hart, ADC to voltage conversion:
float voltage = / 4095.0) * ACTUAL_VREF;
// Then calculate resistance:
float r_ntc = R_SERIES * - 1.0);
Steinhart-Hart Equation
// Steinhart-Hart equation: 1/T = A + Bln + C)
// For 10k NTC :
// A = 0.001129148
// B = 0.000234125
// C = 0.0000000876741
float readNTCTemperature {
// Read ADC and calculate resistance
int adc = analogRead(pin);
float voltage = * 3.3;
float r_ntc = seriesResistor * - 1.0);
// Steinhart-Hart calculation
float logR = log(r_ntc);
float steinhart = A + + ;
float temperatureK = 1.0 / steinhart;
float temperatureC = temperatureK - 273.15;
return temperatureC;
}
// OceanRemote uses Steinhart-Hart with your selected Beta value
// Beta approximation: B = ) * ln
// Less accurate than Steinhart-Hart, but simpler
Prevention Tips
- Always use 1% tolerance series resistor for voltage divider
- Choose NTC with known Beta value from datasheet
- Add 0.1F capacitor between ADC pin and GND
- Average 16-64 samples to reduce noise
- Prevent self-heating by reading NTC less frequently
- Calibrate at two temperatures
- Use OceanRemote's offset calibration for final adjustment
Related Issues
Frequently Asked Questions
Q: Why does my NTC read correctly at 25C but wrong at 0C and 100C?
A: Beta value is incorrect. Beta determines the curve shape. A correct Beta gives accurate readings across the entire range. Use two-point calibration to calculate correct Beta for your specific NTC.
Q: Can I use 5V for NTC voltage divider?
A: Not directly. ESP32/Pico W ADC input maximum is 3.3V. Using 5V requires a voltage divider to reduce output below 3.3V, or use 3.3V for both reference and ADC. 3.3V is recommended.
Q: OceanRemote offset calibration works, but why is Beta still important?
A: Single offset only corrects error at one temperature. If error changes with temperature , offset won't fix all temperatures. Correct Beta ensures accuracy across entire range; offset then fine-tunes the last 0.5C.
Still having NTC issues? Contact Support or return to the Troubleshooting Hub.