Sump Pump Controller
From Wiki
Jump to navigationJump to search
A friend of mine has a basement that leaks and he installed his own sump pump. The problem was he didn't like any of the switch arrangements out there, so we decided to build one. I had some water level sensors from another project, and wrote some code for a PIC12F629 to drive the pump relay based on the water level sensors. Below is the basic logic for the controller.
/*
* GP0 is high sense input, 0 indicates sensing water
* GP1 is low sense input, 0 indicates sensing water
* GP2 is manual pump override, 0 indicates override
* GP3 is MCLR/, active low reset
* GP4 is pump enable, 1 runs pump
* GP5 is alarm output, 1 enables open collector output
*
* OPTION_REG:
* GPPU - 0 - GPIO pull-ups are enabled by individual port latch values
* INTEDG - 0 - Interrupt on falling edge of GP2/INT pin
* T0CS - 0 - Transition on GP2/T0CKI pin
* T0SE - 0 - Increment on low-to-high transition on GP2/T0CKI pin
* PSA - 0 - Prescaler is assigned to the TIMER0 module
* PS2:PS0 - 0 - TMR0 rate is 1:2 (needs fixing!)
*
*/
volatile char secondsCounter;
volatile char minutesCounter;
void Timer_interrupt (void)
{
static char count10ms = 0;
if (++count10ms == 100)
{
count10ms = 0;
if (++secoundsCounter == 60)
{
secondsCounter = 0;
minutesCounter++;
}
}
}
void main (void)
{
int secondsCounterLast = -1;
char hysterisisTime = 0;
char manualOverrideFlag = FALSE;
ANSEL = 0x00; // Digital I/O only
CMCON = 0x07; // Comparator off
GPIO = 0x07; // Outputs GP4 & GP5 low, inputs ignored
WPU = 0x07; // GP2..0 weak pull-ups enabled
TRISIO = 0x07; // GP5..3 outputs, GP2..0 inputs
PCON = 0x03; // Clear /POR and /BOD (or 0?)
INTCON = 0x00; // No interrupts
IOC = 0x00; // No interrupt on change for GPIO
PIR1 = 0x00; // Clear outstanding interrupts
PIE1 = 0x01; // Timer 1 overflow interrupt
//
// Configure timer for 10ms
// Enable interrupts
//
disablePump ();
disableAlarm ();
while (1)
{
if (secondsCounter != secondsCounterLast)
{
toggleGreenLED ();
secondsCounterLast = secondsCounter;
if (manualOverride ())
{
pumpEnable ();
manualOverrideFlag = TRUE;
}
else if (manualOverrideFlag)
{
pumpDisable ();
manualOverrideFlag = FALSE;
}
if (manualOverrideFlag == FALSE)
{
if (pumpRunning () && (minutesCounter > FIFTEEN_MINUTES))
enableAlarm ();
if (highSense ())
{
if (hysterisisTime == 0)
hysterisisTime = FIFTEEN_SECONDS;
else if (--hysterisisTime == 0)
{
enablePump ();
minutesCounter = 0;
}
}
else if (!lowSense ())
{
if (hysterisisTime == 0)
hysterisisTime = FIFTEEN_SECONDS;
else if (--hysterisisTime == 0)
{
disablePump ();
disableAlarm ();
}
}
}
}
else
sleep ();
}
}