How to use a temperature sensors on a SPI

Technical Library › Sensors and other inputsUpdated Sep 2026

Run out of analog inputs and a spare SPI looks like the obvious home for a temperature sensor. On a dual-connector Elite, though, the stock calibration will read wrong because the SPI pull-up is ten times stronger than the AVI one. Here is the math to fix it, worked through step by step.

Which ECUs this applies to

InputPull-up to 5 VUse Haltech's calibration as-is?
AVI on any Haltech ECU1k ohmYes
SPI on Nexus ECUs and VCUs1k ohmYes, NSP's calibrations already match
SPI on dual-connector Elites (1000, 1500, 2000, 2500)10k ohmNo, it must be converted

ESP flags this too: pick an SPI for a temperature sensor and open the help for the pull-up setting and you'll find a note about it.

Why the pull-up changes the reading

A two-wire temperature sensor is a thermistor, a resistor whose value changes with temperature. The ECU can't read resistance directly, so it feeds 5 V through a fixed pull-up resistor into the sensor and measures the voltage in the middle. The pull-up and the sensor form a voltage divider:

V = 5 x R_sensor / (R_sensor + R_pullup)

Haltech publishes its sensor calibrations as voltage against temperature, and those voltages assume a 1k pull-up. Put the same sensor behind a 10k pull-up and every voltage changes, so the ECU would read the wrong temperature everywhere. The fix is to go back to resistance, then forward again with the new pull-up.

Step 1: turn each calibration voltage into resistance

Rearrange the divider formula for the sensor resistance, using the 1k pull-up the calibration was written for:

R_sensor = 1000 x V / (5 - V)

Say one row of the calibration reads 2.00 V. That gives 1000 x 2 / 3 = 667 ohms. Another row at 4.00 V gives 1000 x 4 / 1 = 4,000 ohms. The temperature on each row stays exactly as it was; only the voltage column is changing.

Step 2: work out the new voltage with a 10k pull-up

Plug each resistance back into the divider with 10,000 ohms as the pull-up:

V_new = 5 x R_sensor / (R_sensor + 10000)

667 ohms becomes 5 x 667 / 10,667 = 0.313 V. 4,000 ohms becomes 5 x 4,000 / 14,000 = 1.429 V.

The whole conversion at a glance

Voltage with 1k pull-upSensor resistanceVoltage with 10k pull-up
0.50 V111 ohms0.055 V
1.00 V250 ohms0.122 V
2.00 V667 ohms0.313 V
3.00 V1,500 ohms0.652 V
4.00 V4,000 ohms1.429 V
4.50 V9,000 ohms2.368 V

Do this for every row of your sensor's calibration, keep each row's temperature, and enter the new voltages in ESP against the SPI. A spreadsheet makes it a two-minute job: one column for the original voltage, one for resistance, one for the new voltage.

Watch the low end

Notice how the converted voltages bunch up near zero where the sensor resistance is low. Small voltage changes now represent bigger temperature changes, so resolution suffers in that part of the range. If the temperature you care about most falls there, an AVI is the better home for the sensor.

Checking your work

  • With the engine cold, the new reading should match ambient temperature and any other temperature sensor on the car.
  • As the engine warms, compare it against coolant temperature or a known-good gauge.
  • If it's way off at one end only, recheck the rows at that end; a single typo in the table is the usual cause.

For more on chasing wrong readings, see temperature sensor problem diagnosis. The same method works for any two-wire thermistor, whether it reads oil, air or fuel temperature. For setting the sensor up in ESP, see Oil Temperature Sensor and Intake Air Temperature Sensor.

FAQ

Do I need to do this on a Nexus?

No. Nexus SPIs use 1k pull-ups, so the standard calibrations work.

Can I just turn the SPI pull-up off?

Not for a two-wire thermistor. Without a pull-up there's nothing to create the voltage the ECU measures.

Does this apply to Elite AVIs?

No. AVIs use a 1k pull-up, so Haltech's calibrations are correct there. Stuck on a conversion? Send us your calibration and we'll help.