For those of you who are considering the 1kW immersion heater option, I have just completed my install using the Current Cost CT's suggested by paulreed and Picaxe 18M2 controller. My panels are a 4kW installation but as this is a maximum capability I thought it better to use the 1kW heater as it was more likely to be useful.
The CT interface design can be found in post #14 at the following location. The value of R1 needs to be changed to around 47 ohm if using the Current Cost CT's.
Mesuring currents on residentials conexions with my PICAXE - Page 2
The rest of the design uses standard interface circuits described in section 3 of the PICAXE manual to switch a relay on an off depending on the power being generated, if you use a project board the darlington pair in this terface is already on the ULN2803A chip supplied with the board.
The CT's are clamped on the inverter and the house load tails and monitor the generation and house load constantly.
Once the inputs have been calibrated, i.e. noting the values being written to the variables from the READADC10 inputs the code can be written to ensure the heater is switched on when there is sufficient surplus power being generated. I need to do a bit more work on the coding but it is working fine and heats sufficient water for our needs on most days. I switch the heater off after about an hour to avoid overuse of the heater thermostat.
A copy of the code in current use is set out below, it looks much neater in the programmer but most of the TABS have been stripped out by the editor this forum uses;
main:
readadc10 C.0,w0 ;Read C.0 value and write it to w0
readadc10 C.1,w1 ;Read C.1 value and write it to w1
if w0 > 10 then
goto test ;when w0 is greater than 10 goto test sub procedure
endif
if w0 = 0 then
goto byebye ;when w0 is zero goto byebye sub procedure
endif
pause 500 ;wait 0.5 seconds
goto main ;go to start
test: ;make sub procedure called test
readadc10 C.0,w0 ;Read C.0 value and write it to w0
readadc10 C.1,w1 ;Read C.1 value and write it to w1
let w2 = w1 + 3 ;add equivalent of 1kW to value of w1 to evaluate current to power
;heater and write to w2.
if w3 = 3600 then
goto byebye2 ;when w3 is 360 goto byebye2 sub procedure because the heater has been on for an hour
endif
if w0 > 10 and w2 < 8 then
goto sw_on ;when w0 is greater than w2 goto sw_on sub procedure
endif
goto main ;go to start
byebye: ;make sub procedure called byebye
let w3 = 0 ;reset the w3 variable to zero
sleep 130 ;sleep for approx 5 minutes
goto main ;go to start
byebye2: ;make sub procedure called byebye2
sleep 6240 ;sleep for approx 4 hours
let w3 = 0 ;reset the w3 variable to zero
goto main ;go to start
sw_on: ;make sub procedure called sw_on
do
high B.4 ;LED on
high B.5 ;Relay On
high B.6 ;Relay On
pause 1000 ;pause 1 second
inc w3 ;increment variable w3
readadc10 C.0,w0 ;Read C.0 value and write it to w0
readadc10 C.1,w1 ;Read C.1 value and write it to w1
if w0 <= w1 then exit ;exit from loop if generated power is less than load
if w0 < 10 then exit ;exit from loop if w0 falls below 10
loop while w3 < 3600 ;loop while b3 is less than 3600 which should equate to 60 minutes
low B.4 ;LED off
low B.5 ;Relay off
low B.6 ;Relay off
goto main ;loopback to start.
Hope this is of use. Thanks to paulreed who set me off on this project following his original post.