VDO NTC Fluide Temperature Probe, Steinhart Hart Coefficients?

Hello Arduino-Community,

I'm trying to make Oil-Temp Display with my uno.
I'm using a VDO/Raid Fluid Temperature Probe.
Like this one:

It has this characteristic:
31 Ohm 150°C
37 Ohm 140°C
45 Ohm 130°C
60 Ohm 120°C
81 Ohm 110°C
109 Ohm 100°C
149 Ohm 90°C
208 Ohm 80°C
300 Ohm 70°C
439 Ohm 60°C
660 Ohm 50°C
1008 Ohm 40°C
1608 Ohm 30°C
2581 Ohm 20°C
4367 Ohm 10°C
6770 Ohm 0°C

I was trying to calcute the Temperature with the "Steinhart Hart" Equation.
But I'm not very good in maths, so i dont know how to calculate the Steinhart Hart Coefficients A, B and C.

Can you please help me to get theese :)?

Best regards

Can this be helpful ?

Hello Caltoa,

yes, this is very helpful! Thanks!!!


You maybe better off just interpolating into the table which you already quoted.

I'm not very familiar with lookup tables. You think LUT is the better solution?

Best regards

Well if you read that micro-squirt thing, they are using their calculator to find those steinhart-hart coefficients, and then they are constructing a 1000-element look-up table for their device. Arduino cannot usually afford the luxury of a 1000-element lookup table.

You got a choice of using a lookup table, or calculating logarithms all the time. Neither is ideal, although in reality you probably don't need to read you oil temperature more than once a second, so you got plenty of time to calculate the logarithms.

It seems a bit strange to me, that you can define this curve with three parameters one way, but if you use their beta method, you can define the curve with two parameters.

You got that list there of 18 points, depending on your requirements that is probably enough. Algorithm to look it up is very simple.

What i dont understand is, where to get the value of ?.
How can i get the Beta-Value of my NTC, or is Beta a "general" constant?

I crushed the table with excel - found beta to be 4800

check out multimap - Arduino Playground - MultiMap -

You can make a mapping of the analogRead values directly upon temperature (no need to convert to ohms first)

you just need to define 2 arrays and multimap will do the interpolation.

Thanks to all of you.
It's now working. I used the Steinhart Hart equation with the constances calculated by the tools from the Microsquirt page.

  Resistance=((1024 * ntcpad / RawADC) - ntcpad); 
  Temp = log(Resistance); 
  Temp = 1 / (0.0016217297152479903 + (0.00022278961444808726 * Temp) + (1.0813481443911684e-7 * Temp * Temp * Temp));

It works like a charm :slight_smile:


I hope that 'ntcpad' is a float, and it is best to do the calculation with floats.

Resistance=((1024.0 * ntcpad / (float) RawADC) - ntcpad);

AS the arduino only has 7 significant float digits (UNO assumed you could use "shorter floats"

Temp = 1 / (1.6217297e-3 + (2.227896e-4 * Temp) + (1.081348e-7 * Temp * Temp * Temp));

this is good connection type for arduino ?

Which resistor use as a Rp or no matter ?


  Resistance=((1024 * ntcpad / RawADC) - ntcpad); 

Temp = log(Resistance);
Temp = 1 / (0.0016217297152479903 + (0.00022278961444808726 * Temp) + (1.0813481443911684e-7 * Temp * Temp * Temp));

RawADC - is AnalogRead from sensor
ntcpad - is ?

Can You show more code, and schema of circuit please . I need to understand this :slight_smile:

I dont get it i have found this:


Here :
Resistance = (1023 /ADC -1) * BalanceResistor

Why it looks like this : Resistance=((1024 * ntcpad / RawADC) - ntcpad); ?

what is ntcpad ?

Ok... i get it... there are 2 resistors... so: