Here are my ideas:
- Enable Center lights on for 10mins after RA feed mode
- MP40: Change modes throughout the day, night mode when lights are off, feed mode
- I would like to put both MP40s on the main relay (flow1-3, return, skimmer, MP40, MP40)
- Change Power Failure mode so that a single MP40 goes to low power mode (Main Relay Box is connected to UPS)
I was thinking to update the light schedule. I have 3 separate fixtures, and was thinking of giving each a 15 minute break every few hours. Would it work just by giving separate ReefAngel.StandardLights for a single fixture, leaving 15 min gaps when necessary?
Thanks
Here is my current code.
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 <ReefAngel.h>
//--------------------------------- Place global variable code below here ---------------------------------
boolean PowerOutage=false;
boolean DelayedPowerOutage=false;
// Globals for Params on Custom Main
byte x,y;
char text[10];
//--------------------------------- Custom Menu ---------------------------------
#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Turn Lights On";
prog_char menu1_label[] PROGMEM = "Turn Lights Off";
prog_char menu2_label[] PROGMEM = "Start Feeding";
prog_char menu3_label[] PROGMEM = "Start Water Change";
prog_char menu4_label[] PROGMEM = "Clear Overheat";
prog_char menu5_label[] PROGMEM = "Calibrate pH";
prog_char menu6_label[] PROGMEM = "Display Version";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label };
void MenuEntry1()
{
ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
}
#endif // RelayExp
ReefAngel.Relay.Write();
}
void MenuEntry2()
{
ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
ReefAngel.Relay.RelayMaskOnE[i] = 0;
}
#endif // RelayExp
ReefAngel.Relay.Write();
}
void MenuEntry3()
{
ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();
}
void MenuEntry4()
{
ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();
}
void MenuEntry5()
{
ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();
}
void MenuEntry6()
{
ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry7()
{
ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.DisplayVersion();
}
//--------------------------------- End Custom Menu Globals ---------------------------------
//--------------------------------- Place global variable code above here ---------------------------------
//--------------------------------- Begin Custom Main ---------------------------------
void DrawCustomMain()
{
ReefAngel.LCD.DrawDate(5, 2);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();
// Display T1 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
ReefAngel.LCD.DrawHugeNumbers(COLOR_CRIMSON, 255, 5, 14, text);
pingSerial();
// Display pH Text
ReefAngel.LCD.DrawText(COLOR_INDIGO,255,80,14,"pH");
// Display pH Value
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_INDIGO, 255, 95, 14, text, Num8x16);
pingSerial();
// Display T3 Probe Text
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,255,80,24,"Rm");
// Display T3 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
ReefAngel.LCD.DrawLargeText(COLOR_ROYALBLUE, 255, 95, 24, text, Num8x16);
pingSerial();
//Moon Phase
ReefAngel.LCD.Clear(DefaultBGColor,5,88,95,95);
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,5,88,MoonPhaseLabel());
//Dimmable Moon LEDs
ReefAngel.LCD.DrawText(COLOR_NAVY,255,5,98, "MoonLEDs:");
ReefAngel.LCD.Clear(DefaultBGColor,59,98,75,106);
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,59,98, ReefAngel.PWM.GetActinicValue());
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,75,98, "%");
// Display Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 2, 107, TempRelay );
pingSerial();
// Display Expansion Relay Box 1
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 2, 119, TempRelay );
pingSerial();
}
void DrawCustomGraph()
{}
//--------------------------------- End Custom Main ---------------------------------
//--------------------------------- Begin Setup ---------------------------------
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
// Initialize the menu
ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port7Bit; //Flow1-3,Return,Skimmer,CoolingFan
ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit; //FrontT5,SumpHeater
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit | Port7Bit; // Flow1-3,Return,Skimmer,DispHeater,CoolingFan
ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit; //Front+BackT5,SumpHeater
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit; //Center+Front+BackT5
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port6Bit; //DispHeater
ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit; //Front+BackT5,FugeLight,SumpHeater
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 820 );
//--------------------------------- Place additional initialization code below here ---------------------------------
ReefAngel.Timer[1].SetInterval(5);
//--------------------------------- Place additional initialization code above here ---------------------------------
}
//--------------------------------- End Setup ---------------------------------
//--------------------------------- Begin Loop ---------------------------------
void loop()
{
// Ports that are always on
ReefAngel.Relay.On( Port1 ); //Flow1
ReefAngel.Relay.On( Port2 ); //Flow2
ReefAngel.Relay.On( Port3 ); //Flow3
ReefAngel.Relay.On( Port4 ); //Return
//Delay Start
ReefAngel.Relay.DelayedOn( Port5,5 ); //Skimmer
/*Feed Mode Delay on Pump
static boolean feeding=true;
static unsigned long feedingstarted = 0;
if (ReefAngel.DisplayedMenu==FEEDING_MODE)
{
if (!feeding)
{
feeding=true;
feedingstarted = now();
}
} else {
feeding=false;
}
int pumpdelay=InternalMemory.FeedingTimer_read()-240; // 4 minute delay
if (now()-feedingstarted<=pumpdelay) {
ReefAngel.Relay.Off( Port1 ); //Flow1
ReefAngel.Relay.Off( Port2 ); //Flow2
ReefAngel.Relay.Off( Port3 ); //Flow3
}
*/
// Ports that are delayed on Power Cycle & Feeding & Water Change
if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
{
PowerOutage=false;
DelayedPowerOutage=false;
LastStart=now();
}
// Heaters
ReefAngel.StandardHeater( Port6,770,774 ); //DispHeater
ReefAngel.StandardHeater( Box1_Port6,768,772 ); //SumpHeater
// Cooling Fan
ReefAngel.StandardFan( Port7,812,814 ); //Cooling Fan
// T5 Light Schedule
ReefAngel.StandardLights( Box1_Port1,9,0,20,0 ); //CenterT5 9a-8p
ReefAngel.StandardLights( Box1_Port2,10,0,18,0 ); //FrontT5 10a-6p
ReefAngel.StandardLights( Box1_Port3,10,30,18,45 ); //BackT5 1030a-645p
// RSMLED Moonlight Schedule
if (hour()>=6 && hour()<=8) ReefAngel.StandardLights( Box1_Port4,6,0,8,59 ); //RSMLED Morning 6a-9a
else if(hour()>=20 && hour()<=23) ReefAngel.StandardLights( Box1_Port4,20,0,23,45 ); //RSMLED Evening 8p-1145p
else if(hour()>=23 || hour()<=4) if (MoonPhase()>=90) ReefAngel.StandardLights( Box1_Port4,23,46,4,0 ); //RSMLED on for Full Moon 1146p-4a
// Fuge Light Schedule
//ReefAngel.StandardLights( Box1_Port5,0,0,8,0 ); //FugeLight 12a-8a
// PWM Dimmable Moonlights Schedule
if (hour()>=21 || hour()<4) // Turn Dimmable Moonlights on 9p & off 4a
{
ReefAngel.PWM.SetActinic(MoonPhase());
ReefAngel.PWM.SetDaylight(MoonPhase());
}
else
{
ReefAngel.PWM.SetActinic(0);
ReefAngel.PWM.SetDaylight(0);
}
//--------------------------------- Place your custom code below here ---------------------------------
// Turn on Fuge light during water change mode
//if (ReefAngel.DisplayedMenu==WATERCHANGE_MODE) ReefAngel.Relay.On(Box1_Port5);
// Power Outage - Only Flow2 port on
if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) PowerOutage=true; //Exp1 Relay NOT present
if (!PowerOutage)
{
ReefAngel.Timer[1].Start();
}
if (ReefAngel.Timer[1].IsTriggered())
{
DelayedPowerOutage=true;
}
if (DelayedPowerOutage)
{
ReefAngel.Relay.Off (Port1); //Flow1
//ReefAngel.Relay.Off (Port2); //Flow2
ReefAngel.Relay.Off (Port3); //Flow3
ReefAngel.Relay.Off (Port4); //Return
ReefAngel.Relay.Off (Port5); //Skimmer
ReefAngel.Relay.Off (Port6); //Heater
}
// Skimmer off when Return pump is off.
if (bitRead(ReefAngel.Relay.RelayMaskOff,3)==0) //Return
{
bitClear(ReefAngel.Relay.RelayMaskOff,4); //Skimmer
}
//////////// Place your custom code above here ////////////
// This should always be the last line
ReefAngel.Portal( "modulok" );
ReefAngel.ShowInterface();
}
//--------------------------------- End Loop ---------------------------------