Simple Solar Water Heater Controller

Schematic and PCB

The design features:

Two of the mega ADC inputs are connected to two temperature sensors one on the pipework near the tank outlet (pump inlet) and one on the solar collector outlet. The temperature difference between these two sensors is used to determine if the pump should be run or not.

The sensors I used were from Rapid electronics (they have a resistance at 25°C of 10k and a B coefficient of 3435). If different sensors are to be used then it may be necessary to recompile the code.

The Eagle files can be downloaded here.


The populated display board looks like this:

and the power board like this:

The two boards were built into a clear lid box (photo above) with separate cable glands for the mains, pump and sensor leads. The power board is mounted inside the bottom half of the box; the display board inside the clear lid. This construction allows the connections to the outside world to be fixed in place and allows the display panel and its micro controller to be removed. Additional holes are drilled in the clear lid to give access to the control switches and LCD contrast pot.


The hex files and fuse information are available here.

At the time of preparing this web page I'm still working on the C libraries that support this project. If you want the code now, then get in touch.


The LCD contrast control just needs setting to give a readable display and then left alone.

The two switch controls require a slightly longer explaination. The controller wants to switch on the circulating pump when there is a temperature difference between the tank temperature (measured on the pump inlet pipe) and the solar collector outlet temperature. This temperature difference needs to be a few °C to prevent the pump switching on and off frequently. Additionally, as the temperature difference falls there needs to be some hysteresis again to prevent the pump switching frequently. These temperatures are controlled by the two rotary switches.

Starting with the pump off…

Each switch position increments increments its temperature setting by 0.5°C; giving each a range of 0 - 7.5°C and 0.5 - 14.5°C "on temperature" range (see below for the reason why 0 - 15°C is not realised). In practice I have found an "off" setting of 2°C and a hysteresis of 4°C works well for my system. But these temperature settings should be optimised for a particular installation.

The two rotary switches also allow the pump to be held off or forced to run: