Auto Water Change Code

Do you have a question on how to do something.
Ask in here.
Post Reply
WIReefer83
Posts: 15
Joined: Fri Jan 01, 2016 2:58 pm

Auto Water Change Code

Post 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();
}
WIReefer83
Posts: 15
Joined: Fri Jan 01, 2016 2:58 pm

Re: Auto Water Change Code

Post 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();
}
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Auto Water Change Code

Post 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...
WIReefer83
Posts: 15
Joined: Fri Jan 01, 2016 2:58 pm

Re: Auto Water Change Code

Post by WIReefer83 »

Keeping my RA connected to my PC was causing my issues. Working as expected now! Thx
WIReefer83
Posts: 15
Joined: Fri Jan 01, 2016 2:58 pm

Re: Auto Water Change Code

Post 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?
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Auto Water Change Code

Post by lnevo »

Yeah we can do that. Is the code above recent?
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Auto Water Change Code

Post 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
WIReefer83
Posts: 15
Joined: Fri Jan 01, 2016 2:58 pm

Re: Auto Water Change Code

Post 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
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Auto Water Change Code

Post 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.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: Auto Water Change Code

Post by rimai »

Pretty sure you can use joystick moves.
Roberto.
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Auto Water Change Code

Post 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();
}
Post Reply