Current full code as of 1/1/16.
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>
#include <SunLocation.h>
#include <Tide.h>
#include <Moon.h>
#include <WiFiAlert.h>
////// Place global variable code below here
SunLocation sl;
int avgph[10];
unsigned long totalavgph=0;
byte avgindex=0;
void DrawCustomMain()
{
byte x;
byte y = 2;
char text[7];
// *********** CHANGE TEMP READOUT COLOR DEPENDENT ON FAN AND HEATER STATUS ***********
int TempColor; // Color for drawing temperature
boolean HeatOn = ReefAngel.Relay.Status(Port6); // Get the status of the heater relay
if (HeatOn)
{
TempColor = COLOR_NAVY; // Blue text, too cold, heater is on
}
if (!HeatOn)
{
TempColor = COLOR_GREEN; // Green text, no fan or heater on
}
// ***********************************************************************************
int pHColor; // Color for drawing pH
boolean LowpH = (ReefAngel.Params.PH < 780) ; // Check for Low pH Value
boolean HighpH = (ReefAngel.Params.PH > 850); // Check for High pH Value
if (LowpH)
{
pHColor = COLOR_NAVY; // Blue text, Low pH value
}
if (HighpH)
{
pHColor = COLOR_RED; // Red text, High pH value
}
if (!LowpH && !HighpH)
{
pHColor = COLOR_GREEN; // Green text, pH acceptable
}
// ***********************************************************************************
ReefAngel.LCD.DrawLargeText(COLOR_DARKSLATEBLUE,DefaultBGColor, 6, 3, " Thunder Reef",Font8x8); // Put a banner at the top
ReefAngel.LCD.DrawDate(6, 119); // Put the date and time at the bottom
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 12, 132, 12); // Draw a black line under the banner
x = 6;
y += MENU_START_ROW*1.4; // MENU_START_ROW is 10, according to globals.h, so y=2+10+1=13
ReefAngel.LCD.DrawLargeText(COLOR_BLUE, COLOR_WHITE, x, y+1, " Temp pH");
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10); // Get T1 temp and convert
x = 2;
y += MENU_START_ROW*1.6;
ReefAngel.LCD.DrawHugeNumbers(COLOR_BLACK, TempColor, x, y, text); // Draw the temperature, white numbers on a colored background
ConvertNumToString(text, ReefAngel.Params.PH, 100); // Get pH reading and convert
x = 2;
y = MENU_START_ROW*2.6;
ReefAngel.LCD.DrawHugeNumbers(COLOR_YELLOW, pHColor, x+65, y+6, text); // Put pH on the screen
x += 6;
y += MENU_START_ROW*3.3;
ReefAngel.LCD.DrawLargeText(COLOR_INDIGO,DefaultBGColor,25,y,"Sump Level",Font8x8); // Draw the Sump Float switch status
if (ReefAngel.HighATO.IsActive())
{ReefAngel.LCD.FillCircle(15,y+3,7,COLOR_RED);
}
else
{
ReefAngel.LCD.FillCircle(15,y+3,7,COLOR_GREEN);
}
x += 6;
y += MENU_START_ROW*2.0;
ReefAngel.LCD.DrawLargeText(COLOR_INDIGO,DefaultBGColor,25,y,"Skimmer Cup",Font8x8); // Draw the Skimmer Cup Float switch status
if (ReefAngel.LowATO.IsActive()) {ReefAngel.LCD.FillCircle(15,y+3,7,COLOR_GREEN);
}
else
{
ReefAngel.LCD.FillCircle(15,y+3,7,COLOR_RED);
}
byte TempRelay = ReefAngel.Relay.RelayData; // Code for drawing the relay box
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 100, TempRelay);
}
void DrawCustomGraph()
{
}
////// 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.FeedingModePorts = Port1Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Ports toggled in Feeding Mode
ReefAngel.WaterChangePorts = Port1Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Ports toggled in Water Change Mode
ReefAngel.LightsOnPorts = Port2Bit | Port3Bit | Port4Bit; // Ports toggled when Lights On / Off menu entry selected
ReefAngel.OverheatShutoffPorts = Port2Bit | Port3Bit | Port4Bit | Port6Bit | Port7Bit; // Ports turned off when Overheat temperature exceeded
ReefAngel.TempProbe = T1_PROBE; // Use T1 probe as temperature and overheat functions
ReefAngel.OverheatProbe = T1_PROBE;
InternalMemory.OverheatTemp_write( 830 ); // Set the Overheat temperature setting
// Feeeding and Water Change mode speed
ReefAngel.DCPump.FeedingSpeed=0;
ReefAngel.DCPump.WaterChangeSpeed=0;
// Ports that are always on
ReefAngel.Relay.On( Port1 );
// Delayed start for skimmer to allow sump level to return to normal after water change or feed mode
ReefAngel.Relay.DelayedOn( Port7,4 );
////// Place additional initialization code below here
sl.Init(28.5708, -81.6995); // Lat/long for Clermont, FL
sl.SetOffset(-3,0,-3,0); // rise_hour, rise_seconds, set_hour, set_seconds (set 1 hr later for better viewing time)
randomSeed(now()%SECS_PER_DAY);
//Custom Variable [0] = Month/Season
ReefAngel.CustomLabels[0]="Return";
ReefAngel.CustomLabels[1]="Daylights";
ReefAngel.CustomLabels[2]="Actinics";
ReefAngel.CustomLabels[3]="Fuge Light";
ReefAngel.CustomLabels[4]="ATO Kalk";
ReefAngel.CustomLabels[5]="Heater";
ReefAngel.CustomLabels[6]="Skimmer";
ReefAngel.CustomLabels[7]="ATO RoDi";
////// Place additional initialization code above here
}
void loop()
{
// seasonal temperatures
SeasonalTemps();
ReefAngel.DayLights( Port2 ); // ATI DayLights (White+Purple) On 120 min after sunrise, off 120 min before sunset.
ReefAngel.ActinicLights( Port3 ); // ATI Actinic+ Lights (Blues). On at sunrise, off at sunset.
ReefAngel.MoonLights( Port4 ); // Refugium light. On 120 min before sunset, off 120 min after sunrise.
////// Place your custom code below here
if (hour()>=8 && hour()<10)
{
ReefAngel.PWM.SetDaylight( LongPulseMode(0,70,4,true) ); // Long pulse at 70% with 4s pulse on sync mode
ReefAngel.PWM.SetActinic( LongPulseMode(0,70,4,false) ); // Long pulse at 70% with 4s pulse on Anti-sync mode
}
else if (hour()>=10 && hour()<11)
{
ReefAngel.PWM.SetDaylight( LongPulseMode(0,73,2,true) ); // Long pulse at 73% with 2s pulse on sync mode
ReefAngel.PWM.SetActinic( LongPulseMode(0,73,2,false) ); // Long pulse at 73% with 2s pulse on Anti-sync mode
}
else if (hour()>=11 && hour()<12)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(0,78,408,true) ); // Short pulse at 78% with 408ms pulse on sync mode (3/4" surface wave)
ReefAngel.PWM.SetActinic( ShortPulseMode(0,78,408,false) ); // Short pulse at 78% with 408ms pulse on Anti-sync mode (3/4" surface wave)
}
else if (hour()>=12 && hour()<13)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(0,85,408,true) ); // Short pulse at 85% with 408ms pulse on sync mode (1" surface wave)
ReefAngel.PWM.SetActinic( ShortPulseMode(0,85,408,false) ); // Short pulse at 85% with 408ms pulse on Anti-sync mode (1" surface wave)
}
else if (hour()>=13 && hour()<14)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(30,90,408,true) ); // Short pulse at 30%/90% with 408ms pulse on sync mode (1" surface wave)
ReefAngel.PWM.SetActinic( ShortPulseMode(30,90,408,false) ); // Short pulse at 30%/90% with 408ms pulse on Anti-sync mode (1" surface wave)
}
else if (hour()>=14 && hour()<15)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(0,85,408,true) ); // Short pulse at 85% with 408ms pulse on sync mode (1" surface wave)
ReefAngel.PWM.SetActinic( ShortPulseMode(0,85,408,false) ); // Short pulse at 85% with 408ms pulse on Anti-sync mode (1" surface wave)
}
else if (hour()>=15 && hour()<17)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(0,80,408,true) ); // Short pulse at 80% with 408ms pulse on sync mode (3/4" surface wave)
ReefAngel.PWM.SetActinic( ShortPulseMode(0,80,408,false) ); // Short pulse at 80% with 408ms pulse on Anti-sync mode (3/4" surface wave)
}
else if (hour()>=17 && hour()<18)
{
ReefAngel.PWM.SetDaylight( ShortPulseMode(0,75,408,true) ); // Short pulse at 75% with 408ms pulse on sync mode (1/2" surface wave
ReefAngel.PWM.SetActinic( ShortPulseMode(0,75,408,false) ); // Short pulse at 75% with 408ms pulse on Anti-sync mode (1/2" surface wave)
}
else if (hour()>=18 && hour()<19)
{
ReefAngel.PWM.SetDaylight( LongPulseMode(38,89,3,true) ); // Long pulse at 38%/89% with 3s pulse on sync mode (Nutrient transport mode)
ReefAngel.PWM.SetActinic( LongPulseMode(38,89,3,false) ); // Long pulse at 38%/89% with 3s pulse on Anti-sync mode (Nutrient transport mode)
}
else if (hour()>=19 && hour()<20)
{
ReefAngel.PWM.SetDaylight( LongPulseMode(0,75,2,true) ); // Long pulse at 75% with 2s pulse on sync mode
ReefAngel.PWM.SetActinic( LongPulseMode(0,75,2,false) ); // Long pulse at 75% with 2s pulse on Anti-sync mode
}
else
{
ReefAngel.PWM.SetDaylight( ReefCrestMode(60,15,true) ); // reefcrest at 60% +/- 15% on sync mode (night Mode)
ReefAngel.PWM.SetActinic( ReefCrestMode(60,15,false) ); // reefcrest at 60% +/- 15% on Anti-sync mode (night mode)
}
if( ReefAngel.DisplayedMenu==FEEDING_MODE )
{
ReefAngel.PWM.SetActinic( LongPulseMode(0,60,1,false) );
ReefAngel.PWM.SetDaylight( LongPulseMode(0,60,1,true) );
}
if( ReefAngel.DisplayedMenu==WATERCHANGE_MODE )
{
ReefAngel.PWM.SetActinic(35);
ReefAngel.PWM.SetDaylight(35);
}
// enter feeding mode at 11:30am & 5pm
if ( (hour()==11 && minute()==30 && second()==0) || (hour()==17 && minute()==0 && second()==0))
{
ReefAngel.FeedingModeStart(); // turn on feeding mode
}
if(ReefAngel.LowATO.IsActive()) // Float switch in Skimmer Locker
{
ReefAngel.Relay.DelayedOn( Port7,4 );
}
else
{
ReefAngel.Relay.Off(Port7); // Turn off Skimmer when locker full.
}
if ((hour()>=20 || hour()<=8) && (ReefAngel.Params.PH < 830))
{
ReefAngel.SingleATO(false,Port5,210,0); // Sump switch. Kalk schedule 8pm - 8am if pH < 8.3 If ATO/Kalk runs for 210 seconds, then shut off and send alert.
ReefAngel.Relay.Off(Port8);
}
else
{
ReefAngel.SingleATO(false,Port8,210,0); // Sump switch. If ATO/RoDi runs for 210 seconds, then shut off and send alert.
ReefAngel.Relay.Off(Port5);
}
{
sl.CheckAndUpdate(); // handle updating sunrise and sunset values
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "DmnYnkee" );
ReefAngel.ShowInterface();
}
void SeasonalTemps ()
{
static int heatArray[][2] = { {802,806},// default in case of error in month=0 (June)
{783,787},//January (winter)
{786,790},//February (winter)
{789,793},//March (early spring)
{794,798},//April (spring)
{798,802},//May (spring)
{802,806},//June (early summer)
{806,810},//July (summer)
{810,814},//August (summer)
{806,810},//September (early fall)
{799,803},//October (fall)
{794,798},//November (fall)
{788,792} };//December (early winter)
ReefAngel.StandardHeater( Port6,heatArray[month()][0],heatArray[month()][1]);
}//end seasonalTemps