Central Heating controller using the real time clock, PHY module for internet, 1-wire interface for temperature sensors, a system log and a configuration file

Dependencies:   net 1-wire lpc1768 crypto clock web fram log

/media/uploads/andrewboyson/heating.sch

/media/uploads/andrewboyson/heating.brd

/media/uploads/andrewboyson/eagle.epf

heating/radiator.c

Committer:
andrewboyson
Date:
2018-03-20
Revision:
7:a62134646ac8
Parent:
6:b325de442777
Child:
35:bb8a6d1c034c

File content as of revision 7:a62134646ac8:

#include <stdint.h>
#include <string.h>
#include <stdbool.h>

#include     "gpio.h"
#include  "program.h"
#include  "ds18b20.h"
#include     "fram.h"
#include "radiator.h"
#include "debounce.h"

#define      HALL_LED_DIR FIO0DIR(10) // P0.10 == p28;
#define      HALL_LED_PIN FIO0PIN(10)
#define      HALL_LED_SET FIO0SET(10)
#define      HALL_LED_CLR FIO0CLR(10)

#define RADIATOR_PUMP_DIR FIO2DIR(03) // P2.03 == p23;
#define RADIATOR_PUMP_PIN FIO2PIN(03)
#define RADIATOR_PUMP_SET FIO2SET(03)
#define RADIATOR_PUMP_CLR FIO2CLR(03)

static char      htgMode;        static int iMode;
static char      htgOverride;    static int iOverride;
static char     hallRom[8];      static int iHallRom;
static int32_t nightTemperature; static int iNightTemperature;
static int32_t frostTemperature; static int iFrostTemperature;

bool  RadiatorGetMode            (){ return (bool)htgMode;          } 
bool  RadiatorGetOverride        (){ return (bool)htgOverride;      } 
char* RadiatorGetHallRom         (){ return       hallRom;          } 
int   RadiatorGetNightTemperature(){ return  (int)nightTemperature; } 
int   RadiatorGetFrostTemperature(){ return  (int)frostTemperature; } 

static void  setMode             ( bool value) { htgMode          =    (char)value; FramWrite(iMode,             1, &htgMode         ); }
static void  setOverride         ( bool value) { htgOverride      =    (char)value; FramWrite(iOverride,         1, &htgOverride     ); }
void RadiatorSetHallRom          (char* value) { memcpy(hallRom,  value, 8);        FramWrite(iHallRom,          8,  hallRom         ); }
void RadiatorSetNightTemperature ( int  value) { nightTemperature = (int32_t)value; FramWrite(iNightTemperature, 4, &nightTemperature); }
void RadiatorSetFrostTemperature ( int  value) { frostTemperature = (int32_t)value; FramWrite(iFrostTemperature, 4, &frostTemperature); }

static bool outputBeforeOverride = false;
static void makeOutputBeforeOverride()
{
    //See if the temperature is too low
    int  hallTemp16ths = DS18B20ValueFromRom(hallRom);
    int nightTemp16ths = nightTemperature << 4;
    int frostTemp16ths = frostTemperature << 4;

    static bool tooCold = false; //This is static to ride through invalid temperature reads
    if (DS18B20IsValidValue(hallTemp16ths))
    {
        tooCold = hallTemp16ths < frostTemp16ths;
        if (htgMode) tooCold |= hallTemp16ths < nightTemp16ths;
    }
    
    outputBeforeOverride = htgMode && ProgramTimerOutput || tooCold;
}
static void adjustOverride()
{
    static bool previousOutput = false;
    if (previousOutput != outputBeforeOverride) setOverride(false);
    previousOutput = outputBeforeOverride;
}
bool RadiatorPump = false;
static void makeOutputWithOverride()
{
    RadiatorPump = htgOverride ? !outputBeforeOverride : outputBeforeOverride ;
}

void RadiatorSetMode(bool value) //Summer is false, Winter is true
{
    if (htgMode == (char)value) return; //Ignore no change
    setMode(value);             //Change to the new value
    
    bool prevOutputBeforeOverride = outputBeforeOverride;
    makeOutputBeforeOverride();
    
    if (htgOverride) //Only deal with an override that is already set; if it wasn't set don't change it
    {
        if (htgMode) //Summer -> Winter
        {
            if (outputBeforeOverride != prevOutputBeforeOverride) setOverride(0); //Adjust the override to leave the heat as it was - off or on.
        }
        else //Winter -> Summer
        {
            setOverride(0); //turn off the heat.
        }
    }
        
    makeOutputWithOverride();
}
void RadiatorSetOverride(bool value)
{
    setOverride(value);
    makeOutputBeforeOverride();
    makeOutputWithOverride(); }

void RadiatorChgMode    (){ RadiatorSetMode    (!RadiatorGetMode    ()); }
void RadiatorChgOverride(){ RadiatorSetOverride(!RadiatorGetOverride()); }

int RadiatorInit()
{
    int  address;
    char    def1;
    int32_t def4;
    def1 =  0; address = FramLoad( 1, &htgMode,          &def1); if (address < 0) return -1; iMode             = address; 
    def1 =  0; address = FramLoad( 1, &htgOverride,      &def1); if (address < 0) return -1; iOverride         = address; 
               address = FramLoad( 8,  hallRom,              0); if (address < 0) return -1; iHallRom          = address;
    def4 = 15; address = FramLoad( 4, &nightTemperature, &def4); if (address < 0) return -1; iNightTemperature = address; 
    def4 =  8; address = FramLoad( 4, &frostTemperature, &def4); if (address < 0) return -1; iFrostTemperature = address; 
    
    RADIATOR_PUMP_DIR = 1; //Set the direction to 1 == output
         HALL_LED_DIR = 1; //Set the direction to 1 == output
    
    return 0;
}
void RadiatorMain()
{
    //deal with pushbutton
    static bool prevOn = false;
    bool thisOn = DebounceHallPbPressed();
    if (thisOn && !prevOn) RadiatorChgOverride();
    prevOn = thisOn;
    
    //Make the radiator output
    makeOutputBeforeOverride();
    adjustOverride();
    makeOutputWithOverride();
    
    //Pump output
    if (RadiatorPump) RADIATOR_PUMP_SET;
    else              RADIATOR_PUMP_CLR;

    
    //Display the led
    if (RadiatorPump) HALL_LED_SET;
    else              HALL_LED_CLR;
}