Floor Heating Pump Switch

Copyright © 2012, Kees Krijnen.

Usually the pump of your floor heating system is active all year round, regardless a heating demand. A pump switch saves energy, by only engaging the pump for the floorheating when heating is requested. The pump works intermittently and will therefore last longer.

The pump switch described here is one for a floor heating system connected to district heating. Hot water - 60 degrees celcius - is externally and under pressure available. The thermostat (in this case a Honeywell Chronotherm IV) directly controls the hot water inlet valve to the floor heating.

Standard Heating Circuit

Standard heating circuit

Standard Pump Configuration

Standard pump configuration for district heating

I had some solid state relays available from stripped down obsolete equipment. These OPTO 22 solid state relays could be directly controlled by a microcontroller output, like the Microchip PIC10F202 where the IO pins are configured as one input (GP3, with pull up resistor) and three outputs (GP0, GP1 and GP2). GP3 is connected to the Chronotherm IV (or any thermostat) switch relay to signal a heat request. GP1 controls the wax thermostatic inlet valve, GP2 controls the water pump and GP0 controls the monitoring LED. The Microchip PIC10F202 is powered by a small wall charger/transformer and all parts fitted into the plastic box holding the 24V transformer. The Microchip microcontroller and OPTO 22 solid state relays could be replaced by other equivalent components. The OPTO 22 solid state relays are a bit oversized for the task.

Pump Switch Circuit

Pump switch circuit

Pump switch build into plastic box

Pump switch build into 24V transformer plastic box

New Pump Configuration

New pump configuration for district heating

GP2 controls the power for the pump as well as the 24V transformer. Solid state relays leak a small current when the control is inactive (off). If GP1 controls the 230V AC side of the 24V transformer the leak current is high enough to open the wax thermostatic inlet valve a little bit and therefore losing heating energy. The wax thermostatic inlet valve works by heating wax and its volume expansion moves a piston to open a mechanical valve. The wax thermostatic inlet valve is a slow operating valve. It takes about 2 minutes to open by heating (when fully closed and electrical current active) or closing by cooling (when fully opened and no electrical current). So GP1 controls the 24V side of the transformer, the solid state relay leak current is too low and the AC threshold to high to heat the wax when GP1 signals off. GP2 controls the 24V transformer as well because its idle power consumption is about 3W - and this is saved when no heat is requested. The pump switch (PIC10F202 and OPTO 22 solid state relays) idle power consumption is about 1W, mainly because of the solid state relay leak current when inactive.

The C-program PumpSwitch.c describes the pump switch control and should be compiled with the free HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) from the free Microchip MPLAB IDE. The PIC10F202 programmer should conserve the internal RC frequency calibration.

#include <htc.h>

// Set configuration.
__CONFIG(WDT_ON & CP_OFF & OSC_IntRC & MCLRE_OFF);

//---- local symbols ----
#define _XTAL_FREQ        4000000 // Required for __delay_ms().
#define HEAT_REQUEST      0x01
#define ON_COUNTER        0x02
#define PUMP_OFF_LOW_INTERVAL   10  // Pump OFF low interval in minutes, no heat request.
#define PUMP_OFF_HIGH_INTERVAL  240 // Pump OFF high interval in minutes, no heat request.
#define PUMP_ON_INTERVAL  2       // Pump ON interval in minutes, no heat request.
#define PUMP_ON_HOLD      30      // Hold pump ON in minutes after heat request.
#define ONE_DAY           24      // 24 * 1 hour == 1 day.
#define ONE_HOUR          60      // 60 * 1 minute == 1 hour.
#define ONE_MINUTE        60      // 60 * 1s == 1 minute.
#define ONE_SECOND        100     // 100 * 10ms == 1 second.

//---- global variables ----
unsigned char status;
unsigned char secondsCounter;
unsigned char msCounter;
unsigned char noHeatMinutesCounter;
unsigned char noHeatHourCounter;
unsigned char onCounter;
unsigned char offCounter;
unsigned char pumpOffInterval;

void main(void)
{
#asm                
  MOVLW 0x08  // Set GP3 to input, GP0, GP1 and GP2 to output.
  TRIS 6      // 6 == W. Copy contents W to GPIO direction port.
#endasm
  OPTION = 0b10000101;  // Enable weak pull-up ports. Timer internal clock.
                        // TMR0 prescaler = 64, WDT timeout ~ 18 milliseconds.
  GPIO = 0;             // GP0, GP1, GP2 = 0.
  status = 0;
  msCounter = 0;
  secondsCounter = 0;
  noHeatMinutesCounter = 0;
  noHeatHourCounter = 0;
  onCounter = 0;
  offCounter = 0;
  pumpOffInterval = PUMP_OFF_LOW_INTERVAL;
  
  while ( 1 )
  {
    while ( msCounter < ONE_SECOND )
    {
        // Clear the watch dog timer.
        CLRWDT();
        // Delay 10 milliseconds.
        __delay_ms( 10 );
  
        msCounter++;
    }
    
    msCounter = 0;

    // Next code should be finished within 8 millisecond to prevent WDT reset.
    if ( GP3 )
    {
      GP1 = 0; // Valve off.
      
      secondsCounter++;
      
      if ( ONE_MINUTE == secondsCounter )
      {
        secondsCounter = 0;
        noHeatMinutesCounter++;

        if ( status & ON_COUNTER )
        {
          onCounter++;
          
          if ( status & HEAT_REQUEST )
          {
            if ( PUMP_ON_HOLD == onCounter ) // PUMP_ON_HOLD minute(s) passed.
            {
              status = 0; // Reset HEAT_REQUEST and ON_COUNTER flags.
              onCounter = 0;
              GP2 = 0; // Pump off.
            }
          }
          else
          {
            if ( PUMP_ON_INTERVAL == onCounter ) // PUMP_ON_INTERVAL minute(s) passed.
            {
              status = 0; // Reset ON_COUNTER flag.
              onCounter = 0;
              GP2 = 0; // Pump off.
            }
          }
        }
        else
        {
          offCounter++;
         
          if ( pumpOffInterval == offCounter ) // PUMP_OFF_INTERVAL minute(s) passed.
          {
            status |= ON_COUNTER;
            offCounter = 0;
            GP2 = 1; // Pump on.
          }
        }

        if ( ONE_HOUR == noHeatMinutesCounter ) // 1 hour passed.
        {
          noHeatHourCounter++;
          noHeatMinutesCounter = 0;
        
          if ( ONE_DAY == noHeatHourCounter ) // 1 day passed.
          {
            pumpOffInterval = PUMP_OFF_HIGH_INTERVAL;
            noHeatHourCounter = 0;
          }
        }
      }
    }
    else
    {
      if ( !GP1 ) // Valve was off.
      {
        secondsCounter = 0;
        noHeatMinutesCounter = 0;
        noHeatHourCounter = 0;
        onCounter = 0;
        offCounter = 0;
        pumpOffInterval = PUMP_OFF_LOW_INTERVAL;
        
        // Heat requested by thermostat.
        status |= ( HEAT_REQUEST | ON_COUNTER );
        GP1 = 1; // Valve on.
        GP2 = 1; // Pump on.
      }
    }
    
    if ( GP0 ) // Toggle GP0 - 2Hz - when pump is off.
    {
      if ( 0 == status )
      {
        GP0 = 0;
      }
    }
    else
    {
      GP0 = 1;
    }
  }
}

The parameters within the pump switch control are found by experiment. The pump continues pumping after the last heat request for 30 minutes to distribute the heat input evenly over the floor. When there is no heat request the pump runs for 2 minutes after every pause of 10 minutes to keep the floor evenly heated - also those parts of the heated floor which are not controlled by the thermostat (e.g. entrance hall). After one day of no heat request the pause period is increased from 10 minutes to 4 hours to minimize pump activity and to ensure that moving parts remain flexible.

After a few months of pump switch testing it is expected that my yearly floor heating system electricity consumption will drop from 600kWh to 100kWh, a saving of 500 kWh yearly. This does not mean an energy(!) drop of 500kWh yearly. The energy consumed by the pump contributes to heating the floor. So a drop in electricity consumption because of the pump switch will increase the heating (hot water inlet) consumption. This fact is always neglected in example calculations from commercial pump switch suppliers. However, when the outside temperature is high enough and no home heating request for days or months a continuously running pump really wastes its energy. So with a pump switch there a financial saving but not as much as is expected just from the electricity consumption drop but still worth the cost of a simple pump switch as described above.

A temperature sensor could improve the pump switch. When during winter a district heating malfunction cold water is delivered instead of hot water (this actually happened once - 10 degrees celcius cold water!), heat is not delivered to your home but extracted from your home. Because of a heat request the hot water inlet valve opens and cold water is pumped into your floor. A temperature sensor could prevent this. GP0 could be used as a temperature sensor. Drive 1 as output to charge a capacitor and then switch to input to monitor the capacitor discharge by the NTC. The time to discharge the capacitor could be measured by multiples of 10ms time slices. When the temperature is too low the pumps should be stopped but the hot water inlet valve should still be opened a little bit to be able to measure the input water temperature. The schematic circuit of the temperature sensor improvement is given below.

New Pump Switch Circuit

Improved pump switch circuit

[HOME][LINKS]