question on dual ATO topoff switch positioning.
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
question on dual ATO topoff switch positioning.
I installed my dual ATO topoff floats tonight and I think I correctly calibrated my switches to me desired water level. I used two DVM's and hooked one DVM to each switch. Does it matter that there is about a 3mm span that neither switch is activated? If I understand correctly when my "wires out the top" or low level switch closes (low water condition) the pump outlet turns on. It continues to pump even if that switch opens until either the "wires out the bottom" or High level switch closes (Hi water condition) or the timeout occurs (whichever happens first). If I am understanding correctly this means the water level that changes between these two switches toggling will just change how much and how often my topoff pump runs. Is this correct? Any suggestions on the best way to set this up. Currently my water level only changes by about 3mm before one of the two switches closes. Should this "window" be larger or smaller?
Nick
Nick
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
does the ATO timeout expire? or does it require a manual clearing from the joystick on the controller? If it does not time out say after 24 a hour period and MUST be reset from the controller joystick what do I do when It times out while I am away for 4 days to prevent my sump from running dry?
I have my timeout set rather aggressively at 30 seconds. It does not take long for my maxijet 600 to fill my topoff. My atoLow and atoHigh switches have a very small window where neither switch is active. For the first time in a several days it appears to have timed out and set the atoflag. My sump was only 1/2 inch above my optimum fill line which can be enough to overflow my skimmer. Not a big deal but I am supposed to leave town for four days and now I'm scared to death to leave because if it malfunctions and doesn't stop pumping there will be a flood (I doubt this will happen as proven by the timeout flag) however what does seem WILL happen if it times out while I am out of town is that my return pump will start to pump dry while I am gone.
What to do?
I have my timeout set rather aggressively at 30 seconds. It does not take long for my maxijet 600 to fill my topoff. My atoLow and atoHigh switches have a very small window where neither switch is active. For the first time in a several days it appears to have timed out and set the atoflag. My sump was only 1/2 inch above my optimum fill line which can be enough to overflow my skimmer. Not a big deal but I am supposed to leave town for four days and now I'm scared to death to leave because if it malfunctions and doesn't stop pumping there will be a flood (I doubt this will happen as proven by the timeout flag) however what does seem WILL happen if it times out while I am out of town is that my return pump will start to pump dry while I am gone.
What to do?
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
Re: question on dual ATO topoff switch positioning.
if you use the android app, you can clear the ato timeout from it. i don't know of a way to tell if the timeout has been set though other than the led light.
just my input.
just my input.
Re: question on dual ATO topoff switch positioning.
This is what I use:
Then on the Portal, I set a trigger to send me email alert for when C1=1
To clear, you can use browser or Android app.
Code: Select all
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag);
ReefAngel.CustomVar[7]=255;
To clear, you can use browser or Android app.
Roberto.
question on dual ATO topoff switch positioning.
Question... Why the need for C[7]? I noticed this in the other example for sending alerts...
Re: question on dual ATO topoff switch positioning.
Hehehe 
Trick to keep the custom variables in the portal alive.
The thing is that the Portal doesn't store 0s to save in database space.
It also doesn't show anything that has 0 assuming the feature is not being used.
So, if you have all custom variables being zero, it won't show in the portal. By using c[7] with any value other than 0, will force the Portal to show up the custom variables
It is not needed if you have other variables being used that are non-zero.

Trick to keep the custom variables in the portal alive.
The thing is that the Portal doesn't store 0s to save in database space.
It also doesn't show anything that has 0 assuming the feature is not being used.
So, if you have all custom variables being zero, it won't show in the portal. By using c[7] with any value other than 0, will force the Portal to show up the custom variables

It is not needed if you have other variables being used that are non-zero.
Roberto.
Re: question on dual ATO topoff switch positioning.
Ugly hackrimai wrote:Hehehe
Trick to keep the custom variables in the portal alive.
The thing is that the Portal doesn't store 0s to save in database space.
It also doesn't show anything that has 0 assuming the feature is not being used.
So, if you have all custom variables being zero, it won't show in the portal. By using c[7] with any value other than 0, will force the Portal to show up the custom variables
It is not needed if you have other variables being used that are non-zero.

How about this...instead of storing an extra variable... doing something like this:
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag)+1;
and then setting the email trigger to send at 2 instead of 1

Re: question on dual ATO topoff switch positioning.
That works too 
Yeah, I keep history of everything that is sent and non-zero, which means for every single controller, I store data every 5 minutes. For my controller for example, it sends about 70 parameters every 5 minutes, but I only need to store about 30 at night and about 50 during the day.
So, it can get pretty large if I start including 0s too.

Yeah, I keep history of everything that is sent and non-zero, which means for every single controller, I store data every 5 minutes. For my controller for example, it sends about 70 parameters every 5 minutes, but I only need to store about 30 at night and about 50 during the day.
So, it can get pretty large if I start including 0s too.
Roberto.
Re: question on dual ATO topoff switch positioning.
Sorry to the OPs for hijacking the thread.. but since it's all related...
I only need to use the CustomVar if I want the float switch status to be remembered if triggered...
i.e. float switch triggers, kills return pump, causing the float to unactivate return pump back on.... loop...
If I just want to monitor ATO reservoir and not turn anything on/off can I just have the trigger for ATOLOW?
If I want to monitor the sump and if the level drops below the minimum and I want to turn off the return pump and skimmer, then I need to use the customvar? and trigger the alert on the customvar?
I think I've got it, but I've been very confused on this topic, you should add some code examples to the ATO tutorial
I only need to use the CustomVar if I want the float switch status to be remembered if triggered...
i.e. float switch triggers, kills return pump, causing the float to unactivate return pump back on.... loop...
If I just want to monitor ATO reservoir and not turn anything on/off can I just have the trigger for ATOLOW?
If I want to monitor the sump and if the level drops below the minimum and I want to turn off the return pump and skimmer, then I need to use the customvar? and trigger the alert on the customvar?
I think I've got it, but I've been very confused on this topic, you should add some code examples to the ATO tutorial

Re: question on dual ATO topoff switch positioning.
no, you don't need customvar at all.
ATOLOW is already part of the data that is sent to the server.
You would use customvar only for stuff that is not sent to the portal.
For example, flow meter values, light intensity values, ATO timeout flags, moonlight % or anything that you may want to see in the portal and have alert triggers for it.
Look at my portal custom var section: I have the ATO timeout and moon cycle %.
ATOLOW is already part of the data that is sent to the server.
You would use customvar only for stuff that is not sent to the portal.
For example, flow meter values, light intensity values, ATO timeout flags, moonlight % or anything that you may want to see in the portal and have alert triggers for it.
Look at my portal custom var section: I have the ATO timeout and moon cycle %.
Roberto.
Re: question on dual ATO topoff switch positioning.
Sorry, I'm struggling here...
So for ATO reservoir monitoring using LowATO, I don't need any code... (since no actions taken..only portal trigger)... ATOLOW=1 send mail...
For monitoring level in sump (if ATO fails and/or drain problem)...
Then alert would be triggered and monitored if C0=2.
Btw, that Water level module output looks sweet...
So for ATO reservoir monitoring using LowATO, I don't need any code... (since no actions taken..only portal trigger)... ATOLOW=1 send mail...
For monitoring level in sump (if ATO fails and/or drain problem)...
Code: Select all
// in setup
ReefAngel.CustomVar[0]=1;
// in loop
if ReefAngel.HighATO.IsActive() ReefAngel.CustomVar[0]=2; // Enable variable for trigger
ReefAngel.Relay.Set(Port1, ReefAngel.CusotmVar[0]-1); // Shutdown return pump if variable gets bumped up.
Btw, that Water level module output looks sweet...

Re: question on dual ATO topoff switch positioning.
And also, my point in the last post was that if ReefAngel.HighATO.IsActive becomes false, there's no code to reset it... would need to be manually unset in the portal so that when return pump shuts down, it doesn't get to go back on when the water fills the sump back up...just making sure i have the process right 

Re: question on dual ATO topoff switch positioning.
No, you can just set the portal to send alerts on ATOLOW and ATOHIGH
Roberto.
question on dual ATO topoff switch positioning.
What about keeping the pump off part?
Re: question on dual ATO topoff switch positioning.
That has nothing to do with what email alerts you want to get.
You can code it with Set() like you did, but use the ato high as boolean variable.
You can code it with Set() like you did, but use the ato high as boolean variable.
Roberto.
question on dual ATO topoff switch positioning.
Fine, but the problem with the boolean is that once the return pump shuts off the water level will rise back up...and then the boolean flips back...i guess this is the confusing part...or can i use the exceed flags?
Re: question on dual ATO topoff switch positioning.
Ahh... now I got it...
Yes, your original code would work for turning off and sending email, but not to turn back on.
You need to use mask off, so you can easily remove the mask remotely.
Yes, your original code would work for turning off and sending email, but not to turn back on.
You need to use mask off, so you can easily remove the mask remotely.
Code: Select all
// in setup
ReefAngel.CustomVar[0]=1;
// in loop
if ReefAngel.HighATO.IsActive()
{
ReefAngel.CustomVar[0]=2; // Enable variable for trigger
ReefAngel.Relay.RelayMaskOff=~Port1Bit;
}
Roberto.
question on dual ATO topoff switch positioning.
Ok, I think I'm getting it too... I guess I don't really understand the masks...is that what gets used when you override the auto from your phone and stuff!rimai wrote:Ahh... now I got it...
Yes, your original code would work for turning off and sending email, but not to turn back on.
You need to use mask off, so you can easily remove the mask remotely.Code: Select all
// in setup ReefAngel.CustomVar[0]=1; // in loop if ReefAngel.HighATO.IsActive() { ReefAngel.CustomVar[0]=2; // Enable variable for trigger ReefAngel.Relay.RelayMaskOff=~Port1Bit; }
And I still need the customvar because ATOHIGH may revert before the info is sent to the portal...right?
question on dual ATO topoff switch positioning.
Awesome...so what's the story on that water level sensor?
any timeframe?

Re: question on dual ATO topoff switch positioning.
Yes 
In about 2 weeks they should be popping up

In about 2 weeks they should be popping up

Roberto.
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
no problem on hijacking the thread. It is all related and quite an education for me to boot.
So let me see if I am following the concepts here...
If I add to my setup code...
This will force the "Custom Fields" section to appear and remain in my portal which will normally read
with Values C1=0 C2=0 C3=0 C4=0 C5=0 C6=0 C7=255.
If I add the following code to my loop...
during each loop this will make the c1 field read 1 if the ATO timeout has triggered.
shouldnt this be "ReefAngel.CustomVar[1]" to change the C1 value from 0 to 1? or am I missing something.
Just seems if "ReefAngel.CustomVar[7]" correlates to C7 that "ReefAngel.CustomVar[1]" would correlate to C1... no?
If during a loop the C1 does = 1 I can set the portal to e-mail me to tell me this. I can also just log into the portal
to check this myself. I like the e-mail idea.
so as I mentioned if the ATO timeout occurs my sump will be overfilled to some extent, minimally due
to my aggressive timeout setting that I am considdering adding an additional 10 seconds to, however I'm hesitant because I think this will just overfill my sump past my "normal max" line for an additional 10 seconds. It is my belief that my float switch is the cause of the timeout and NOT just that not enough water has pumped in. I believe this because (1) my sump was overfilled on the last/only trigger I have seen so far (2) I already have one float switch that is very flaky, why not two? 10 more seconds of water to the sump is no big deal except that it is probably enough to cause my skimmer to overflow. If I wanted to turn off my skimmer in the case of an ATO Timeout would I add this code to my loop? (assuming my skimmer is plugged into port4)
then if i receive an e-mail or look at the portal and see that C1=1 and not 0 I will know I have had an ATO timeout and I should see that my skimmer relay port on my primary relay box has been masked off on the portal. I can then use the android app to reset the flag changing c1 from 1 back to 0 and then can use the android app or the portal to turn my skimmer back on and put it back into auto mode and wait for the next ATO timeout.
Nick
So let me see if I am following the concepts here...
If I add to my setup code...
Code: Select all
ReefAngel.CustomVar[7]=255
with Values C1=0 C2=0 C3=0 C4=0 C5=0 C6=0 C7=255.
If I add the following code to my loop...
Code: Select all
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag);
shouldnt this be "ReefAngel.CustomVar[1]" to change the C1 value from 0 to 1? or am I missing something.
Just seems if "ReefAngel.CustomVar[7]" correlates to C7 that "ReefAngel.CustomVar[1]" would correlate to C1... no?
If during a loop the C1 does = 1 I can set the portal to e-mail me to tell me this. I can also just log into the portal
to check this myself. I like the e-mail idea.
so as I mentioned if the ATO timeout occurs my sump will be overfilled to some extent, minimally due
to my aggressive timeout setting that I am considdering adding an additional 10 seconds to, however I'm hesitant because I think this will just overfill my sump past my "normal max" line for an additional 10 seconds. It is my belief that my float switch is the cause of the timeout and NOT just that not enough water has pumped in. I believe this because (1) my sump was overfilled on the last/only trigger I have seen so far (2) I already have one float switch that is very flaky, why not two? 10 more seconds of water to the sump is no big deal except that it is probably enough to cause my skimmer to overflow. If I wanted to turn off my skimmer in the case of an ATO Timeout would I add this code to my loop? (assuming my skimmer is plugged into port4)
Code: Select all
if ReefAngel.CustomVar[0]=1
{
ReefAngel.Relay.RelayMaskOff= Port4Bit;
}
Nick
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
Re: question on dual ATO topoff switch positioning.
Yeah, computers start count at 0 and we humans start counting at 1 
So the array is from CustomVar[0] to CustomVar[7].
In the Portal, you will have C0 to C7.
Sorry if I made a mistake previously, but if you use CustomVar[0], use C0 to trigger the email.
But your logic of thinking is good
Apologies for the confusion.

So the array is from CustomVar[0] to CustomVar[7].
In the Portal, you will have C0 to C7.
Sorry if I made a mistake previously, but if you use CustomVar[0], use C0 to trigger the email.
But your logic of thinking is good

Apologies for the confusion.
Roberto.
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
Just wanted to be sure I was getting it. when I looked at your custom variables section snapshot on the previous page you have the ATO box labeled so I wasn't sure. I just need to be sure what I am going to code in is going to work.
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
So below is what I propose my new code to be. I have made the additions to the "insert your additional code here" sections. If it would be better to insert it in other places or rearrange slightly please advise. Then Off to the Portal to set up C0 variable and e-mail

Nick
except my Syntax is wrong on the
ReefAngel.CustomVar[7]=255
so I made it
ReefAngel.CustomVar[7]=255;
now I'm past that but I have a syntax problem here too
if ReefAngel.CustomVar[0]=1
compiler says "expected `(' before 'ReefAngel'
think I got it.
I changed that line to
if ( ReefAngel.CustomVar[0]= 1 )
based on the buzzer IF/THEN code a few lines above. compiled ok

Nick
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 <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 <ReefAngel.h>
// Initialize Buzzer variables
byte buzzer=0;
byte overheatflag=0;
byte atoflag=0;
byte iochannel0flag=0;
byte iochannel1flag=0;
byte iochannel2flag=0;
byte iochannel3flag=0;
byte iochannel4flag=0;
byte iochannel5flag=0;
////// Place global variable code below here
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = 0;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port3Bit | Port4Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port4Bit | Port5Bit | Port6Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 850 );
// Ports that are always on
ReefAngel.Relay.On( Port3 );
ReefAngel.Relay.On( Box1_Port5 );
ReefAngel.Relay.On( Box1_Port6 );
ReefAngel.Relay.On( Box1_Port7 );
////// Place additional initialization code below here
ReefAngel.CustomVar[7]=255;
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.StandardFan( Port1,790,820 );
ReefAngel.StandardATO( Port2,30 );
ReefAngel.Relay.DelayedOn( Port4,5 );
ReefAngel.WavemakerRandom( Port5,30,100 );
ReefAngel.StandardHeater( Port6,750,760 );
ReefAngel.StandardLights( Box1_Port1,13,0,23,0 );
ReefAngel.StandardLights( Box1_Port2,13,0,23,0 );
ReefAngel.StandardHeater( Box1_Port3,750,760 );
ReefAngel.StandardHeater( Box1_Port4,750,760 );
ReefAngel.PWM.SetChannel( 0, PWMParabola(14,0,23,59,1,100,1) );
ReefAngel.PWM.SetChannel( 1, PWMParabola(14,0,23,59,1,100,1) );
ReefAngel.PWM.SetChannel( 3, PWMSlope(2,0,7,30,0,50,0,0) );
ReefAngel.PWM.SetChannel( 4, PWMSlope(0,0,14,0,0,50,0,0) );
overheatflag = InternalMemory.read( Overheat_Exceed_Flag );
atoflag = InternalMemory.read( ATO_Exceed_Flag );
iochannel0flag = ReefAngel.IO.GetChannel( 0 );
iochannel1flag = ReefAngel.IO.GetChannel( 1 );
iochannel2flag = ReefAngel.IO.GetChannel( 2 );
iochannel3flag = ReefAngel.IO.GetChannel( 3 );
iochannel4flag = ReefAngel.IO.GetChannel( 4 );
iochannel5flag = ReefAngel.IO.GetChannel( 5 );
buzzer = overheatflag + atoflag + iochannel0flag + iochannel1flag + iochannel2flag + iochannel3flag + iochannel4flag + iochannel5flag;
if ( buzzer >= 1 ) buzzer = 100;
ReefAngel.PWM.SetDaylight( buzzer );
ReefAngel.PWM.SetActinic( buzzer );
////// Place your custom code below here
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag);
if ( ReefAngel.CustomVar[0]= 1 )
{
ReefAngel.Relay.RelayMaskOff= Port4Bit;
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "00Warpig00" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
int x,y;
char text[10];
// Dimming Expansion
x = 15;
y = 2;
for ( int a=0;a<6;a++ )
{
if ( a>2 ) x = 75;
if ( a==3 ) y = 2;
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :" );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,ReefAngel.PWM.GetChannelValue(a) );
y += 10;
}
pingSerial();
// I/O Expansion
byte bkcolor;
x = 14;
y = 34;
for ( int a=0;a<6;a++ )
{
ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE; else bkcolor=COLOR_GRAY;
ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
}
pingSerial();
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 44, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 44, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
// Salinity
ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,15,76, "SAL:" );
ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,39,76, ReefAngel.Params.Salinity );
pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 90, TempRelay );
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 104, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
}
void DrawCustomGraph()
{
}
ReefAngel.CustomVar[7]=255
so I made it
ReefAngel.CustomVar[7]=255;
now I'm past that but I have a syntax problem here too
if ReefAngel.CustomVar[0]=1
compiler says "expected `(' before 'ReefAngel'
think I got it.
I changed that line to
if ( ReefAngel.CustomVar[0]= 1 )
based on the buzzer IF/THEN code a few lines above. compiled ok
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
Uploaded my code. made sure skimmer was plugged into my port4. booted up controller and waited 5 minutes for my skimmer's delayed start. After skimmer turned on I took a bout a gallon of water out of my return section to force an ATO cycle and a timeout. C0 is reading 1 on portal, red light is on on controller but skimmer is still on. I have something not quite right yet. In fact it appears as if this code has masked all of my relay ports off except port 4 (my skimmer) which is the only one left on. Now I am really Confused... I rebooted the controller the red LED is off but the C0 is still flagged at 1. I am missing something... are these CustomVar non volatile? It's all I can think of that would cause c0 to = 1 straight away after a reboot without the red LED being on.
Nick
Nick
Last edited by 00Warpig00 on Sat Sep 01, 2012 12:46 pm, edited 1 time in total.
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
Re: question on dual ATO topoff switch positioning.
This needs
Needs to be changed to this:
The first one you are assigning it instead of comparing it.
Code: Select all
if ( ReefAngel.CustomVar[0]= 1 )
Code: Select all
if ( ReefAngel.CustomVar[0]== 1 )
Roberto.
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
ahh so in that if statement I am assigning it to 1 no matter what it is. Kinda makes sense that it would always be 1 at that point. Trying the == now
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2
-
- Posts: 289
- Joined: Wed May 16, 2012 9:52 pm
Re: question on dual ATO topoff switch positioning.
something is still not quite right...
forced another ato timeout. Red LED on controller is on. Portal says C0=0 and skimmer is still on. Portal still shows relay port 4 for my skimmer to be "auto" android app says on but not masked (no green dot).
here is my code. I have to be missing something... wait it might be my bogus sump empty float switch
iochannel0flag = ReefAngel.IO.GetChannel( 0 );
is probably setting the LED the switch has been stuck in the active position for weeks even though the switch is fully submerged with the wires out the top (IE it should NOT be active) Gonna rem it out and try again. I had it rem'd out in my previous running config before today's experiments.
Not thinking the IO channel was the culprit. I used the clear ato command from the android app and the LED turned off. why is my c0 variable not updating?
I may be on to it... I found this line where the RA+ manipulates the buzzer etc.
atoflag = InternalMemory.read( ATO_Exceed_Flag );
and the code I was running was
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag);
since I am using dual ATO not single maybe I am looking at the wrong flag
it should probably be...
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Exceed_Flag);
Also this line of code in my if statement
ReefAngel.Relay.RelayMaskOff=Port4Bit;
is still masking Off all my relays EXCEPT 4 which is staying on auto. I guess I need to try to figure out how these functions work. Obviously not how I think they work. lol
Nick
forced another ato timeout. Red LED on controller is on. Portal says C0=0 and skimmer is still on. Portal still shows relay port 4 for my skimmer to be "auto" android app says on but not masked (no green dot).
here is my code. I have to be missing something... wait it might be my bogus sump empty float switch
iochannel0flag = ReefAngel.IO.GetChannel( 0 );
is probably setting the LED the switch has been stuck in the active position for weeks even though the switch is fully submerged with the wires out the top (IE it should NOT be active) Gonna rem it out and try again. I had it rem'd out in my previous running config before today's experiments.
Not thinking the IO channel was the culprit. I used the clear ato command from the android app and the LED turned off. why is my c0 variable not updating?
I may be on to it... I found this line where the RA+ manipulates the buzzer etc.
atoflag = InternalMemory.read( ATO_Exceed_Flag );
and the code I was running was
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Single_Exceed_Flag);
since I am using dual ATO not single maybe I am looking at the wrong flag
it should probably be...
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Exceed_Flag);
Also this line of code in my if statement
ReefAngel.Relay.RelayMaskOff=Port4Bit;
is still masking Off all my relays EXCEPT 4 which is staying on auto. I guess I need to try to figure out how these functions work. Obviously not how I think they work. lol

Nick
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 <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 <ReefAngel.h>
// Initialize Buzzer variables
byte buzzer=0;
byte overheatflag=0;
byte atoflag=0;
byte iochannel0flag=0;
byte iochannel1flag=0;
byte iochannel2flag=0;
byte iochannel3flag=0;
byte iochannel4flag=0;
byte iochannel5flag=0;
////// Place global variable code below here
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = 0;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port3Bit | Port4Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port4Bit | Port5Bit | Port6Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 850 );
// Ports that are always on
ReefAngel.Relay.On( Port3 );
ReefAngel.Relay.On( Box1_Port5 );
ReefAngel.Relay.On( Box1_Port6 );
ReefAngel.Relay.On( Box1_Port7 );
////// Place additional initialization code below here
ReefAngel.CustomVar[0]=0;
ReefAngel.CustomVar[7]=255;
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.StandardFan( Port1,790,820 );
ReefAngel.StandardATO( Port2,30 );
ReefAngel.Relay.DelayedOn( Port4,5 );
ReefAngel.WavemakerRandom( Port5,30,100 );
ReefAngel.StandardHeater( Port6,750,760 );
ReefAngel.StandardLights( Box1_Port1,13,0,23,0 );
ReefAngel.StandardLights( Box1_Port2,13,0,23,0 );
ReefAngel.StandardHeater( Box1_Port3,750,760 );
ReefAngel.StandardHeater( Box1_Port4,750,760 );
ReefAngel.PWM.SetChannel( 0, PWMParabola(14,0,23,59,1,100,1) );
ReefAngel.PWM.SetChannel( 1, PWMParabola(14,0,23,59,1,100,1) );
ReefAngel.PWM.SetChannel( 3, PWMSlope(2,0,7,30,0,50,0,0) );
ReefAngel.PWM.SetChannel( 4, PWMSlope(0,0,14,0,0,50,0,0) );
overheatflag = InternalMemory.read( Overheat_Exceed_Flag );
atoflag = InternalMemory.read( ATO_Exceed_Flag );
// iochannel0flag = ReefAngel.IO.GetChannel( 0 );
iochannel1flag = ReefAngel.IO.GetChannel( 1 );
iochannel2flag = ReefAngel.IO.GetChannel( 2 );
iochannel3flag = ReefAngel.IO.GetChannel( 3 );
iochannel4flag = ReefAngel.IO.GetChannel( 4 );
iochannel5flag = ReefAngel.IO.GetChannel( 5 );
buzzer = overheatflag + atoflag + iochannel0flag + iochannel1flag + iochannel2flag + iochannel3flag + iochannel4flag + iochannel5flag;
if ( buzzer >= 1 ) buzzer = 100;
ReefAngel.PWM.SetDaylight( buzzer );
ReefAngel.PWM.SetActinic( buzzer );
////// Place your custom code below here
ReefAngel.CustomVar[0]=InternalMemory.read(ATO_Exceed_Flag);
if ( ReefAngel.CustomVar[0]== 1 )
{
ReefAngel.Relay.RelayMaskOff=Port4Bit;
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "00Warpig00" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
int x,y;
char text[10];
// Dimming Expansion
x = 15;
y = 2;
for ( int a=0;a<6;a++ )
{
if ( a>2 ) x = 75;
if ( a==3 ) y = 2;
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :" );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,ReefAngel.PWM.GetChannelValue(a) );
y += 10;
}
pingSerial();
// I/O Expansion
byte bkcolor;
x = 14;
y = 34;
for ( int a=0;a<6;a++ )
{
ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE; else bkcolor=COLOR_GRAY;
ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
}
pingSerial();
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 44, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 44, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
// Salinity
ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,15,76, "SAL:" );
ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,39,76, ReefAngel.Params.Salinity );
pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 90, TempRelay );
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 104, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
}
void DrawCustomGraph()
{
}
180G FOWLR
20GH QT#1
29G QT#2

20GH QT#1
29G QT#2