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>
// Define Relay Ports by Name
#define KalkDoser 1
#define WCEmpty 2
#define Autotopoff 3
#define Refugium 4
#define KalkStirrer 5
#define WCFill 6
#define Heater 7
#define Return 8
#define RODIValve Box1_Port1
#define Skimmer Box1_Port2
#define Unused Box1_Port3
#define Unused Box1_Port4
#define Unused Box1_Port5
#define Unused Box1_Port6
#define Unused Box1_Port7
#define Unused Box1_Port8
////// Place global variable code below here
byte wpMode;
int WCstatus;
////// Place global variable code above here
void setup()
{
// This must be the first line
InternalMemory.LCDID_write(0);
ReefAngel.Init(); //Initialize controller
ReefAngel.AddDateTimeMenu();
ReefAngel.AddStandardMenu(); // Add Standard Menu
ReefAngel.PHMin=546;//PH7.0
ReefAngel.PHMax=734;//PH10.0
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port3Bit | Port7Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port4Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port7Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 810 );
ReefAngel.Timer[1].SetInterval(180);
// Ports that are always on
ReefAngel.Relay.On( Return ); // Return Pump
ReefAngel.Relay.On( Skimmer ); // Skimmer
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
////// Place your custom code below here
CheckPower(); // Monitor for power outages
ReefAngel.PWM.SetChannel( 0, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.PWM.SetChannel( 1, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.PWM.SetChannel( 2, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.PWM.SetChannel( 3, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.PWM.SetChannel( 4, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.PWM.SetChannel( 5, PWMSlope(9,30,21,30,17,100,60,0) );
ReefAngel.WaterLevelATO(Port3,120,43,45);
if (ReefAngel.LowATO.IsActive()) ReefAngel.Relay.On(RODIValve);
if (!ReefAngel.HighATO.IsActive()) ReefAngel.Relay.Off(RODIValve);
ReefAngel.DosingPumpRepeat( Port1,0,45,6 );
if (ReefAngel.Params.PH>=850) ReefAngel.Relay.Off(KalkDoser);
ReefAngel.StandardLights( Port4,20,0,8,0 );
ReefAngel.Relay.Set(Port5,now()%7200<900);
ReefAngel.StandardHeater( Port7,780,785 );
if (hour()>=6 && hour()<11)
{
ReefAngel.PWM.SetDaylight( TidalSwellMode(60,true) ); // Tidal Swell at 60% on sync mode
ReefAngel.PWM.SetActinic( TidalSwellMode(60,false) ); // Tidal Swell at 60% on anti-sync mode
wpMode=1;
}
else if (hour()>=11 && hour()<15)
{
ReefAngel.PWM.SetDaylight( ReefCrestMode(65,20,true) ); // ReefCrest at 60% +/- 20 on sync mode
ReefAngel.PWM.SetActinic( ReefCrestMode(65,20,false) ); // ReefCrest at 60% +/- 20 on anti-sync mode
wpMode=2;
}
else if (hour()>=15 && hour()<18)
{
ReefAngel.PWM.SetDaylight( NutrientTransportMode(75,90,2000,true) ); // Nutrient Transport on sync mode
ReefAngel.PWM.SetActinic( NutrientTransportMode(75,90,2000,false) ); // Nutrient Transport on anti-sync mode
wpMode=3;
}
else if (hour()>=18 && hour()<20)
{
ReefAngel.PWM.SetDaylight( ReefCrestMode(65,20,true) ); // ReefCrest at 60% +/- 20 on sync mode
ReefAngel.PWM.SetActinic( ReefCrestMode(65,20,false) ); // ReefCrest at 60% +/- 20 on anti-sync mode
wpMode=2;
}
else if (hour()>=20 && hour()<23)
{
ReefAngel.PWM.SetDaylight( TidalSwellMode(60,true) ); // Tidal Swell at 60% on sync mode
ReefAngel.PWM.SetActinic( TidalSwellMode(60,false) ); // Tidal Swell at 60% on anti-sync mode
wpMode=1;
}
else
{
ReefAngel.PWM.SetDaylight( SineMode(38,48,30,true) ); // Sine at 30% 45% with for 30s on sync mode
ReefAngel.PWM.SetActinic( SineMode(38,48,30,false) ); // Sine at 30% 45% with for 30s on anti sync mode
wpMode=4;
}
if (ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
{
if (WCstatus==-1)
{
ReefAngel.Timer[1].Start();
WCstatus=0;
}
if ( ReefAngel.Timer[1].IsTriggered() )
{
ReefAngel.Relay.On(WCEmpty);
WCstatus=1;
}
if (ReefAngel.WaterLevel.GetLevel()<=15 && WCstatus>0 && WCstatus<10) WCstatus++;
if (ReefAngel.WaterLevel.GetLevel()<=15 && WCstatus==10)
{
WCstatus=11;
ReefAngel.Relay.Off(WCEmpty);
ReefAngel.Relay.On(WCFill);
}
if (ReefAngel.WaterLevel.GetLevel()<=81 && WCstatus>10 && WCstatus<20) WCstatus++;
if (ReefAngel.WaterLevel.GetLevel()>81 && WCstatus==20)
{
ReefAngel.Relay.Off(WCFill);
ButtonPress++;
}
}
else
{
WCstatus=-1;
ReefAngel.Relay.Off(WCEmpty);
ReefAngel.Relay.Off(WCFill);
}
ReefAngel.Portal("Drs1210");
ReefAngel.ShowInterface(); // Display everything on the LCD screen
}
void CheckPower() {
static boolean powerOutage=false;
// Power Outage - turn off everything
if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) // Expansion Relay NOT present
{
powerOutage=true;
ReefAngel.Relay.Off(KalkDoser);
ReefAngel.Relay.Off(WCEmpty);
ReefAngel.Relay.Off(Refugium);
ReefAngel.Relay.Off(KalkStirrer);
ReefAngel.Relay.Off(WCFill);
ReefAngel.Relay.Off(Heater);
ReefAngel.Relay.Off(RODIValve);
ReefAngel.Relay.Off(Skimmer);
}
// Power Restored - Turn things back on
if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
{
LastStart=now();
powerOutage=false;
ReefAngel.Relay.On(Return);
ReefAngel.Relay.On(Skimmer);
}
}
void DrawCustomMain()
{
byte x = 6;
byte y = 2;
byte t;
char text[7];
ReefAngel.LCD.DrawDate(6, 3);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();
ReefAngel.LCD.DrawText(COLOR_BLACK,255,56,84, "Res");
ReefAngel.LCD.DrawText(COLOR_GREEN,255, 45, 83, "H");
ReefAngel.LCD.DrawText(COLOR_GREEN,255, 45, 93, "I");
ReefAngel.LCD.DrawText(COLOR_RED,255, 77, 83, "L");
ReefAngel.LCD.DrawText(COLOR_RED,255, 77, 93, "O");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 75, "--------------------");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 101, "--------------------");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 78, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 88, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 98, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 78, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 88, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 98, "|");
ReefAngel.LCD.DrawText(0,255,10,30,"Tank");
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 10, 40, text, Num8x8);
pingSerial();
ReefAngel.LCD.DrawText(0,255,100,30,"pH");
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_PLUM, 255, 91, 40, text, Num8x8);
pingSerial();
ReefAngel.LCD.DrawText(0,255,43,48,"Salinity");
ConvertNumToString(text, ReefAngel.Params.Salinity, 100);
ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN, 255, 49, 58, text, Num8x8);
pingSerial();
ReefAngel.LCD.DrawText(0,255,8,68,"WC");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T3_PROBE], COLOR_CHOCOLATE, 25, 68, 10);
pingSerial();
ReefAngel.LCD.DrawText(0,255,66,68,"Room");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T2_PROBE], COLOR_MEDIUMORCHID, 94, 68, 10);
pingSerial();
ReefAngel.LCD.DrawText(0,255,15,83,"WL");
ConvertNumToString(text, ReefAngel.WaterLevel.GetLevel(),1);
ReefAngel.LCD.DrawLargeText(COLOR_BLUE, 255, 10, 92, text, Num8x8);
ReefAngel.LCD.DrawText(0,255,26,92," %");
pingSerial();
// WP40 Mode
ReefAngel.LCD.DrawText(0,255,x,y,"Jebao WP40 Mode:");
ReefAngel.LCD.Clear(DefaultBGColor,x,y,128-x,y+8);
if (wpMode == 1) ReefAngel.LCD.DrawText(COLOR_GREEN,255,x,y,"Tidal Swell");
else if (wpMode == 2) ReefAngel.LCD.DrawText(COLOR_MAGENTA,255,x,y,"Reef Crest");
else if (wpMode == 3) ReefAngel.LCD.DrawText(COLOR_GOLD,255,x,y,"Nutrient");
else if (wpMode == 4) ReefAngel.LCD.DrawText(COLOR_RED,255,x,y,"Sine Mode");
ReefAngel.LCD.DrawText(0,255,96,83,"WP40");
ConvertNumToString(text, ReefAngel.PWM.GetActinicValue(),1);
ReefAngel.LCD.DrawLargeText(COLOR_OLIVE, 255, 99, 92, text, Num8x8);
ReefAngel.LCD.DrawText(0,255,115,92," %");
pingSerial();
// Main Relay box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(14, 106, TempRelay);
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 14, 118, TempRelay );
pingSerial();
if (ReefAngel.HighATO.IsActive())
ReefAngel.LCD.FillCircle(57,96,3,COLOR_RED);
else
ReefAngel.LCD.FillCircle(57,96,3,COLOR_GREEN);
if (ReefAngel.LowATO.IsActive())
ReefAngel.LCD.FillCircle(70,96,3,COLOR_RED);
else
ReefAngel.LCD.FillCircle(70,96,3,COLOR_GREEN);
}
void DrawCustomGraph()
{
}