hi there thanks for all your feedback
yes I would agree it is the 3 phase what is playing me up, still having issues so I am all out of ideas?
I have look into the watchdog timer but just seem to reset like every 10s so I don't no if I have dun something wrong?
// *** INPUT'S ***
const int HeatIn1 = 7; // input from PC 1
const int HeatIn2 = 8; // input from PC 2
const int overload1 = 9; // overload cut out 1
const int overload2 = 10; // overload cut out 2
const int reverse = 6; // reverse swich for heat's
// *** OUTPUT'S ***
const int valve = 11; // valve in pooler room // not being used
const int LED = 5; // lock out led
const int pump = 4; // pump in pooler room
const int heater1 = 3; // heater 1 output forwch
const int heater1R = 2; // heater 1 output revus
const int heater2 = 1; // heater 2 output forwch
const int heater2R = 0; // heater 2 output revus
#include <avr/wdt.h>
unsigned long resetTime = 0;
#define TIMEOUTPERIOD 10000 // You can make this time as long as you want,
// it's not limited to 8 seconds like the normal
// watchdog
#define doggieTickle() resetTime = millis(); // This macro will reset the timer
void(* resetFunc) (void) = 0; //declare reset function @ address 0
void watchdogSetup()
{
cli(); // disable all interrupts
wdt_reset(); // reset the WDT timer
MCUSR &= ~(1<<WDRF); // because the data sheet said to
/*
WDTCSR configuration:
WDIE = 1 :Interrupt Enable
WDE = 1 :Reset Enable - I won't be using this on the 2560
WDP3 = 0 :For 1000ms Time-out
WDP2 = 1 :bit pattern is
WDP1 = 1 :0110 change this for a different
WDP0 = 0 :timeout period.
*/
// Enter Watchdog Configuration mode:
WDTCSR = (1<<WDCE) | (1<<WDE);
// Set Watchdog settings: interrupte enable, 0110 for timer
WDTCSR = (1<<WDIE) | (0<<WDP3) | (1<<WDP2) | (1<<WDP1) | (0<<WDP0);
sei();
}
ISR(WDT_vect) // Watchdog timer interrupt.
{
if(millis() - resetTime > TIMEOUTPERIOD){
doggieTickle(); // take these lines out
resetFunc(); // This will call location zero and cause a reboot.
}
}
void setup()
{
watchdogSetup();
// *** OUTPUT'S ***
pinMode(valve , OUTPUT);
pinMode(LED , OUTPUT);
pinMode(pump , OUTPUT);
pinMode(heater1 , OUTPUT);
pinMode(heater1R, OUTPUT);
pinMode(heater2 , OUTPUT);
pinMode(heater2R, OUTPUT);
// *** INPUT'S ***
pinMode(HeatIn1, INPUT);
pinMode(HeatIn2, INPUT);
pinMode(reverse, INPUT);
pinMode(overload1, INPUT);
pinMode(overload2, INPUT);
}
int firstTime = true;
enum LoopOneStates {
Heating, NotHeating, ReverseMode, ReverseModeOn, ReverseModeOff, WaitingToHeat};
enum LoopTwoStates {
EitherHot, OpenValve, StartPump, NeitherHot, CloseValveStopPump};
void loop() {
if (firstTime){
firstTime = false;
}
if(millis() - resetTime > 2000){
doggieTickle(); // if you uncomment this line, it will keep resetting the timer.
}
unsigned long currentTime = millis();
// LoopOne for Heater 1
if (digitalRead(overload1)) {
static enum LoopOneStates state1 = Heating;
static unsigned long state1EntryTime = 0;
switch (state1) {
case Heating:
digitalWrite(heater1, HIGH);
if (!digitalRead(HeatIn1))
state1 = NotHeating;
break;
case NotHeating:
digitalWrite(heater1, LOW);
if (digitalRead(reverse)) {
state1 = ReverseMode;
state1EntryTime = currentTime;
}
if (digitalRead(HeatIn1))
state1 = Heating;
break;
case ReverseMode:
if (currentTime - state1EntryTime > 30000) {
digitalWrite(heater1R, HIGH);
state1 = ReverseModeOn;
state1EntryTime = currentTime;
}
break;
case ReverseModeOn:
if (currentTime - state1EntryTime > 10000) {
digitalWrite(heater1R, LOW);
state1 = ReverseModeOff;
state1EntryTime = currentTime;
}
break;
case ReverseModeOff:
if (currentTime - state1EntryTime > 30000) {
state1 = WaitingToHeat;
}
break;
case WaitingToHeat:
if (digitalRead(HeatIn1)) {
state1 = Heating;
}
break;
}
}
else {
digitalWrite(heater1, LOW);
digitalWrite(heater1R, LOW);
}
// LoopOne for Heater 2
if (digitalRead(overload2)) {
static enum LoopOneStates state2 = Heating;
static unsigned long state2EntryTime = 0;
switch (state2) {
case Heating:
digitalWrite(heater2, HIGH);
if (!digitalRead(HeatIn2))
state2 = NotHeating;
break;
case NotHeating:
digitalWrite(heater2, LOW);
if (digitalRead(reverse)) {
state2 = ReverseMode;
state2EntryTime = currentTime;
}
if (digitalRead(HeatIn2))
state2 = Heating;
break;
case ReverseMode:
if (currentTime - state2EntryTime > 30000) {
digitalWrite(heater2R, HIGH);
state2 = ReverseModeOn;
state2EntryTime = currentTime;
}
break;
case ReverseModeOn:
if (currentTime - state2EntryTime > 10000) {
digitalWrite(heater2R, LOW);
state2 = ReverseModeOff;
state2EntryTime = currentTime;
}
break;
case ReverseModeOff:
if (currentTime - state2EntryTime > 30000) {
state2 = WaitingToHeat;
}
break;
case WaitingToHeat:
if (digitalRead(HeatIn2)) {
state2 = Heating;
}
break;
}
}
else {
digitalWrite(heater2, LOW);
digitalWrite(heater2R, LOW);
}
// **loop two**
// LoopOne for Heater 1
static enum LoopTwoStates state3 = EitherHot;
static unsigned long state3EntryTime = 0;
switch (state3) {
case EitherHot:
if (digitalRead(HeatIn1) || digitalRead(HeatIn2)) {
state3 = OpenValve;
state3EntryTime = currentTime;
}
break;
case OpenValve:
digitalWrite(valve, HIGH);
// Fifteen seconds later, starty the pump
if (currentTime - state3EntryTime > 5000) {
state3 = StartPump;
state3EntryTime = currentTime;
}
break;
case StartPump:
digitalWrite(pump, HIGH);
state3 = NeitherHot;
state3EntryTime = currentTime;
break;
case NeitherHot:
// Wait for a full 30 minutes with neither heat indicators on
if (digitalRead(HeatIn1) || digitalRead(HeatIn2)) {
// Reset the timer if either heater is on
state3EntryTime = currentTime;
}
if (currentTime - state3EntryTime > 1000UL*60UL*30UL) {
state3 = CloseValveStopPump;
}
break;
case CloseValveStopPump:
digitalWrite(valve, LOW);
digitalWrite(pump, LOW);
state3 = EitherHot;
break;
}
// Lock out LED
if (!digitalRead(overload1) || !digitalRead(overload2)) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}