Thanks,
Jon
Here's the working pde...
Code: Select all
#include <ReefAngel_Features.h>
#include <ReefAngel_Globals.h>
#include <ReefAngel_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <ReefAngel_EEPROM.h>
#include <ReefAngel_NokiaLCD.h>
#include <ReefAngel_ATO.h>
#include <ReefAngel_Joystick.h>
#include <ReefAngel_LED.h>
#include <ReefAngel_TempSensor.h>
#include <ReefAngel_Relay.h>
#include <ReefAngel_PWM.h>
#include <ReefAngel_Timer.h>
#include <ReefAngel_Memory.h>
#include <ReefAngel.h>
#include <ReefAngel_Colors.h>
#include <ReefAngel_CustomColors.h>
//Actinic and Daylight PMW are on the LED moonlights
byte ActinicPWMValue=0;
byte DaylightPWMValue=0;
int maxTemp=0;
int minTemp=2000;
int maxPH=0;
int minPH=1000;
int flow =0;
int maxflow=0;
int minflow=1000;
time_t tsmax=now();
time_t tsmin=now();
time_t PHmax=now();
time_t PHmin=now();
time_t flowmax=now();
time_t flowmin=now();
byte wmport=Port5;
boolean wmdelay=false;
byte wmpulse=0;
#include <avr/pgmspace.h>
//Menu Items
prog_char menu1_label[] PROGMEM = "Feeding";
prog_char menu2_label[] PROGMEM = "Water Change";
prog_char menu3_label[] PROGMEM = "Temp Detail";
prog_char menu4_label[] PROGMEM = "pH Detail";
prog_char menu5_label[] PROGMEM = "Flow Detail";
// Group the menu entries together
PROGMEM const char *menu_items[] = {menu1_label, menu2_label, menu3_label,menu4_label,menu5_label};
// Labels for the web banner
prog_char id_label[] PROGMEM = "jsclownfish";
prog_char probe1_label[] PROGMEM = "Tank";
prog_char probe2_label[] PROGMEM = "Room";
prog_char probe3_label[] PROGMEM = "Sump";
prog_char relay1_label[] PROGMEM = "Heater1";
prog_char relay2_label[] PROGMEM = "Heater2";
prog_char relay3_label[] PROGMEM = "MHalide";
prog_char relay4_label[] PROGMEM = "Actinic";
prog_char relay5_label[] PROGMEM = "WM1";
prog_char relay6_label[] PROGMEM = "WM2";
prog_char relay7_label[] PROGMEM = "Main";
prog_char relay8_label[] PROGMEM = "Fan";
PROGMEM const char *webbanner_items[] = {
id_label, probe1_label, probe2_label, probe3_label, relay1_label, relay2_label,
relay3_label, relay4_label, relay5_label, relay6_label, relay7_label, relay8_label};
void DrawTime(byte x, byte y, byte FGcolor, byte BGcolor, time_t ts)
{
//byte iTimeHourOffset=0;
char text[13];
char temp[]=" ";
strcpy(text,"");
//if (iTimeHour>12) iTimeHourOffset=12;
itoa(hourFormat12(ts),temp,10);
if (temp[1]==0) strcat(text,"0");
strcat(text,temp);
strcat(text,":");
itoa(minute(ts),temp,10);
if (temp[1]==0) strcat(text,"0");
strcat(text,temp);
strcat(text,":");
itoa(second(ts),temp,10);
if (temp[1]==0) strcat(text,"0");
strcat(text,temp);
if (isAM(ts))
{
strcat(text," AM");
}
else
{
strcat(text," PM");
}
ReefAngel.LCD.DrawText(FGcolor, BGcolor, x, y, text);
}
void DrawCustomMain()
{
// update the min and max temps
if (now()%86400==0)
{
minTemp=ReefAngel.Params.Temp1;
maxTemp=ReefAngel.Params.Temp1;
}
if (ReefAngel.Params.Temp1<minTemp)
{
minTemp=ReefAngel.Params.Temp1;
tsmin=now();
// DrawTime(60,33);
}
if (ReefAngel.Params.Temp1>maxTemp)
{
maxTemp=ReefAngel.Params.Temp1;
tsmax=now();
// DrawTime(60,23);
}
//DrawTime(60,23,0, COLOR_WHITE,tsmax);
//DrawTime(60,33,0,COLOR_WHITE, tsmin);
// update the min and max pH
if (now()%86400==0)
{
minPH=ReefAngel.Params.PH;
maxPH=ReefAngel.Params.PH;
}
if (ReefAngel.Params.PH<minPH)
{
minPH=ReefAngel.Params.PH;
PHmin=now();
// DrawTime(60,33);
}
if (ReefAngel.Params.PH>maxPH)
{
maxPH=ReefAngel.Params.PH;
PHmax=now();
// DrawTime(60,23);
}
// update the min and max flow
if (now()%86400==0)
{
minflow=flow;
maxflow=flow;
}
if (flow<minflow)
{
minflow=flow;
flowmin=now();
// DrawTime(60,33);
}
if (flow>maxflow)
{
maxflow=flow;
flowmax=now();
// DrawTime(60,23);
}
// the graph is drawn/updated when we exit the main menu &
// when the parameters are saved
// Display the Tank temperature with color sensors
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,5,13,"TANK:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp1, COLOR_BLACK, 36, 13, 10);
//Display the pH
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 44,"PH:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.PH, 0, 23, 44, 100);
//Display the flo
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 75,"FLOW:");
ReefAngel.LCD.DrawSingleMonitor(flow, 0,36,75, 1);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 66, 75,"gal/hr");
pingSerial();
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 110, TempRelay);
ReefAngel.LCD.DrawDate(6, 2);
ReefAngel.LCD.Clear(0, 1, 11, 132, 11);
pingSerial();
}
void DrawCustomGraph()
{
}
void MenuEntry1()
{
ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
//Temperature detail screen with sump and room temp, 24 hr. max/min, time stamps, and graph
ReefAngel.ClearScreen(DefaultBGColor);
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,5,13,"TANK:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp1, COLOR_BLACK, 36, 13, 10);
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,5,23,"HI:");
ReefAngel.LCD.DrawSingleMonitor(maxTemp, 0, 23, 23, 10);
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,48,23,"at");
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,5,33,"LO:");
ReefAngel.LCD.DrawSingleMonitor(minTemp, 0, 23, 33, 10);
ReefAngel.LCD.DrawText(T1TempColor,DefaultBGColor,48,33,"at");
ReefAngel.LCD.DrawText(T2TempColor,DefaultBGColor, 5 ,43,"R00M:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp2, COLOR_BLACK, 36, 43, 10);
ReefAngel.LCD.DrawText(T3TempColor,DefaultBGColor, 5, 53,"SUMP:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp3, COLOR_BLACK, 36, 53, 10);
DrawTime(60,23,0, COLOR_WHITE,tsmax);
DrawTime(60,33,0,COLOR_WHITE, tsmin);
ReefAngel.LCD.Clear(DefaultBGColor,0,75,131,125);
ReefAngel.LCD.Clear(DefaultFGColor,1,75,1,125);
for (byte i=6; i<=131; i+=3)
{
ReefAngel.LCD.PutPixel(GraphDotLineColor, i, 100);
}
ReefAngel.LCD.DrawSingleGraph(T1TempColor,1,75,InternalMemory.T1Pointer_read());
ReefAngel.LCD.DrawSingleGraph(T2TempColor,1,75,InternalMemory.T1Pointer_read()+120);
ReefAngel.LCD.DrawSingleGraph(T3TempColor,1,75,InternalMemory.T1Pointer_read()+240);
pingSerial();
bool bDone = false;
do
{
// wait indefinitely for a button press
delay(200);
if ( ReefAngel.Joystick.IsButtonPressed() )
{
bDone = true;
}
} while ( ! bDone );
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry4()
{
//pH detail screen with 24 hr. max/min, time stamps, and graph
ReefAngel.ClearScreen(DefaultBGColor);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 13,"PH:");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.PH, 0, 36, 13, 100);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor,5, 23,"HI:");
ReefAngel.LCD.DrawSingleMonitor(maxPH, 0, 23, 23, 100);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 48, 23,"at");
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 33,"LO:");
ReefAngel.LCD.DrawSingleMonitor(minPH, 0, 23, 33, 100);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 48, 33,"at");
DrawTime(60,23,0, COLOR_WHITE,PHmax);
DrawTime(60,33,0,COLOR_WHITE, PHmin);
ReefAngel.LCD.Clear(DefaultBGColor,0,75,131,125);
ReefAngel.LCD.Clear(DefaultFGColor,1,75,1,125);
for (byte i=6; i<=131; i+=3)
{
ReefAngel.LCD.PutPixel(GraphDotLineColor, i, 100);
}
ReefAngel.LCD.DrawSingleGraph(PHColor,1,75,InternalMemory.T1Pointer_read()+360);
pingSerial();
bool bDone = false;
do
{
// wait indefinitely for a button press
delay(200);
if ( ReefAngel.Joystick.IsButtonPressed() )
{
bDone = true;
}
} while ( ! bDone );
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry5()
{
//Flow detail screen with 24 hr. max/min, & time stamps
ReefAngel.ClearScreen(DefaultBGColor);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 13,"FLOW:");
ReefAngel.LCD.DrawSingleMonitor(flow, 0,36,13, 1);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 66, 13,"gal/hr");
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor,5, 23,"HI:");
ReefAngel.LCD.DrawSingleMonitor(maxflow, 0, 23, 23, 1);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 48, 23,"at");
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 5, 33,"LO:");
ReefAngel.LCD.DrawSingleMonitor(minflow, 0, 23, 33, 1);
ReefAngel.LCD.DrawText(PHColor,DefaultBGColor, 48, 33,"at");
DrawTime(60,23,0, COLOR_WHITE,flowmax);
DrawTime(60,33,0,COLOR_WHITE, flowmin);
pingSerial();
bool bDone = false;
do
{
// wait indefinitely for a button press
delay(200);
if ( ReefAngel.Joystick.IsButtonPressed() )
{
bDone = true;
}
} while ( ! bDone );
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void setup()
{
ReefAngel.Init(); //Initialize controller and start web banner timer
ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
ReefAngel.LoadWebBanner(pgm_read_word(&(webbanner_items[0])), SIZE(webbanner_items));
ReefAngel.Timer[4].SetInterval(180); // set interval to 180 seconds
ReefAngel.Timer[4].Start();
ReefAngel.FeedingModePorts = B00110000;
ReefAngel.WaterChangePorts = B10110000;
// ReefAngel.OverheatShutoffPorts = B00000111;
// ReefAngel.LightsOnPorts = B00001100;
ReefAngel.Relay.On(Port5);
ReefAngel.Timer[1].SetInterval(InternalMemory.WM1Timer_read());
ReefAngel.Timer[1].Start();
// Ports that are always on
ReefAngel.Relay.On(Port7);
}
void loop()
{
// Specific functions
//1st Heater at 78.8, 2nd Heater at 77.0, MH on at 10AM off at 8PM, Actinics on at 9AM off at 9PM, Fan kicks on at 82.0
ReefAngel.StandardHeater(Port1,788,792);
ReefAngel.StandardHeater(Port2,770,792);
ReefAngel.MHLights(Port3,10,0,20,0,5);
ReefAngel.StandardLights(Port4,9,0,21,0);
ReefAngel.StandardFan(Port8,792,820);
// Wavemaker Code with night option
if (ReefAngel.Timer[1].IsTriggered() )
{
if ((hour() >= 21) || (hour() <= 8)) //from 9p-Midnight
{ //PWMSlope(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM,
// byte endPWM, byte Duration, byte oldValue)
wmpulse=PWMSlope(21,0,8,0,5,30,179,30);
if (wmdelay)
{
ReefAngel.Timer[1].SetInterval(wmpulse); // WM delay function from 30-170 sec.
ReefAngel.Timer[1].Start();
ReefAngel.Relay.Off(Port5);
ReefAngel.Relay.Off(Port6);
if (wmport==Port5) wmport=Port6; else wmport=Port5;
wmdelay=false;
}
else
{
ReefAngel.Timer[1].SetInterval(200-wmpulse); // WM bursts timing from 170-30 sec.
ReefAngel.Timer[1].Start();
ReefAngel.Relay.On(wmport);
wmdelay=true;
}
}
else
{
//8a-10p normal wave settings
ReefAngel.Timer[1].SetInterval(InternalMemory.WM1Timer_read());
ReefAngel.Timer[1].Start();
ReefAngel.Relay.Toggle(Port5);
ReefAngel.Relay.Toggle(Port6);
}
}
//Using Daylight ATO high signal piezo buzzer when temp exceeds 83F
//other options are lowATOpin or the LED pins as ReefAngel.PWM.SetDaylight(100); else ReefAngel.PWM.SetDaylight(0);
if (ReefAngel.Params.Temp1>830)
{
pinMode(highATOPin,OUTPUT);
digitalWrite(highATOPin,HIGH);
}
else
{pinMode(highATOPin,OUTPUT);
digitalWrite(highATOPin,LOW);
}
//Moonlight=byte PWMSlope(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte Duration, byte oldValue)
ReefAngel.PWM.SetActinic(ActinicPWMValue);
ActinicPWMValue=PWMSlope(7,00,22,0,0,100,60,ActinicPWMValue);
ReefAngel.PWM.SetDaylight(DaylightPWMValue);
DaylightPWMValue=PWMSlope(7,00,22,0,0,100,60,DaylightPWMValue);
// Web Banner stuff
if(ReefAngel.Timer[4].IsTriggered())
{
ReefAngel.Timer[4].Start();
ReefAngel.WebBanner();
}
{
//receive Light readout
Wire.requestFrom(9,1);
if (Wire.available())
{
flow=Wire.receive();
}
ReefAngel.ShowInterface();
}
}