Coolant Temperature Sender

Scorpio / Scorpio Cosworth Discussions - Questions, problem resolution, general talk, technical tips and modifications.
brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Sun Feb 21, 2016 8:56 pm

I tested the TS-58 sensor with hot water and gauge deflection looks OK. So electrically the sensor is correct.

I did not yet mount the sensor. I believe the best approach is to drill and tap a new hole on an open area
facet that is on the passenger side of the manifold. However I don't want to drill in this area unless I remove
the thermostat housing and can see that it is a safe place to drill into.

I have a new thermostat I want to install, but I did not have the rubber gasket. So this gets delayed until I can get
the gasket.

Meanwhile I had re-kindled an old idea that I had. This idea does away with the troublesome temperature gauge sensor entirely.
In this less intrusive approach, a special circuit is created that instead reads the ECT sensor (the one that the ECCIV uses)
and then drives the dash gauge.

What would be in this black box? One way would be to use something like an Arduino Pro-Mini
https://www.arduino.cc/en/Main/ArduinoBoardProMini

Run the ECT output to one of the ProMini's a/d inputs. The unit then uses pulse width modulation to drive a big MOSFET
that connects the temp gauge to ground. There are a few advantages to this approach. One is that you can now
calibrate the gauge. You could make certain letters in "NORMAL" displayed on the gauge correspond to specific temperatures.
Another aspect is that if the ECT sensor should ever fail you will instantly be made aware of the situation.

It sounds complicated but it really isn't too bad and I sure like the idea of soldering and writing a few lines of code
compared to drilling and tapping the manifold.

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Mon Feb 22, 2016 9:55 pm

OK, I have decided to abandon the TS-58 sensor.
I did a little experiment tonight that has convinced me of the "alternative" solution.

I happen to have one of these...
http://tinyurl.com/zq79k4y

On useful function this unit has is a PWM output. I wired this to an IRL540 MOSFET and hooked it up to the
temp sender wire on the Scorpio. I then turned on the ign key on to the run position and then ran the through the PWM percentage ranges to see how I could influence the temp gauge.

The real good news is the FET does not even get warm, even deflecting the meter to the full hot position.
That means no heat sink will be required.

Once I saw that things were working, I then mapped the pwm % time to various locations on the temperature gauge.

Feature on Gauge PWM on time
Red Line at top 60%
White border top 50%
Center of "N" 38%
Center of "O" 33%
Center of "R" 27%
Center of "M" 22%
White border bot. 12%
White line bottom 8%

I intend to map each of these locations with a specific temperature as measured from the ECT.
It is easy to find an ECT voltage vs. temperature chart on the web. I will probably make "O"
indicate 195F and make "R" 180F and extrapolate outward from there. This way if you are running
a 180F or 195F thermostat the gauge will read close to center for both cases.

The code for the little arduino board will be quite simple. It will loop endlessly reading the ECT voltage
and will take that reading and generate (via lookup table) the appropriate PWM output to drive the FET.
As described here: https://www.arduino.cc/en/Reference/AnalogWrite

Every 10 seconds or so I will have the code flash the built in LED on the arduino board to indicate the temperature.
This way you can look at the unit from the engine bay an know what the temp is while you are
working on the car! Pretty slick huh?

There will just be 4 wires to the unit. One to the existing sensor wire (no longer plugged on the old temp gauge sensor),
one wire to one side of the ECT, one wire to an IGN hot +12V, and one wire to ground. The whole thing will fit into a relay case that I can mount on the firewall or fender well.

This is not a costly solution BTW. These little arduino boards on ebay go for around $2-$3
IRL540 MOSFETS are also cheap on ebay.

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Sat Mar 05, 2016 8:24 pm

Well, I love it when a plan comes together...

Everything worked out perfectly! I will post all the relevant project files as a zip file for the benefit of any other ambitious Scorpio owners. Including schematics, code, wiring connections, etc.

Bye bye lousy temperature sender!

Right now I have this little controller mounted on the sheet metal plate that holds the harness against the fire wall.
It gets a little warm at that location, so I think I will relocate it near the battery where things are a bit cooler.

After I had determined everything was working, I decided to pot everything in the relay case with epoxy. I made it so that serial connection for the arduino board protrudes outside the relay case so I can still re-program the unit it if i need to make adjustments.

What I have noticed is that the temp gauge will climb a little higher (maybe to about 200F) until the thermostat opens then it will drop to 195F. This is very repeatable.

It's awesome. I can now "trust" the Scorpio temp gauge! The ability to watch the unit flash the temperature on the LED in engine bay is also very useful.

After I got this working this morning I proceeded to make the modification where the a/c clutch turns on the electric cooling fan, so it was nice to see what the temp impact was.

Worth all the trouble!

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Mon Mar 07, 2016 9:06 pm

Here is the arduino code....


/*
Ford Temperature gauge sensor replacement.
This code developed on a Arduino Pro-Micro 16mhz 5V variant
(must be 5V version)

The intended purpose is to eliminate the need for the large
NTC thermistor sensor used with the stock Ford temperature gauges.
These sensors have a high failure rate. For some reason
the one in the Merkur Scorpio is particularly unreliable.

Instead this controller reads the ECT sensor voltage (the temp
sensor that the EECIV uses) and then PWM drives a connected
IRL540 MOSFET which in turn drives the temperature gauge.

This is better for several reasons:
The ECT is a more precise thermistor.
The ECT is reliable.
Driving the gauge with a MOSFET should be more reliable.
We can now calibrate the gauge.

This code has been calibrated for a Ford Scorpio gauge but I suspect
it would work fine for other vehicles like the Ranger or Aerostar.

With this unit in place the temperature gauge range swings from
150F-230F. The center of the scale being about 190F

Presumably this unit would be mounted in the engine bay area.
It flashes a temperature code every 10 seconds on the Arduino LED.
This can be convenient while working on the engine.

Some tips:
12v power comes in the RAW input. It is advised to place an
inductive choke on the incoming power (100uH). In addition, a 15v
protection Zener diode should be placed between ground
and the raw input voltage. See Intel app note AP-125
"Designing Microcontroller Systems for Electrically
Noisy Environments"

Naturally the 12V souce should be switched with the ignition run
position.

The line from the ECT back to this unit should not route near any
ignition wires.

A ground shielded wire might be advantageous. A .1uf capacitor to
ground on the wire will help reduce any noise it might pick up.

I have found that an old auto relay case makes a suitable housing.

We are hardly scratching the surface here. There is plenty more that could
be done with this code and we are barely utilizing this arduino.

Some ideas...
How about a temperature logging feature?
Store in eeprom or output on serial to a connected laptop?
Tickle a Piezo buzzer if the temp gets too high?
Connect a another FET to turn on electric fan at a certain temp?
Downloadable temperature profile?
Up down buttons to adjust temperature profile/calibration?


Use at your own risk. This code and all mentioned here
is not suitable for anything in particular. If you overheat your engine
or damage you car's ECU then it was all by your own hand.
Enjoy.

*/

int LEDPin = 13; // LED connected to digital pin 9
int FETDrivePin = 5; // MOSFET connected to 5
int ECTInputPin = 3; // ECT connected to analog pin 3

unsigned int val = 0; // variable to store the read value
unsigned int aval;
unsigned int tic;
unsigned int sum;
unsigned int a2dcircbuf[5]; //circular buffer to average samples.


//lookup table for pwm output value, indexed from a2d read value of ECT sensor.
//only covers the range 150-230F
int pwm_xlate[]={153,
144,
136,
128,
123,
119,
114,
110,
106,
101,
97,
91,
85,
82,
79,
77,
74,
72,
69,
67,
65,
63,
60,
58,
56,
53,
50,
48,
45,
42,
39,
37,
34,
31,
30,
28,
27,
25,
24,
22,
21};

/* ECT temp/voltages were taken from published charts on the web
and converted to a 0-255 a/d value that we expect to read.

Testing was performed to find the PWM % needed to make the guage
point to specific areas on the dial. Values in between key
points are interpolated

The end result is to be able to read the ECT voltage and do a table lookup
to get the PWM value needed to drive the gauge to desired position.

Temp ECT Read ECT V PWM% AnalogWrite8bit Feature on Scorpio Gauge
230 18 .35 60% 153 Red Line
19 144
20 136
220 21 .40 50% 128 White Bracket Top
22 123
23 119
24 114
25 110
26 106
27 101
200 28 .55 38% 97 "N"
29 91
195 30 .59 33% 85 "O"
31 82
32 79
33 77
34 74
35 72
180 36 .71 27% 69 "R"
37 67
38 65
39 63
40 60
41 58
175 42 .75 22% 56 "M"
43 53
44 50
45 48
46 45
47 42
48 39
49 37
160 50 .98 12% 34 White Bracket bottom
51 31
52 30
53 28
54 27
55 25
56 24
57 22
150 58 1.13 8% 21 White thick line bottom
*/


//Every so often we blink the arduino' built in LED to provide a visual
//indication of temperature that is easily viewed from the engine compartment.
//Pretty handy if you are working on the cooling system.
void blink_temp()
{
int blink;
int i;
blink=0;

if ((aval >= 18) && (aval <= 21))
blink=8; // 8 blinks temp 220-230
if ((aval > 21) && (aval <= 28))
blink=7; // 7 blinks temp 200-220
if ((aval > 28) && (aval <= 30))
blink=6; // 6 blinks temp 195-200
if ((aval > 30) && (aval <= 36))
blink=5; // 5 blinks temp 180-195
if ((aval > 36) && (aval <= 42))
blink=4; // 4 blinks temp 175-180
if ((aval > 42) && (aval <= 50))
blink=3; // 3 blinks temp 160-175
if ((aval > 50) && (aval <= 57))
blink=2; // 2 blinks temp 150-160
if (aval > 57)
blink=1; // 1 blink temp < 150

for(i=0;i<blink;i++)
{
digitalWrite(LEDPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(200); // wait for a bit
digitalWrite(LEDPin, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait for a bit
}
}


void setup()
{
pinMode(FETDrivePin, OUTPUT);
pinMode(LEDPin, OUTPUT); // sets the pin as output
//Serial.begin(9600); // open the serial port at 9600 bps:
//I've intentional made it so that upon startup the pointer moves
//to the thick white bar at the bottom of the gauge (150F). This small
//movement of the needle provides a visual cue that things are operational.

//fill the history buffer with the coldest setting on boot.
a2dcircbuf[0]=58;
a2dcircbuf[1]=58;
a2dcircbuf[2]=58;
a2dcircbuf[3]=58;
a2dcircbuf[4]=58;
tic=0;
}


void loop()
{
unsigned int pwmval;

delay(1000); // wait for a second
tic++;

val = analogRead(ECTInputPin); //read the input pin analogRead values go from 0 to 1023
val = val >> 2; //make it an 8 bit value

//limit the range, as pwm table only stores pwm values for the limited range (150-230F) of interest
if (val < 18)
val = 18;
if (val > 58)
val = 58;

a2dcircbuf[(tic % 5)]=val; //last 5 samples stored in circular buffer
//average a 5 sample history. Just in case there is noise
sum=a2dcircbuf[0]+a2dcircbuf[1]+a2dcircbuf[2]+a2dcircbuf[3]+a2dcircbuf[4]; //average them
aval=sum/5;

//Serial.print(aval);
//Serial.print("\n");

//lookup pwmvalue
pwmval=pwm_xlate[aval-18];
analogWrite(FETDrivePin, pwmval); // analogWrite values from 0 to 255

if ((tic % 10)==0) //every 10 seconds blink the temperature on the led
blink_temp();

}

FocusSVT
Level 5
Level 5
Posts: 714
Joined: Tue Aug 08, 2006 12:55 pm
Location: Andover, Ks.

Re: Coolant Temperature Sender

Post by FocusSVT » Wed Mar 09, 2016 5:42 am

Very impressive solution. Can you post pictures of the module?
Darren Needham
Andover, Ks.

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Thu Mar 10, 2016 10:40 pm

Here is the schematic. I'll take a picture of the module in the engine bay this weekend.

Image

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Thu Mar 10, 2016 11:13 pm

Some tips...

To test it on the bench - connect a potentiometer between 0-5v with the center wiper going to the ECT input.
Connect one side of a car light bulb to 12 volts and other side to the gauge connection on the FET.
Hook up 12v power and ground to the bench power supply.

You should find that there is a narrow range of the potentiometer that will alter the brightness of the bulb.
You should be able to see the different blink counts for the temperature ranges as you move the pot.

The inductor is a noise suppression coil. Probably could be safely omitted.
The zener should be used. It protects things from voltage surges from the alternator.

Now that I look at the picture I realize I am missing a diode.
You should also have a big diode for the +12v power coming in. Just in case you connect power backwards.

For the gauge wire connection I soldered the wire to a small brass bolt (that I cut the head off of) that would fit into the "socket cap" where the original sensor is. I put shrink tube over this. You can have this shorts here.

You can access the green/red ECT wire by tapping into the harness on the passenger side of the manifold.
Just cut some insulation back to expose some copper and tack the sense wire on.

I got my 12v accessory wire from the ignition switch as I had recently installed a remote start kit previously.

Make sure you have the battery disconnected while you are hooking everything up.
Solder everything, no twisting wires together. Double check your connections.

The whole circuit can fit into a gutted relay housing. After I confirmed operation I filled the housing with epoxy.
I then mounted the unit on sheet metal by the battery. two holes were drilled in the housing so the arduino LED's could be seen.

Usual disclaimers apply. I am not responsible for whatever you destroy...

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Mon Mar 14, 2016 7:18 pm

Here is where I mounted the module. Pardon the dirty engine bay, the front of the car picked up a lot of grit on the auto transport back in December and I still haven't gotten around to cleaning it yet. Word to the wise, get an enclosed transport if you can afford it.
Image

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Mon Mar 14, 2016 7:31 pm

The arrow shows where you can splice into the ECT wire (brown/green). The other wire goes to the other side to the gauge wire. I then routed the two wires in the small size corrugated wiring loom. That then went to the firewall and around the back side of the battery.

I had the car PA inspected over the weekend. Drove it around quite a bit and the gauge is working fine.

As I had indicated previously (and something of a little concern) that I have noticed is the temp gauge swings up to around 200-205F before the thermostat opens. Then it drops to the 195 point. This is no issue with this module but I think it's time to replace my thermostat.

I'm going to put in a 180F unit and drill a few 1/8" bypass holes in it.

Image

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Fri Sep 02, 2016 11:42 pm

I just wanted to post that my arduino temp gauge solution has made it through the summer and is still working fine.

In addition, I am not sure I mentioned that the board is "potted" into the relay case. The board was placed into the gutted relay case, and all openings were sealed with tape. These openings were the slot to allow the arduino serial pins to exit and two holes the were centered over the LEDs on the board. The board was inserted to the case along with all the extra bits and the bottom bladed connector of the original relay. Flowable epoxy was then poured into the case, filling it entirely.

This is how you make electronics survive the under hood environment.

Ed Lijewski
Level 8
Posts: 6993
Joined: Thu Sep 04, 2003 5:53 pm
Location: The Belly of The Beast

Re: Coolant Temperature Sender

Post by Ed Lijewski » Sat Sep 03, 2016 6:31 am

So....a month ago I noticed my Scorpio temp gauge read a bit higher than typical on 95* degree/70% humidity summer days with a/c on. I watched carefully over following days (only drove short trips of ~ 5/7 miles)n checking coolant level and a/c fan operation, and the gauge continued to rise noticeably further above the typical level until on one trip home it approached the red zone as I got to my driveway, and on engine shut off coolant temo rose further and was released by the reservoir cap.

I made a thorough check of everything cookant-related (including the fan clutch which was relatively new and the temp sensor); installed a new Motorcraft T-stat and on operation the temp gauge returned to typical indications from cold to fully warmed up.

Scorpio temp gauges obviously can fail but in my experience wrenching on Merks and other engines the T-stat is the prime suspect when the gauge begins to read atypically.

YMMV ;l
Descartes: "Cogito Ergo Sum"
Lijewski: "Sum Ergo Drive-O. Mucho!

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Thu Sep 08, 2016 1:08 pm

Rest assured that Scorpio Temp gauge sensors fail. I've owned two Scorpios and the sensors failed on both.

Usually when they fail the gauge shows and incorrect low reading and then does not move at all.

But thermostats fail too.

brokencase
Level 3
Level 3
Posts: 245
Joined: Sun Dec 06, 2015 12:18 pm
Location: PA

Re: Coolant Temperature Sender

Post by brokencase » Fri May 11, 2018 1:05 pm

Just wanted to re-post the circuit image since it appears to have been lost....
Image

Post Reply