Code: Select all
#include <Salinity.h>
#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 <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
// CustomMainscreen_IOExpansion
byte x,y;
byte bkcolor;
void DrawCustomMain()
{
  // the graph is drawn/updated when we exit the main menu &
  // when the parameters are saved
  ReefAngel.LCD.DrawDate(6, 112);
  pingSerial();
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor(15, 60, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue());
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor(15, 60, ReefAngel.Params);
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
  pingSerial();
  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(12, 93, TempRelay);
  y=10;
  x=15;
  for (int a=0;a<6;a++)
  {
    if(ReefAngel.IO.GetChannel(a)) bkcolor=COLOR_RED;
    else bkcolor=COLOR_GREEN;
    if (a>2) x=75;
    if (a==3) y=10;
    ReefAngel.LCD.Clear(bkcolor, x, y-3, x+40,y-1);
    ReefAngel.LCD.Clear(bkcolor, x, y+8, x+40,y+10);
    ReefAngel.LCD.Clear(bkcolor, x, y, x+3,y+8);
    ReefAngel.LCD.Clear(bkcolor, x+37, y, x+40,y+8);
    ReefAngel.LCD.DrawText(COLOR_WHITE, bkcolor, x+3, y, "Input");
    ReefAngel.LCD.DrawText(COLOR_WHITE, bkcolor, x+32, y, a);
    y+=15;
  }
}
void DrawCustomGraph()
{
}
/*
 For more information about custom main screen: http://forum.reefangel.com/viewtopic.php?f=14&t=109
 */
// Define Relay Ports By Name
#define ATO1               1
#define ATO2               2
#define Skimmer            3
#define Daylights          4
#define Flowpumps1         5
#define Flowpumps2         6
#define Heaters            7
#define Return             8
// Custom ATO Functions
unsigned long ATO2_timer = 0;
boolean ATO2_topping = false;
void ATOoverIO(byte relay, int timeout, byte low_ioport, byte high_ioport){
   unsigned long TempTimeout = timeout;
   TempTimeout *= 1000;
   //Is the low switch active (meaning we need to top off) and are we not currently topping off
   //Then we set the timer to be now and start the topping pump
  if ( ReefAngel.IO.GetChannel(low_ioport) && (!ATO2_topping)) {
    ATO2_timer = millis();
    ATO2_topping = true;
    ReefAngel.Relay.On(relay);
  }
   // If the high switch is activated, this is a safeguard to prevent over running of the top off pump
  if ( ReefAngel.IO.GetChannel(high_ioport) ) {
    ATO2_topping = false;
    ReefAngel.Relay.Off(relay);
  }
    // If the current time minus the start time of the ATO pump is greater than the specified timeout value
    // AND the ATO pump is currently running:
    // We turn on the status LED and shut off the ATO pump
    // This prevents the ATO pump from continuously running.
  if ( (millis() - ATO2_timer > TempTimeout) && ATO2_topping ) {
    ReefAngel.LED.On();
    // Verify the bitset function works properly
    //bitSet(ReefAngel.AlertFlags, ReefAngel.ATOTimeOutFlag);
    ReefAngel.Relay.Off(relay);
  }
}
void setup()
{
  ReefAngel.Init(); // Initialize Controller
  ReefAngel.AddDateTimeMenu();
  ReefAngel.AddStandardMenu();
  ReefAngel.SetTemperatureUnit(Celsius);  // set Temperature to Celsius
  ReefAngel.FeedingModePorts = Port5Bit | Port6Bit; // Turn off Ports 5 and 6 when Feeding Mode is activated
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Turn off Ports 1, 2, 3, 5, 6, 7 and 8 when Water Change Mode is activated
  ReefAngel.OverheatShutoffPorts = Port4Bit | Port7Bit; // Turn off Ports 4 and 7 when Overheat Occurs
  ReefAngel.LightsOnPorts = Port4Bit; // Turn on/off Ports 4 when Turn Lights On/Off is activated
  ReefAngel.OverheatProbe = T1_PROBE; // Use Temperature probe 1, 2 and 3 to check for overheat
  ReefAngel.TempProbe = T1_PROBE; // Use Temperature probe 1, 2 and 3 to check temperature
  // Always on
  ReefAngel.Relay.On(Return);
  ReefAngel.Relay.On(Skimmer);
  ReefAngel.Relay.On(Flowpumps1);
  ReefAngel.Relay.On(Flowpumps2);
  // Initialize ATO2 values
  ATO2_timer = 0;  // always initialize to 0
  ATO2_topping = false;  // always initialize to false
}
void loop()
{
  ReefAngel.StandardATO(ATO1); // Standard ATO
  // ATOoverIO(Relay, Timeout, low io port, high io port)
  ATOoverIO(ATO2, 150, 0, 1); // Alternate ATO2
  ReefAngel.StandardLights(Daylights); // Daylight Lights
  ReefAngel.StandardHeater(Heaters); // Heater
  ReefAngel.PWM.StandardDaylight(); // Dimming for Daylight Channel
  ReefAngel.PWM.StandardActinic(30); // Dimming for Actinic Channel
  ReefAngel.ShowInterface(); // Display everything on the LCD screen
}
