Auto Water Change Code
-
- Posts: 15
- Joined: Fri Jan 01, 2016 2:58 pm
Auto Water Change Code
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();
}
#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();
}
-
- Posts: 15
- Joined: Fri Jan 01, 2016 2:58 pm
Re: Auto Water Change Code
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();
}
#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
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...
-
- Posts: 15
- Joined: Fri Jan 01, 2016 2:58 pm
Re: Auto Water Change Code
Keeping my RA connected to my PC was causing my issues. Working as expected now! Thx
-
- Posts: 15
- Joined: Fri Jan 01, 2016 2:58 pm
Re: Auto Water Change Code
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
Yeah we can do that. Is the code above recent?
Re: Auto Water Change Code
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
-
- Posts: 15
- Joined: Fri Jan 01, 2016 2:58 pm
Re: Auto Water Change Code
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
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
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();
}