The below is for a now broken down tank:
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 <ReefAngel.h>
////// Place global variable code below here
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port5Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port5Bit | Port6Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port3Bit | Port4Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port8Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Feeeding and Water Change mode speed
ReefAngel.DCPump.FeedingSpeed=0;
ReefAngel.DCPump.WaterChangeSpeed=0;
// Ports that are always on
ReefAngel.Relay.On( Port2 );
////// Place additional initialization code below here
ReefAngel.CustomLabels[0]="ATO Pump";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="LEDWhite";
ReefAngel.CustomLabels[3]="LEDBlue";
ReefAngel.CustomLabels[4]="WP25";
ReefAngel.CustomLabels[5]="DoserAlk";
ReefAngel.CustomLabels[6]="Unused";
ReefAngel.CustomLabels[7]="Heater";
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.SingleATOLow( Port1 );
ReefAngel.DayLights( Port3 );
ReefAngel.ActinicLights( Port4 );
ReefAngel.Relay.DelayedOn( Port5 );
ReefAngel.DosingPumpRepeat1( Port6 );
ReefAngel.StandardHeater( Port8 );
ReefAngel.DCPump.UseMemory = true;
ReefAngel.DCPump.DaylightChannel = None;
ReefAngel.DCPump.ActinicChannel = Sync;
////// Place your custom code below here
if (ReefAngel.DCPump.Mode==Custom)
{
if ( (now()%SECS_PER_DAY >= 77400) || (now()%SECS_PER_DAY<= 34200) )
{
ReefAngel.PWM.SetActinic(32); // Constant at 32% on sync mode
}
else if ( (now()%SECS_PER_DAY >= 34200) && (now()%SECS_PER_DAY<= 48600) )
{
ReefAngel.PWM.SetActinic(36); // Constant at 36% on sync mode
}
else if ( (now()%SECS_PER_DAY >= 48600) && (now()%SECS_PER_DAY<= 77400) )
{
ReefAngel.PWM.SetActinic( ElseMode(41,8,true)); // Else on sync mode, 41 +/- 8%
}
}
////DoserAlk Schedule
if ((hour() > 10) && (hour() < 22)) { // Between 10am and 10pm we will disable Port 6
ReefAngel.Relay.Off(Port6);
}
////Water change delay for Port 1
static time_t wcTimer;
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
if (now()-wcTimer > 0 && now()-wcTimer < 600) {
ReefAngel.Relay.Off(Port1);
}
else {ReefAngel.SingleATOLow (Port1 );
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "howaboutme" );
ReefAngel.ShowInterface();
}
byte ElseMode( byte MidPoint, byte Offset, boolean WaveSync )
{
// Static's only initialize the first time they are called
static unsigned long LastChange=millis(); // Set the inital time that the last change occurred
static int Delay = random( 500, 3000); // Set the initial delay
static int NewSpeed = MidPoint; // Set the initial speed
static int AntiSpeed = MidPoint; // Set the initial anti sync speed
if ((millis()-LastChange) > Delay) // Check if the delay has elapsed
{
Delay=random(500,5000); // If so, come up with a new delay
int ChangeUp = random(Offset); // Amount to go up or down
if (random(100)<50) // 50/50 chance of speed going up or going down
{
NewSpeed = MidPoint - ChangeUp;
AntiSpeed = MidPoint + ChangeUp;
}
else
{
NewSpeed = MidPoint + ChangeUp;
AntiSpeed = MidPoint - ChangeUp;
}
LastChange=millis(); // Reset the time of the last change
}
if (WaveSync)
{
return NewSpeed;
}
else
{
return AntiSpeed;
}
}
- Able to control pump settings via portal
- When in "custom mode": WP-25 is in else mode between 1:30pm and 9:30pm, constant mode at 32% between 9:30pm and 9:30am and 36% between 9:30am and 1:30pm.
- Doses Alk 12 times a day, once per hour between 10:00pm and 10:00am, controlled via portal
- Added ATO Low code to support my Avast ATO.
This one is for the current tank for record:
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
// Set to start at 9:45am and run for 10 minutes
#define AUTO_SAL_START_HOUR 9
#define AUTO_SAL_START_MINUTE 45
#define AUTO_SAL_RUN_TIME 10
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
ReefAngel.AddSalinityExpansion(); // Salinity Expansion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port5Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port5Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port2Bit | Port3Bit | Port8Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Salinity Temp Compensation
ReefAngel.Salinity.SetCompensation(0);
// Ports that are always on
ReefAngel.Relay.On( Port3 );
ReefAngel.Relay.On( Port4 );
ReefAngel.Relay.On( Port5 );
////// Place additional initialization code below here
ReefAngel.CustomLabels[0]="ATO Pump";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="Light";
ReefAngel.CustomLabels[3]="Nero3";
ReefAngel.CustomLabels[4]="Return Pump";
ReefAngel.CustomLabels[5]="Unused";
ReefAngel.CustomLabels[6]="Unused";
ReefAngel.CustomLabels[7]="Heater";
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.SingleATOLow( Port1 );
ReefAngel.StandardLights( Port2 ); // putting skimmer on timer
ReefAngel.StandardHeater( Port8 );
////// Place your custom code below here
// First 10 minutes after WC disable ATO for port 1
static time_t wcTimer;
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
if (now()-wcTimer > 0 && now()-wcTimer < 600) {
ReefAngel.Relay.Off(Port1);
}
else {ReefAngel.SingleATOLow (Port1 );
}
// Compute the current time
int CurrentTime = NumMins(hour(), minute());
// Compute the starting time for the auto salinity calibration
int AutoSalStartTime = NumMins(AUTO_SAL_START_HOUR, AUTO_SAL_START_MINUTE);
// Compute the ending time for the auto salinity calibration by adding in the run time
int AutoSalEndTime = AutoSalStartTime + AUTO_SAL_RUN_TIME;
// Check if it's time to start the auto salinity calibration
if ( AutoSalStartTime == CurrentTime ) {
// Switch to Salinity Calibration ONLY if we are on the main / default menu
// Don't switch to the calibration menu if we are doing something else (water change, feeding, etc)
if ( (ReefAngel.DisplayedMenu == DEFAULT_MENU) || (ReefAngel.DisplayedMenu == MAIN_MENU) ) {
ReefAngel.ChangeMode = SAL_CALIBRATE_MENU;
}
}
// Check if we are at the end of the Run Time for the auto salinity calibration
if ( AutoSalEndTime == CurrentTime ) {
// Simulate a button press ONLY if we are still on the Salinity Calibration menu screen
if (ReefAngel.DisplayedMenu == SAL_CALIBRATE_MENU) {
ButtonPress++;
}
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "howaboutme" );
ReefAngel.ShowInterface();
}
- Water change pump delay
- Salinity temp compensation
- Put skimmer on timer by setting it to daylight and controlled via portal
- Auto calibrate salinity probe to compensate for having the skimmer on overnight
This one's for my new UNS 75s tank:
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
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
ReefAngel.AddSalinityExpansion(); // Salinity Expansion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port5Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port2Bit | Port8Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Salinity Temp Compensation
ReefAngel.Salinity.SetCompensation(0);
// Ports that are always on
ReefAngel.Relay.On( Port3 );
ReefAngel.Relay.On( Port4 );
ReefAngel.Relay.On( Port5 );
ReefAngel.Relay.On( Port8 );
////// Place additional initialization code below here
ReefAngel.CustomLabels[0]="ATO Pump";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="MP10 Left";
ReefAngel.CustomLabels[3]="MP 10 Right";
ReefAngel.CustomLabels[4]="Return Pump";
ReefAngel.CustomLabels[5]="Doser Alk";
ReefAngel.CustomLabels[6]="Unused";
ReefAngel.CustomLabels[7]="Inkbird";
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.SingleATOLow( Port1 );
ReefAngel.StandardLights( Port2 ); // putting skimmer on timer
ReefAngel.Relay.DelayedOn(Port3 );
ReefAngel.Relay.DelayedOn(Port4 );
ReefAngel.DosingPumpRepeat1( Port6 )
////// Place your custom code below here
//DoserAlk Schedule
;if ((hour() > 10) && (hour() < 22)) { // Between 10am and 10pm we will disable Port 6
ReefAngel.Relay.Off(Port6);
}
// First 10 minutes after WC disable ATO for port 1
static time_t wcTimer;
if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
if (now()-wcTimer > 0 && now()-wcTimer < 600) {
ReefAngel.Relay.Off(Port1);
}
else {ReefAngel.SingleATOLow (Port1 );
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "howaboutme" );
ReefAngel.ShowInterface();
}
- Water change pump delay
- Salinity temp compensation
- Put skimmer on timer by setting it to daylight and controlled via portal