Code: Select all
if (ReefAngel.WaterLevel.GetLevel(1)>90)
ReefAngel.Relay.Off(Port5);
if (ReefAngel.WaterLevel.GetLevel(1)<1)
ReefAngel.Relay.On(Port5);
Code: Select all
if (ReefAngel.WaterLevel.GetLevel(1)>90)
ReefAngel.Relay.Off(Port5);
if (ReefAngel.WaterLevel.GetLevel(1)<1)
ReefAngel.Relay.On(Port5);
Code: Select all
// ATO Refill mode. Top off ATO reservoir until it's at 100%
void RefillATO() {
static boolean refillActive=false;
static WiFiAlert refillAlert;
byte level, prevRate;
if (ReefAngel.Relay.Status(VO_EnableATO) || ReefAngel.Relay.Status(VO_Vacation)) {
ReefAngel.Relay.Auto(VO_RefillATO);
}
level=ReefAngel.WaterLevel.GetLevel();
if (ReefAngel.Relay.Status(VO_RefillATO)) {
if (level<100) {
ReefAngel.Relay.On(Extension);
refillActive=true;
} else {
ReefAngel.Relay.Auto(VO_RefillATO);
refillAlert.Send("ATO+Reservoir+is+full.");
}
} else {
if (refillActive) {
prevRate=InternalMemory.read(Mem_B_LogPrevATO)-InternalMemory.read(Mem_B_LogATO);
InternalMemory.write(Mem_B_LogPrevATO, level+prevRate);
InternalMemory.write(Mem_B_LogATO, level+1);
if (InternalMemory.read(Mem_B_MaintATO) > 0) // Reset last ATO counter
InternalMemory.write(Mem_B_MaintATO,0);
ReefAngel.Relay.Off(Extension);
refillActive=false;
}
}
Code: Select all
/* Set this to whatever port you want to use to trigger your refill. It could be an
unused port or a port on a non-existant box. If you use a non-existant box
you will end up with an extra relay box. If you don't want that we could modify
to use the same port as your solenoid valve.
*/
#define VO_RefillATO Box2_Port1
// Set this to the port your solenoid is on.
#define ROSolenoid Port5
void RefillATO() {
static boolean refillActive=false; // Flag to determine if we've initiated the refill.
static WiFiAlert refillAlert; // Object to send status updates
byte level=ReefAngel.WaterLevel.GetLevel(); // Current level
byte lowLevel=InternalMemory.WaterLevelLow_read(); // Use InternalMemory locations - set this in the portal
byte highLevel=InternalMemory.WaterLevelHigh_read(); // Use InternalMemory locations - set this in the portal
// Every day at 8pm I'm going to check the water level. If it's lower than the low point, we'll trigger the refill.
// If not, we'll wait for the next day. If you want to change time, you can change 20 to whatever hour you want
if (now()%SECS_PER_DAY==20*SECS_PER_HOUR && level<lowLevel) {
ReefAngel.Relay.Override(VO_RefillATO,1); // We turn on the refill port.
}
if (ReefAngel.Relay.Status(VO_RefillATO)) { // If the refill port is On.
if (level<=highLevel) { // And the level is less than where we want to be...
// This is where we use the ATO function to refill the reservoir now.
ReefAngel.WaterLevelATO(ROSolenoid,InternalMemory.ATOExtendedTimeout_read(),highLevel-1,highLevel);
/* Since we've activated this mode once we've reached the lowLevel in memory,
we can essentially ignore the ATO Low Level moving forward or until it times out.
We only really care about the High Level at this point. It is as if we were using
a SingleATO function. This also allows us to override the lowlevel when we want
to manually top off the reservoir. It also prevents a mis-read on the sensor from
causing the ATO to StopTopping() and wait again till it hits the lowlevel to restart. */
if (!refillActive) // If this is our first time starting then send the message that we're starting.
refillAlert.Send("ATO+Refill+is+starting.",true);
refillActive=true; // We've started
} else {
ReefAngel.Relay.Auto(VO_RefillATO); // Disable the virtual port
ReefAngel.Relay.Off(ROSolenoid); // Make sure the solenoid is off
refillAlert.Send("ATO+Refill+is+complete.",true); // Refill is completed send a message.
}
} else {
if (refillActive) { // The refill has ended
ReefAngel.Relay.Off(ROSolenoid); // Ensure the solenoid is off
refillActive=false; // Reset the refilling flag.
}
}
}
Code: Select all
ReefAngel.WaterLevelATO(3, ROSolenoid,InternalMemory.ATOExtendedTimeout_read(),highLevel-1,highLevel);
Code: Select all
if (now()%SECS_PER_DAY==20*SECS_PER_HOUR && level<lowLevel) {
ReefAngel.Relay.Override(VO_RefillATO,1); // We turn on the refill port.
}
Code: Select all
if (level<lowLevel) {
ReefAngel.Relay.Override(VO_RefillATO,1); // We turn on the refill port.
}
Code: Select all
ReefAngel.WaterLevelATO(3, ROSolenoid,3600,1,90);
That code would work, just not sure how long it would take to refill my 10 gallon ATO container. I see what you are saying about having a grace period so I won't run out of water before it has a chance to refill. The pipe doesn't go all the way to the bottom of the container. So once it hit's 1%, I still have about 3 inches of water left, so hopefully that will give it enough time for the water to refill.lnevo wrote:Oh and you may want to consider starting at higher than 1. For one we look for things to happen when they are less than 1 which is 0 which you might also get if the sensor were to get disconnected. Also you may already take this into account, but if your level is that low when we kick in the ato, and let's say the RO was shutoff or something, you'd have less grace period to correct it.
At the end of the day, if you just wanted to be like the code you had above but give you the ATO timeout and work accordingly you could just use the WaterLevelATO function as we do within the code.
Sorry if I complicated the whole mess. I thought you would like having the additional functionality that I addedCode: Select all
ReefAngel.WaterLevelATO(3, ROSolenoid,3600,1,90);
Code: Select all
if (ReefAngel.WaterLevel.GetLevel(3)>87) //ATO Reservoir
ReefAngel.Relay.Off(Port5);
if (ReefAngel.WaterLevel.GetLevel(3)<1)
ReefAngel.Relay.On(Port5);
Code: Select all
if (level<lowLevel) {
ReefAngel.Relay.Override(VO_RefillATO,1); // We turn on the refill port.
}
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 <Tide.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 <PAR.h>
#include <ReefAngel.h>
////// Place global variable code below here
////// Place global variable code above here
Tide tide;
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
ReefAngel.DDNS("Damien");
ReefAngel.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expanion Module
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port6Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port6Bit | Port7Bit | Port8Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port5Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port3Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 800 );
InternalMemory.WaterLevelMax_write(1800);
// Feeeding and Water Change mode speed
// Ports that are always on
ReefAngel.Relay.On( Port1 );
ReefAngel.Relay.On( Port6 );
tide.Init(55,10,30);
tide.SetWaveLength(12+SECS_PER_HOUR);
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.StandardHeater( Port3,780,785 );
ReefAngel.WaterLevelATO(4,Port4,240,28,31);
ReefAngel.Relay.Set(Port8, (now()%(6*SECS_PER_HOUR))<(30*SECS_PER_MIN));
////// Place your custom code below here
if (ReefAngel.WaterLevel.GetLevel(1)<5) //Disable the port until overriden manually
ReefAngel.Relay.Override(Port8,0); //Saltwater Reservoir
if (ReefAngel.WaterLevel.GetLevel(1)>80) // Set port back to auto
ReefAngel.Relay.Override(Port8,2);
if (ReefAngel.WaterLevel.GetLevel(2)>80) //Overflow
ReefAngel.Relay.Off(Port1);
else
ReefAngel.Relay.On(Port1);
if (ReefAngel.WaterLevel.GetLevel(3)>87) //ATO Reservoir
ReefAngel.Relay.Off(Port5);
if (ReefAngel.WaterLevel.GetLevel(3)<1)
ReefAngel.Relay.On(Port5);
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "Ismaclst" );
ReefAngel.ShowInterface();
}
byte setMaxspect(byte minSpeed, byte maxSpeed, boolean PulseSync)
{
int reverse_speed=0;
int forward_speed=45;
// swap between forward and reverse every X seconds
reverse_speed = ShortPulseMode(0,100,ReefAngel.DCPump.Duration*2,true);
if (reverse_speed == 100) {
//
// while we are going in reverse increase the speed by 10
forward_speed = ShortPulseMode(35+10, 60+10,ReefAngel.DCPump.Duration,true);
} else {
//
// while we are going forward set speed to 25-40 to keep
// from blowing corals off the rocks
forward_speed = ShortPulseMode(35,70, ReefAngel.DCPump.Duration, true);
}
if (PulseSync) {
return forward_speed;
} else {
return reverse_speed;
}
}
Code: Select all
ReefAngel.Relay.Off(Port5); // Default to Off
if (ReefAngel.WaterLevel.GetLevel(3)>87) //ATO Reservoir
ReefAngel.Relay.Off(Port5);
if (ReefAngel.WaterLevel.GetLevel(3)<1)
ReefAngel.Relay.On(Port5);
When I added this part to my code I had a few errors. It said lowLevel, level and VO_RefillATO was not declared in the scope.lnevo wrote:I believe you have to turn this port back to auto otherwise you've triggered refill mode and it will stay on until the level is reached.Code: Select all
if (level<lowLevel) { ReefAngel.Relay.Override(VO_RefillATO,1); // We turn on the refill port. }
I think it might be worth a checkpoint to post your full code.