Code: Select all
//// Port 1 Heater
//// Port 2 ATO pump
//// Port 3 Feeder
//// Port 4 Protein Skimmer
//// Port 5 Return Pump
//// Port 6 Wavemakers
//// Port 7 UV Sterilizer
//// Port 8 Cabinet Light
//// BOX 1 PORT 1 Calcium Doser
//// BOX 1 PORT 2 Alkalinity Doser
//// BOX 1 PORT 3 Media Reactor
//// BOX 1 PORT 8 Sump Fan
//// BOX 1 PORT 8 Fans
//// Probe T1 SUMP
//// Probe T2 Tank
//// Probe T3 Canopy
#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>
#include <DCPump.h>
////// Place global variable code below here
#define Heater Port1
#define Topoff Port2
#define Feeder Port3
#define Skimmer Port4
#define Return Port5
#define Wave Port6
#define UVlight Port7
#define Fugelight Port8
#define CanopyFan Box1_Port8
#define CalcDose Box1_Port1
#define AlkDose Box1_Port2
#define Reactor Box1_Port3
#define SumpFan Box1_Port7
#define FugelightBit 1<<7
#define UVlightBit 1<<6
#define WaveBit 1<<5
#define ReturnBit 1<<4
#define SkimmerBit 1<<3
#define FeederBit 1<<2
#define TopoffBit 1<<1
#define HeaterBit 1<<0
static byte wpMode;
static byte wpWavStr;
static byte wpWavOff;
unsigned long NoteTime;
////// 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.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expansion Module
ReefAngel.Network.WifiAuthentication("Smotz:xxxxxx");
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = SkimmerBit | ReturnBit | TopoffBit | UVlightBit ;
ReefAngel.FeedingModePortsE[0] = FeederBit; ////Reactor
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = HeaterBit | SkimmerBit | ReturnBit | TopoffBit | WaveBit | UVlightBit | FeederBit ;
ReefAngel.WaterChangePortsE[0] = FeederBit; ///reactor
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = FugelightBit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = HeaterBit | TopoffBit | SkimmerBit | ReturnBit | WaveBit | UVlightBit | FeederBit | Reactor;
ReefAngel.OverheatShutoffPortsE[0] = FeederBit; ////reactor
// Use T2 (Tank) probe as temperature and overheat functions
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T2_PROBE;
// Ports that are always off
ReefAngel.Relay.Off( Feeder );
ReefAngel.Relay.Off( Topoff );
// Ports that are always on
ReefAngel.Relay.On( Box1_Port3 );
ReefAngel.Relay.On( Box1_Port4 );
ReefAngel.Relay.On( Box1_Port5 );
ReefAngel.Relay.On( Box1_Port6 );
ReefAngel.Relay.On( Box1_Port7 );
// DCPUMP
ReefAngel.DCPump.FeedingSpeed=255;
ReefAngel.DCPump.WaterChangeSpeed=0;
ReefAngel.DCPump.ActinicChannel=Sync;
ReefAngel.DCPump.DaylightChannel=AntiSync;
ReefAngel.DCPump.Threshold=30;
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.Relay.On( Return );
ReefAngel.Relay.On( Wave );
ReefAngel.Relay.Off( Feeder );
ReefAngel.MoonLights( Fugelight );
ReefAngel.StandardHeater( Heater );
ReefAngel.StandardFan( SumpFan );
////// Place your custom code below here
// Static bool to track if we are currently feeding or not
static boolean feedingActive = false;
//FEEDING MODE
// Begin Feeding Mode
if (((hour() == 7)) && (minute() == 30) || (hour() == 18) && (minute() == 00)) {
ReefAngel.FeedingModeStart(); // FEEDING MODE @ 7:30 AM or 6:00 PM
NoteTime = millis(); // Grab millis value of when feeding mode started
feedingActive = true; // We are entering feeding mode, so set to true
}
if (feedingActive) {
unsigned long DeltaTS = millis() - NoteTime;
if ( DeltaTS >= 130000 ) {
ReefAngel.Relay.Off(Feeder); // turn off 2 minutes 10 secs
feedingActive = false; // Feeding mode is now over, set to false
} else
if ( DeltaTS >= 120000 ) ReefAngel.Relay.On(Feeder); // turn on after 2 minutes
else
if ( DeltaTS >= 70000 ) ReefAngel.Relay.Off(Feeder); // turn off 1 min 10 secs
else
if ( DeltaTS >= 60000 ) ReefAngel.Relay.On(Feeder); // turn on after 1 minute
}
// Main Top Off
// ReefAngel.WaterLevelATO(1,Topoff,15,85,95);
if ( ReefAngel.WaterLevel.GetLevel(1) <=85 && ReefAngel.WaterLevel.GetLevel(2) <=85) ReefAngel.Relay.On (Topoff);
if ( ReefAngel.WaterLevel.GetLevel(1) >=95 || ReefAngel.WaterLevel.GetLevel(2) >=95) ReefAngel.Relay.Off (Topoff);
if ( ReefAngel.WaterLevel.GetLevel(1) >= 145 || ReefAngel.WaterLevel.GetLevel(2) >= 145 ) ReefAngel.Relay.Override(Topoff,0);
//Dosing
ReefAngel.DosingPumpRepeat1( CalcDose );
ReefAngel.DosingPumpRepeat2( AlkDose );
//// 30,20 = 17.5 ml day
//// ReefAngel.DosingPumpRepeat(CalcDose,0,30,20);
//// ReefAngel.DosingPumpRepeat(AlkDose,10,30,20);
// Turn on Canopy Fans when the temp of T3 (Canopy) gets above 85.0 degrees
if ( ReefAngel.Params.Temp[T3_PROBE] >= 850 ) ReefAngel.Relay.On( CanopyFan );
// Turn off Canopy Fans when the temp of T2 (Canopy) gets below 80.0 degrees
if ( ReefAngel.Params.Temp[T3_PROBE] < 800 ) ReefAngel.Relay.Off( CanopyFan );
ReefAngel.Relay.DelayedOn(Skimmer,5);
ReefAngel.Relay.DelayedOn(Reactor,2);
// Buzzer if temp is too high or low, or waterlevel 1 is too high or too low.
if (ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && ReefAngel.DisplayedMenu!=FEEDING_MODE) // Only check if not Feeding Mode or Water Change Mode
{
if ( ReefAngel.Params.Temp[T2_PROBE] < 700 || ReefAngel.Params.Temp[T2_PROBE] > 850 || ReefAngel.WaterLevel.GetLevel(1) > 140 || ReefAngel.WaterLevel.GetLevel(1) < 70)
{
pinMode(lowATOPin,OUTPUT);
digitalWrite(lowATOPin,HIGH);
}
else
{
pinMode(lowATOPin,OUTPUT);
digitalWrite(lowATOPin,LOW);
}}
// Turn the fugelight on if the return is off
if (ReefAngel.Relay.Status ( Return ) == 0) ReefAngel.Relay.On( Fugelight );
// Custom Wave Routine
if (InternalMemory.DCPumpMode_read()==11)
{
ReefAngel.DCPump.UseMemory=false;
// set the wpMode based on what time it is
if (ReefAngel.DisplayedMenu==FEEDING_MODE) wpMode=5; // Feeding Mode
else
if ( (hour() >= 2) && (hour() < 8) ) wpMode=1; // from 2am - 8am
else
if ( (hour() >= 8) && (hour() < 11) ) wpMode=4; // from 8am - 11am Nutrient Transport
else
if ( (hour() >= 11) && (hour() < 14) ) wpMode=2; // from 11a - 2pm
else
if ( (hour() >= 14) && (hour() < 17) ) wpMode=3; // from 2pm - 5pm
else
if ( (hour() >= 17) && (hour() < 20) ) wpMode=2; // from 5pm - 8pm
else
if ( (hour() >= 20) && (hour() < 23) ) wpMode=3; // from 8pm - 11p
else
if (hour() >= 23) wpMode=2; // from 11pm - midnight
else
if (hour() < 2) wpMode=1; // from midnight - 2am
switch (wpMode)
{
case 1: // 2am to 8am Night Mode
wpWavStr=35;
wpWavOff=10;
ReefAngel.DCPump.SetMode (Sine, wpWavStr, wpWavOff);
break;
case 2: // 5am to 8am, 11am to 2pm, 5pm to 8pm, 11pm to midnight
wpWavStr=45;
wpWavOff=3;
ReefAngel.DCPump.SetMode (Else, wpWavStr, wpWavOff);
break;
case 3: // 2pm to 5pm, 8pm to 11pm
wpWavStr=65;
wpWavOff=7;
ReefAngel.DCPump.SetMode (Else, wpWavStr, wpWavOff);
break;
case 4: // 8am to 11am
wpWavStr=70;
wpWavOff=10;
ReefAngel.DCPump.SetMode (NutrientTransport, wpWavStr,wpWavOff);
break;
case 5: //feeding mode
wpWavStr=30;
wpWavOff=3;
ReefAngel.DCPump.SetMode (LongPulse, wpWavStr, wpWavOff);
break;
}
}
else ReefAngel.DCPump.UseMemory = true; // If it's not custom mode on the portal, then do what mode the portal says.
// End Custom Wave Routine
// Only turn on UV Sterilizer between 11pm and 3am
if ( (hour() >= 3) && (hour() < 23) ) // from 3a - 11p
ReefAngel.Relay.Off(UVlight);
else ReefAngel.Relay.On(UVlight);
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "Smotz" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 5, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 5, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
// Salinity
// ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,20,80, "SAL:" );
// ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,44,80, ReefAngel.Params.Salinity );
// pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 95, TempRelay );
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 105, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
//draw the mode on the screen
char buf[16];
char buf2[16];
// char buf3[32];
sprintf(buf,"%d%% +/- %d%%",wpWavStr,wpWavOff);
sprintf(buf2,"Wave Mode = %d%",wpMode);
// sprintf(buf3,"Return Power = %d%",InternalMemory.LEDPWMActinic_read());
// ReefAngel.LCD.DrawText(0,255,10,40,buf3);
ReefAngel.LCD.DrawText(0,255,20,60,buf);
ReefAngel.LCD.DrawText(0,255,20,50,buf2);
}
void DrawCustomGraph()
{
}