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.AddStandardMenu(); // Add Standard Menu
ReefAngel.AddWifi(); // Add Wifi
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port2Bit | Port8Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port2Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port4Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 830 );
// Feeeding and Water Change mode speed
ReefAngel.DCPump.FeedingSpeed=0;
ReefAngel.DCPump.WaterChangeSpeed=0;
// Ports that are always on
////// Place additional initialization code below here
// Define labels for 2014 LCD screen
//box0
ReefAngel.CustomLabels[0]="T5HO";
ReefAngel.CustomLabels[1]="Skimmer";
ReefAngel.CustomLabels[2]="FugeLight";
ReefAngel.CustomLabels[3]="Heater";
ReefAngel.CustomLabels[4]="ScrubLight";
ReefAngel.CustomLabels[5]="Kalk_Mixer";
ReefAngel.CustomLabels[6]="Kalk_ATO";
ReefAngel.CustomLabels[7]="RO_ATO";
//lowers minimum speed for DC pump
InternalMemory.DCPumpThreshold_write(0);
//gives random sopmething to randomize against
randomSeed(now()/SECS_PER_DAY);
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.Portal("slm222"); //wifi
ReefAngel.MHLights( Port1,12,30,14,30,5 ); //t5ho
ReefAngel.MHLights( Port2,7,0,22,0,5 ); //skimmer
ReefAngel.StandardLights( Port3,18,0,10,0 ); //fugelight
ReefAngel.StandardHeater( Port4,785,788 ); //heater
ReefAngel.StandardLights( Port5,18,0,10,0 ); //scrubber light
ReefAngel.DosingPumpRepeat( Port6,0,240,25 ); // kalk mixing every 6 hours for 25 seconds
////// Place your custom code below here
////// Wave Pattern Code Start
//Hardcode minimum speed of DC pumps
ReefAngel.DCPump.Threshold=0;
// Add random mode if we set to Mode to Custom in portal
static int rmode;
static boolean changeMode=true;
// These are the modes we can cycle through. You can add more and even repeat...
byte modes[] = { ReefCrest, NutrientTransport, TidalSwell, Lagoon, Else, ReefCrest, Else };
ReefAngel.DCPump.DaylightChannel = Sync;
ReefAngel.DCPump.ActinicChannel = AntiSync;
if (now()%SECS_PER_DAY==0 || changeMode==true) { // Change at midnight or if controller rebooted
rmode=random(100)%sizeof(modes); // Change the mode once per day to pick from our array
changeMode=false;
}
// Set timer when in feeding mode
static unsigned long feeding;
if (ReefAngel.DisplayedMenu==FEEDING_MODE) feeding=now();
// after feed mode Continue NTM for the 60 minutes
if (now()-feeding<1800) {
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=Else;
}
//7am to 9am - wake up from night mode
else if (hour()>=7 && hour()<9){
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=350;
ReefAngel.DCPump.Mode=Sine;
ReefAngel.DCPump.Speed=50;
}
//9am to 10am - ramp up to random
else if (hour()>=9 && hour()<10){
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=Lagoon;
ReefAngel.DCPump.Speed=60;
}
//10am to 6pm - Random
else if (hour()>=10 && hour()<18) {
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=modes[rmode]; // Put the mode to the random mode :)
ReefAngel.DCPump.Speed=70;
}
//6pm to 7pm - slow down from random
else if (hour()>=18 && hour()<19){
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=Lagoon;
ReefAngel.DCPump.Speed=60;
}
//7pm to 9pm - slow down to night mode
else if (hour()>=19 && hour()<21){
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=350;
ReefAngel.DCPump.Mode=Sine;
ReefAngel.DCPump.Speed=50;
}
// Night mode
else {
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=450;
ReefAngel.DCPump.Mode=Sine;
ReefAngel.DCPump.Speed=40;
}
////// Wave Pattern Code End
////// ATO RO and Kalk Settings
if ((hour()>18 || hour()<9) && (ReefAngel.Params.PH < 822))
{
ReefAngel.SingleATO( true,Port7,600,0 ); // Sump switch. Kalk schedule 6pm - 7am if pH < 8.25 If ATO/Kalk runs for 10 minutes=600 seconds, then shut off.
ReefAngel.Relay.Off(Port8);
}
else
{
ReefAngel.SingleATO( true,Port8,500,0 ); // Sump switch. If ATO/RoDi runs for 8.20 minutes=480 seconds, then shut off.
ReefAngel.Relay.Off(Port7);
}
////// End ATO RO and Kalk Settings
////// Place your custom code above here
// This should always be the last line
ReefAngel.ShowInterface();
}