ato CODE not working
Posted: Sat May 10, 2014 8:28 pm
Im trying to get this code to work. My pump is on ATO low and the float switch for the ATO tank is on high. The portal shows the proper status of switches. But the relay doesnt switch to on. What is happening?
Code: Select all
ReefAngel.SingleATO( false,Port6,60,0 ); //Port 6 Auto top off
if (ReefAngel.HighATO.IsActive()) ReefAngel.Relay.Override(Port6,0);
Code: Select all
#include <Salinity.h>
#include <Relay.h>
#include <RA_ATO.h>
#include <RF.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 <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
////// Place global variable code below here
byte myRFMode=0;
byte myRFDuration=0;
byte myRFSpeed=0;
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
// Ports toggled
ReefAngel.WaterChangePorts = Port1 |Port3 | Port7| Port8| Box1_Port1| Box1_Port3| Box1_Port4| Box1_Port5; // Turn off Return, UV, Skimmer, Heater, Sump Equipment, ATO
ReefAngel.FeedingModePorts = Port3 | Port8; // Turn off Return and Skimmer
ReefAngel.LightsOnPorts = Port2|Box1_Port6; //Turn on ATI lights, Fan and Fuge Light
ReefAngel.OverheatShutoffPorts = Port1 |Port3 | Port7| Port8| Box1_Port1| Box1_Port3| Box1_Port4| Box1_Port5; // ATI Lights and Heaters
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T2_PROBE;
InternalMemory.OverheatTemp_write( 825 ); // Set the Overheat temperature setting
// Ports that are always on
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
//Box1
ReefAngel.StandardHeater(Port1,778,790 ); // Port1 Heater
ReefAngel.StandardLights( Port2,23,0,9,0 ); // Fuge Light
ReefAngel.Relay.On(Port3); // Port3 Return Pump -- Always on
ReefAngel.Relay.Off(Port4); // Port4 RODI
ReefAngel.Relay.Off(Port5); // Port5 Saltwater Change
ReefAngel.SingleATO( false,Port6,60,0 ); //Port 6 Auto top off
if (ReefAngel.HighATO.IsActive()) ReefAngel.Relay.Override(Port6,0);
ReefAngel.Relay.On (Port7); // Port7 Frag Tank -- Always on
ReefAngel.Relay.DelayedOn( Port8,5 ); // Port8 Skimmer -- 5 min delay start
//box 2 (Box1_Portxx)
ReefAngel.StandardHeater( Box1_Port1,778,790 ); // 9 Box1_Port1 Heater
ReefAngel.Relay.Off(Box1_Port2); // 10 Box1_Port2 Acropower Dosing ...
ReefAngel.Relay.Off( Box1_Port3); // 11 Box1_Port3 UV - Only turn on UV Sterilizer between 11pm and 4am
if ( (hour() >= 4) && (hour() < 23) )
ReefAngel.Relay.Off(Box1_Port3);
else ReefAngel.Relay.On(Box1_Port3);
ReefAngel.Relay.On( Box1_Port4); // 12 Box1_Port4 Sump Equipment-- Always on
ReefAngel.Relay.Off(Box1_Port5); // 13 Box1_Port5 JBJ Auto top off
ReefAngel.Relay.On(Box1_Port6); // 14 Box1_Port6 Cabinet Light
ReefAngel.Relay.Off( Box1_Port7); // 15 Box1_Port7 ALK Doser
ReefAngel.Relay.Off( Box1_Port8); // 16 Box1_Port8 Calc Doser
// Old Code
//moonlight dimming
// if (hour()>=6 && hour()<10) ReefAngel.PWM.SetDaylight( PWMParabola(6,0,10,0,9,100,9) ); // Moonlight Between 5-10am turn the relay on
// if (hour()>=20 && hour()<=23) ReefAngel.PWM.SetDaylight( PWMParabola(20,0,23,0,100,0,100) ); // From 8pm-Midnight turn the relay on
// else ReefAngel.PWM.SetDaylight(0);
// ReefAngel.Relay.Set( Port2, !ReefAngel.Relay.Status( Port4 ) ); //Refuge opposite of Actinic
// ReefAngel.Relay.Off( Box1_Port3); // Start with the relay off Port #11 Moonlight
//if (hour()>=5 && hour()<10) ReefAngel.Relay.On(Box1_Port3); // Moonlight Between 5-10am turn the relay on
//if (hour()>=20 && hour()<=23) ReefAngel.Relay.On(Box1_Port3); // From 8pm-Midnight turn the relay
// ReefAngel.PWM.SetDaylight( PWMSlope(20,0,23,0,100,0,180,100) );
// ReefAngel.PWM.SetDaylight( PWMSlope(6,0,10,0,9,100,240,9) );
//ReefAngel.Relay.off(Box1_Port3);
// if (hour()>=10 || hour()<20) ReefAngel.PWM.SetDaylight(0);
// ReefAngel.PWM.SetDaylight( MoonPhase()+10 );
// ReefAngel.PWM.SetDaylight(PWMParabola(20,0,23,0,0, MoonPhase(),0 ));
//ReefAngel.PWM.SetDaylight(PWMSlope(6,0,23,0,0,100,240,0));
//if (hour()>=5 && hour()<20) ReefAngel.PWM.SetDaylight(0);
//ReefAngel.PWM.SetDaylight( PWMParabola(20,0,23,0,100,0,100) );
//ReefAngel.PWM.SetDaylight( PWMParabola(6,0,10,0,9,100,9) );
////// Place your custom code below here
ReefAngel.RF.UseMemory = false;
if (hour()>=6 && hour()<11)
myRFSetMode(ReefCrest,85,10);
else if (hour()>=11 && hour()<13)
myRFSetMode(ReefCrest,85,10);
else if (hour()>=13 && hour()<16)
myRFSetMode(Smart_NTM,85,50);
else if (hour()>=16 && hour()<19)
myRFSetMode(ReefCrest,65,10);
else
myRFSetMode(Lagoon,40,10);
// Hardcode PH calibrations
//ReefAngel.PHMin=544; // PH7.0
//ReefAngel.PHMax=830; // PH10.0
RunDosingPumps();
LogDosingPumps();
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "ecam" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
pingSerial();
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 48, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 48, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
char text[10];
ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
strcat(text," ");
ReefAngel.LCD.DrawText(DefaultFGColor,DefaultBGColor,15,93,"Salinity:");
ReefAngel.LCD.DrawText(DefaultFGColor,DefaultBGColor,75,93,text);
pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 94, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
}
/////////////////////////////////////////
// Define Your dosing pumps
/////////////////////////////////////////
#define numDPumps 3
byte pumpRelays[numDPumps]={ Box1_Port7, Box1_Port8,Box1_Port2};
int DPVolume[numDPumps]={ 17, 17, 7} ; // 1ml for each alk and calcium - total volume for the day
int DPRepeat[numDPumps]={ 360, 360, 360 } ; // Repeat every 4 hrs 6x a day --- in mins
/////////////////////////////////////////
// Define Calibration here
/////////////////////////////////////////
int CalTime[numDPumps]={ 600, 600, 600 }; // 10 minutes / 10 minutes
int CalVol[numDPumps]={ 350, 300,384 }; // 350ml / 300ml... .58 / .5/.64
/////////////////////////////////////////
// Function: RunDosingPumps()
/////////////////////////////////////////
void RunDosingPumps() {
float rate;
int calcTime[numDPumps];
for (int i=0;i < numDPumps; i++) {
rate=(float)CalVol[i]/CalTime[i];
calcTime[i]=DPVolume[i]/rate/(1440/DPRepeat[i]);
// Run the pumps
ReefAngel.DosingPumpRepeat(pumpRelays[i], i*5, DPRepeat[i], calcTime[i]); // Offset between each pump is 5 minutes
}
// Display Time calculated in portal
ReefAngel.CustomVar[0]=calcTime[0];
ReefAngel.CustomVar[1]=calcTime[1];
ReefAngel.CustomVar[2]=calcTime[2];
}
/////////////////////////////////////////
// Function: LogDosingPumps()
/////////////////////////////////////////
void LogDosingPumps() {
static time_t pumpTimer[numDPumps];
static boolean pumpStatus[numDPumps];
float rate;
for (int i=0;i< numDPumps;i++) {
if (ReefAngel.Relay.Status(pumpRelays[i])) {
if (!pumpStatus[i]) {
pumpTimer[i]=now()-pumpTimer[i]; // Pump was off, timer is now a time
pumpStatus[i]=true;
}
} else {
if (pumpStatus[i]) {
pumpTimer[i]=now()-pumpTimer[i]; // Pump was on, timer is now a timer
pumpStatus[i]=false;
rate=(float)CalVol[i]/CalTime[i];
// Report How much volume has been dosed per day.
// Could make this in minutes... excercise for the reader..
ReefAngel.CustomVar[3]=pumpTimer[0]*rate;
ReefAngel.CustomVar[4]=pumpTimer[1]*rate;
ReefAngel.CustomVar[5]=pumpTimer[2]*rate;
}
}
// Clear timer at end of day
if (now()%SECS_PER_DAY==SECS_PER_DAY-1) pumpTimer[i]=0;
}
}
void DrawCustomGraph()
{
}
void myRFSetMode(byte m, byte s, byte d)
{
if (m!=myRFMode || s!=myRFSpeed || d!=myRFDuration || millis()<5000)
{
myRFMode=m;
myRFSpeed=s;
myRFDuration=d;
ReefAngel.RF.SetMode(m,s,d);
}
}