Re: I/O Expansion and ATO 1, 2, 3, 4....
Posted: Thu Aug 24, 2017 7:40 pm
I had to scrap what I did partially due to a nuance with Arduino and sketches. Anyways, this function works but it's currently hard coded to ATO2. We can change it for future improvements if it works properly for you.
It compiles and will need tested. So give it a test and see how it does for you.
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
}