Page 1 of 1

Auto Water Change Code

Posted: Fri Jan 01, 2016 3:02 pm
by WIReefer83
Hello - I'm trying to code an auto water change for my reef tank and my fish qt tank. I have all the code written based on what I've read here in the forum. For some reason, when I manually select Water Change Mode on the RA, nothing happens. Any ideas?

#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <PAR.h>
#include <ReefAngel.h>

////// Place global variable code below here

byte wc_status = -2;

////// Place global variable code above here


void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.AddStandardMenu(); // Add Standard Menu

ReefAngel.Use2014Screen(); // Let's use 2014 Screen
ReefAngel.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expanion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port2Bit | Port5Bit | Port6Bit | Port8Bit;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port2Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port1Bit;
ReefAngel.LightsOnPortsE[0] = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port1Bit | Port5Bit | Port6Bit | Port7Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 850 );


// Ports that are always on
ReefAngel.Relay.On( Port8 );

////// Place additional initialization code below here

ReefAngel.CustomLabels[0]="LEDs";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="SumpToFishQT";
ReefAngel.CustomLabels[3]="SumpDrain";
ReefAngel.CustomLabels[4]="Wave R";
ReefAngel.CustomLabels[5]="Wave L";
ReefAngel.CustomLabels[6]="Heaters";
ReefAngel.CustomLabels[7]="Constant";
ReefAngel.CustomLabels[8]="SumpATO";
ReefAngel.CustomLabels[9]="FishQTATO";
ReefAngel.CustomLabels[10]="FishQTDrain";
ReefAngel.CustomLabels[11]="SaltToSump";

////// Place additional initialization code above here
}

void loop()
{
ReefAngel.StandardLights( Port1,16,0,22,0 );
ReefAngel.Relay.DelayedOn( Port2,5 );
ReefAngel.WavemakerRandom( Port5,60,100 );
ReefAngel.WavemakerRandom( Port6,60,100 );
//ReefAngel.Relay.Set( Port6, !ReefAngel.Relay.Status( Port5 ) );
ReefAngel.StandardHeater( Port7,775,785 );
ReefAngel.PWM.SetChannel( 3, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 4, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 5, PWMParabola(16,0,22,0,10,50,10) );
////// Place your custom code below here

//ATO For Main Sump
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port1); //don't run ATO during a water change
if (ReefAngel.WaterLevel.GetLevel(1)<=70 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port1);
if (ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1);
}
else
{
ReefAngel.Relay.Off(Box1_Port1);
}


//ATO For Fish QT
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port2); //don't run ATO during a water change
if (ReefAngel.WaterLevel.GetLevel(3)<=80 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port2);
if (ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2);
}
else
{
ReefAngel.Relay.Off(Box1_Port2);
}

// EMERGENCY SUMP WATER LEVEL BELOW 20% AND WATERCHANGE MODE IS NOT ON AND WAIT FOR CONTROLLER TO BE ON FOR 5 SECONDS
if ( ReefAngel.WaterLevel.GetLevel(1) <= 20 && ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && millis() > 5000)
{
ReefAngel.Relay.Off(Port8); //Turn off return pumps
}


//Water Change Process

if(ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && wc_status != -2) wc_status = -2;


//-2 - Top Off Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == -2)
{

if( ReefAngel.WaterLevel.GetLevel(1)<80) ReefAngel.Relay.On(Box1_Port1);
if( ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1);
if( ReefAngel.WaterLevel.GetLevel(1)>=80) wc_status = -1;
}

//-1 - Top Off FishQT

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == -1)
{

if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Box1_Port2);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 0;
}


//0 - Drain FishQT Tank

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 0)
{

if( ReefAngel.WaterLevel.GetLevel(3)>85) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(3)<=85) ReefAngel.Relay.Off(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(3)<=85) wc_status = 1;
}

//1 - Fill FishQT From Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 1)
{
if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Port3);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Port3);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 2;
}

//2 - Drain Sump To Floor Drain

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 2)
{
if( ReefAngel.WaterLevel.GetLevel(2)>75) ReefAngel.Relay.On(Port4);
if( ReefAngel.WaterLevel.GetLevel(2)<=75) ReefAngel.Relay.Off(Port4);
if( ReefAngel.WaterLevel.GetLevel(2)<=75) wc_status = 3;
}

//3 - Fill Sump With Fresh Saltwater

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 3)
{
if( ReefAngel.WaterLevel.GetLevel(2)<80) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ButtonPress++;
}
//Water Change Complete




////// Place your custom code above here

// This should always be the last line
ReefAngel.ShowInterface();
}

Re: Auto Water Change Code

Posted: Fri Jan 01, 2016 4:33 pm
by WIReefer83
Part of the problem is that byte values cannot be negative. Fixed that, then the water change process initiated, but after step 1, it exited water change mode.

#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <PAR.h>
#include <ReefAngel.h>

////// Place global variable code below here

byte wc_status = 0;

////// Place global variable code above here


void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.AddStandardMenu(); // Add Standard Menu

ReefAngel.Use2014Screen(); // Let's use 2014 Screen
ReefAngel.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expanion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port2Bit | Port5Bit | Port6Bit | Port8Bit;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port2Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port1Bit;
ReefAngel.LightsOnPortsE[0] = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port1Bit | Port5Bit | Port6Bit | Port7Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 850 );


// Ports that are always on
ReefAngel.Relay.On( Port8 );

////// Place additional initialization code below here

ReefAngel.CustomLabels[0]="LEDs";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="SumpToFishQT";
ReefAngel.CustomLabels[3]="SumpDrain";
ReefAngel.CustomLabels[4]="Wave R";
ReefAngel.CustomLabels[5]="Wave L";
ReefAngel.CustomLabels[6]="Heaters";
ReefAngel.CustomLabels[7]="Constant";
ReefAngel.CustomLabels[8]="SumpATO";
ReefAngel.CustomLabels[9]="FishQTATO";
ReefAngel.CustomLabels[10]="FishQTDrain";
ReefAngel.CustomLabels[11]="SaltToSump";

////// Place additional initialization code above here
}

void loop()
{
ReefAngel.StandardLights( Port1,16,0,22,0 );
ReefAngel.Relay.DelayedOn( Port2,5 );
ReefAngel.WavemakerRandom( Port5,60,100 );
ReefAngel.WavemakerRandom( Port6,60,100 );
//ReefAngel.Relay.Set( Port6, !ReefAngel.Relay.Status( Port5 ) );
ReefAngel.StandardHeater( Port7,775,785 );
ReefAngel.PWM.SetChannel( 3, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 4, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 5, PWMParabola(16,0,22,0,10,50,10) );
////// Place your custom code below here

//ATO For Main Sump
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port1); //don't run ATO during a water change
if (ReefAngel.WaterLevel.GetLevel(1)<=70 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port1);
if (ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1);
}
else
{
ReefAngel.Relay.Off(Box1_Port1);
}


//ATO For Fish QT
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port2); //don't run ATO during a water change
if (ReefAngel.WaterLevel.GetLevel(3)<=80 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port2);
if (ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2);
}
else
{
ReefAngel.Relay.Off(Box1_Port2);
}

// Emergency Sump Low Check
if ( ReefAngel.WaterLevel.GetLevel(1) <= 20 && ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && millis() > 5000)
{
ReefAngel.Relay.Off(Port8); //Turn off return pumps
}


//Water Change Process

if(ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && wc_status != 0) wc_status = 0;


//0 - Top Off Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 0)
{

if( ReefAngel.WaterLevel.GetLevel(1)<80) ReefAngel.Relay.On(Box1_Port1);
if( ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1);
if( ReefAngel.WaterLevel.GetLevel(1)>=80) wc_status = 1;
}

//1 - Top Off FishQT

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 1)
{

if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Box1_Port2);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 2;
}


//2 - Drain FishQT Tank

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 2)
{

if( ReefAngel.WaterLevel.GetLevel(3)>85) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(3)<=85) ReefAngel.Relay.Off(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(3)<=85) wc_status = 3;
}

//3 - Fill FishQT From Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 3)
{
if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Port3);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Port3);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 4;
}

//4 - Drain Sump To Floor Drain

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 4)
{
if( ReefAngel.WaterLevel.GetLevel(2)>75) ReefAngel.Relay.On(Port4);
if( ReefAngel.WaterLevel.GetLevel(2)<=75) ReefAngel.Relay.Off(Port4);
if( ReefAngel.WaterLevel.GetLevel(2)<=75) wc_status = 5;
}

//5 - Fill Sump With Fresh Saltwater

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 5)
{
if( ReefAngel.WaterLevel.GetLevel(2)<80) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ButtonPress++;
}
//Water Change Complete




////// Place your custom code above here

// This should always be the last line
ReefAngel.ShowInterface();
}

Re: Auto Water Change Code

Posted: Tue Jan 05, 2016 6:55 am
by lnevo
You need to try some debugging code (Serial.println) and see what the values are and monitor in Serial Monitor. The code looks ok but need to watch whats going on...

Re: Auto Water Change Code

Posted: Tue Jan 05, 2016 9:21 pm
by WIReefer83
Keeping my RA connected to my PC was causing my issues. Working as expected now! Thx

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 6:50 pm
by WIReefer83
I'd like to add a feature in my auto water change code that I haven't come across yet in the forum posts. After the step where I drain my sump, I'd like the process to pause, so I can manually clean my sump while there is no water. Then, once I'm finished, I'd like to click the button on the RA to resume the rest of the water change process. Is this possible?

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 8:30 pm
by lnevo
Yeah we can do that. Is the code above recent?

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 8:35 pm
by lnevo
Does it have to be a button on the RA cause your in waterchange mode and that would cancel. If you have wifi we can use either a free relay outlet or start a new relay box with "virtual" ports that we can use as a trigger

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 9:44 pm
by WIReefer83
I don't have the wifi module yet, but plan to get it soon. Sounds like I will need to wait since the button press will exit out of the water change mode. I will post my current code once I get the wifi module (code above is out of date). Thx

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 10:11 pm
by lnevo
It may still be possible. Maybe roberto has an idea. Or we could process joystick moves? I'm sure something could be figured out. The wifi makes it easy and we could add up to 8 or 12 expansion hubs that don't exist to use for macros or what not.

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 10:15 pm
by rimai
Pretty sure you can use joystick moves.

Re: Auto Water Change Code

Posted: Tue Feb 02, 2016 11:38 pm
by lnevo
Try this. It will wait for a joystick up movement before moving to the fill stage

Code: Select all


#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <PAR.h>
#include <ReefAngel.h>

////// Place global variable code below here

byte wc_status = 0;

////// Place global variable code above here


void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.AddStandardMenu(); // Add Standard Menu

ReefAngel.Use2014Screen(); // Let's use 2014 Screen 
ReefAngel.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expanion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port2Bit | Port5Bit | Port6Bit | Port8Bit;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port2Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port1Bit;
ReefAngel.LightsOnPortsE[0] = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port1Bit | Port5Bit | Port6Bit | Port7Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 850 );


// Ports that are always on
ReefAngel.Relay.On( Port8 );

////// Place additional initialization code below here

ReefAngel.CustomLabels[0]="LEDs"; 
ReefAngel.CustomLabels[1]="Skimmer"; 
ReefAngel.CustomLabels[2]="SumpToFishQT"; 
ReefAngel.CustomLabels[3]="SumpDrain"; 
ReefAngel.CustomLabels[4]="Wave R"; 
ReefAngel.CustomLabels[5]="Wave L"; 
ReefAngel.CustomLabels[6]="Heaters"; 
ReefAngel.CustomLabels[7]="Constant"; 
ReefAngel.CustomLabels[8]="SumpATO";
ReefAngel.CustomLabels[9]="FishQTATO";
ReefAngel.CustomLabels[10]="FishQTDrain";
ReefAngel.CustomLabels[11]="SaltToSump";

////// Place additional initialization code above here
}

void loop()
{
ReefAngel.StandardLights( Port1,16,0,22,0 );
ReefAngel.Relay.DelayedOn( Port2,5 );
ReefAngel.WavemakerRandom( Port5,60,100 );
ReefAngel.WavemakerRandom( Port6,60,100 );
//ReefAngel.Relay.Set( Port6, !ReefAngel.Relay.Status( Port5 ) );
ReefAngel.StandardHeater( Port7,775,785 );
ReefAngel.PWM.SetChannel( 3, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 4, PWMParabola(16,0,22,0,10,50,10) );
ReefAngel.PWM.SetChannel( 5, PWMParabola(16,0,22,0,10,50,10) );
////// Place your custom code below here

//ATO For Main Sump
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port1); //don't run ATO during a water change 
if (ReefAngel.WaterLevel.GetLevel(1)<=70 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port1);
if (ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1);
}
else
{
ReefAngel.Relay.Off(Box1_Port1);
}


//ATO For Fish QT
if (hour()==19 && minute()==0) //Only run ATO between 7:00pm and 7:01pm daily
{
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) ReefAngel.Relay.Off(Box1_Port2); //don't run ATO during a water change 
if (ReefAngel.WaterLevel.GetLevel(3)<=80 && ReefAngel.DisplayedMenu != WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port2);
if (ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2);
}
else
{
ReefAngel.Relay.Off(Box1_Port2);
}

// Emergency Sump Low Check
if ( ReefAngel.WaterLevel.GetLevel(1) <= 20 && ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && millis() > 5000)
{
ReefAngel.Relay.Off(Port8); //Turn off return pumps
}


//Water Change Process

if(ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && wc_status != 0) wc_status = 0;


//0 - Top Off Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 0)
{

if( ReefAngel.WaterLevel.GetLevel(1)<80) ReefAngel.Relay.On(Box1_Port1);
if( ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port1); 
if( ReefAngel.WaterLevel.GetLevel(1)>=80) wc_status = 1;
}

//1 - Top Off FishQT

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 1)
{

if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Box1_Port2);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Box1_Port2); 
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 2;
}


//2 - Drain FishQT Tank

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 2)
{

if( ReefAngel.WaterLevel.GetLevel(3)>85) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(3)<=85) ReefAngel.Relay.Off(Box1_Port3); 
if( ReefAngel.WaterLevel.GetLevel(3)<=85) wc_status = 3;
}

//3 - Fill FishQT From Sump

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 3)
{
if( ReefAngel.WaterLevel.GetLevel(3)<90) ReefAngel.Relay.On(Port3);
if( ReefAngel.WaterLevel.GetLevel(3)>=90) ReefAngel.Relay.Off(Port3); 
if( ReefAngel.WaterLevel.GetLevel(3)>=90) wc_status = 4;
}

//4 - Drain Sump To Floor Drain

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 4)
{
if( ReefAngel.WaterLevel.GetLevel(2)>75) ReefAngel.Relay.On(Port4);
if( ReefAngel.WaterLevel.GetLevel(2)<=75) ReefAngel.Relay.Off(Port4); 
if( ReefAngel.WaterLevel.GetLevel(2)<=75) wc_status = 5;
}

//5 - Wait for Joystick Move

if (ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 5)
{
 if (ReefAngel.Joystick.IsUp()) wc_status=6; 
}

//6 - Fill Sump With Fresh Saltwater

if(ReefAngel.DisplayedMenu==WATERCHANGE_MODE && wc_status == 6)
{
if( ReefAngel.WaterLevel.GetLevel(2)<80) ReefAngel.Relay.On(Box1_Port3);
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ReefAngel.Relay.Off(Box1_Port3); 
if( ReefAngel.WaterLevel.GetLevel(2)>=80 && ReefAngel.WaterLevel.GetLevel(1)>=80) ButtonPress++;
} 
//Water Change Complete




////// Place your custom code above here

// This should always be the last line
ReefAngel.ShowInterface();
}