Customizing Delayed start
Re: Customizing Delayed start
What decides is how the function is written. DelayedOn uses minutes. So just use 30.
Aside from convenience and preference as Roberto pointed out, it is also determined by memory usage (byte vs int) and what makes sense. When writing functions now() returns seconds so thats why it's easy. But looking at delayed on it was determined that no one needed to delay in seconds only so minutes were used. This also makes it easy to store the DelayedOn default time in memory because a byte can be used instead of an int (100% savings!!)
To represent 15 minutes in seconds would be 900 and require an int for storage instead of a byte. It may not seem like much but they all add up.
Aside from convenience and preference as Roberto pointed out, it is also determined by memory usage (byte vs int) and what makes sense. When writing functions now() returns seconds so thats why it's easy. But looking at delayed on it was determined that no one needed to delay in seconds only so minutes were used. This also makes it easy to store the DelayedOn default time in memory because a byte can be used instead of an int (100% savings!!)
To represent 15 minutes in seconds would be 900 and require an int for storage instead of a byte. It may not seem like much but they all add up.
Re: Customizing Delayed start
Yep. When I wrote DelayedOn, the delay of seconds didn't seem appropriate because most people wanted a 1 or 2 minute (maybe even 5 minute) delay so their tanks would fill back up before the power heads started working (like in my case).
Plus, like Lee said, it's a storage issue as well as a convenience.
Now, if we were to look at the WavemakerRandom function, it makes more sense to use seconds because you may want it to run every 30 seconds before alternating or 90 seconds or something along those lines. You can't code in 1.5 for a a minute and a half, so you would be better suited for 90 seconds.
Plus, like Lee said, it's a storage issue as well as a convenience.
Now, if we were to look at the WavemakerRandom function, it makes more sense to use seconds because you may want it to run every 30 seconds before alternating or 90 seconds or something along those lines. You can't code in 1.5 for a a minute and a half, so you would be better suited for 90 seconds.
Re: Customizing Delayed start
Make sense, so the delayon function is in the libraries based in minutes. Thanks
Why is my skimmer coming back on after 15min instead of an hour in my code?
Why is my skimmer coming back on after 15min instead of an hour in my code?
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 <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <ReefAngel.h>
////// 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 = Port7Bit | Port8Bit;
ReefAngel.FeedingModePortsE[0] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port7Bit | Port8Bit;
ReefAngel.WaterChangePortsE[0] = Port3Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port1Bit | Port4Bit;
ReefAngel.LightsOnPortsE[0] = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit | Port3Bit | Port5Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T2 probe as temperature and overheat functions
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T2_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 851 );
//Feeedin mode length
ReefAngel.Timer[FEEDING_TIMER].SetInterval(300);
// Feeeding and Water Change mode speed
// Ports that are always on
ReefAngel.Relay.On( Port8 );
ReefAngel.Relay.On( Box1_Port1);
ReefAngel.Relay.On( Box1_Port2 );
ReefAngel.Relay.On( Box1_Port3 );
ReefAngel.Relay.On( Box1_Port4 );
ReefAngel.Relay.On( Box1_Port7 );
ReefAngel.Relay.On( Box1_Port8 );
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.StandardLights( Port1,14,0,19,0 );
ReefAngel.StandardLights( Port2,15,0,20,0 );
ReefAngel.StandardLights( Port3,19,55,22,0 );
ReefAngel.StandardLights( Port4,14,0,20,15 );
ReefAngel.StandardHeater( Port5,780,785 );
ReefAngel.StandardFan( Port6,780,800 );
ReefAngel.Relay.DelayedOn( Port7,60 );
ReefAngel.StandardLights( Box1_Port5,22,0,16,0 );
ReefAngel.DCPump.UseMemory = true;
////// Place your custom code below here
////disable ReefAngel.PWM.SetDaylight( ElseMode(70,30,true )); // ElseMode on sync mode, 70 +/- 30%
ReefAngel.PWM.SetDaylight( ReefCrestMode(70,30,true) ); // ReefCrest at 70% +/- 30% on sync mode
//// Jebao sump pump runs at 45% unless feeding, then a 30min runs at 100% 1hr.
static time_t StartFeeding=0;
if (ReefAngel.DisplayedMenu==FEEDING_MODE)
StartFeeding=now(); // if we entered feeding mode, register what time it was.
if (now()-StartFeeding > 1800 && now()-StartFeeding < 5400) // if feeding started between 1800 and 5400 seconds
ReefAngel.PWM.SetActinic(100);
else
ReefAngel.PWM.SetActinic(45);
///// Delay Start Turn off on Booting - Start
static unsigned long startTime=now();
if (startTime==LastStart) {
ReefAngel.Relay.On(Port7);
} else {
ReefAngel.Relay.DelayedOn(Port7);
}
///// Delay Start Turn off on Booting - End
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "ganjero" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
int x,y;
char text[10];
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 93, TempRelay );
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 107, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
}
void DrawCustomGraph()
{
ReefAngel.LCD.DrawGraph( 5, 5 );
}
//// Jebao Else Mode - Start
byte ElseMode( byte MidPoint, byte Offset, boolean WaveSync )
{
// Static's only initialize the first time they are called
static unsigned long LastChange=millis(); // Set the inital time that the last change occurred
static int Delay = random( 500, 3000); // Set the initial delay
static int NewSpeed = MidPoint; // Set the initial speed
static int AntiSpeed = MidPoint; // Set the initial anti sync speed
if ((millis()-LastChange) > Delay) // Check if the delay has elapsed
{
Delay=random(500,5000); // If so, come up with a new delay
int ChangeUp = random(Offset); // Amount to go up or down
if (random(100)<50) // 50/50 chance of speed going up or going down
{
NewSpeed = MidPoint - ChangeUp;
AntiSpeed = MidPoint + ChangeUp;
}
else
{
NewSpeed = MidPoint + ChangeUp;
AntiSpeed = MidPoint - ChangeUp;
}
LastChange=millis(); // Reset the time of the last change
}
if (WaveSync)
{
return NewSpeed;
}
else
{
return AntiSpeed;
}
}
//// Jebao Else Mode - End
Re: Customizing Delayed start
Looks good. As I said RAStart didn't work for me for some reason... may revisit it later...
Re: Customizing Delayed start
You have 2 Port7 referenced in two places.
And
The second one will always override the 1st one.
Code: Select all
ReefAngel.Relay.DelayedOn( Port7,60 );
Code: Select all
if (startTime==LastStart) {
ReefAngel.Relay.On(Port7);
} else {
ReefAngel.Relay.DelayedOn(Port7);
}
Roberto.
Re: Customizing Delayed start
The last one is using InternalMemory to set the delay. Check on the portal your default delay may be 15 minutes...
Re: Customizing Delayed start
That's it! learning more everyday so should I delete the first reference and just adjust the delay in portal so I can keep the code that prevents triggering the delay on reboots?
Can I also fix this by deleting the first reference and just adding the time on the second reference? like this:
Thank you
Can I also fix this by deleting the first reference and just adding the time on the second reference? like this:
Code: Select all
if (startTime==LastStart) {
ReefAngel.Relay.On(Port7);
} else {
ReefAngel.Relay.DelayedOn(Port7,60);
}
Thank you
Re: Customizing Delayed start
If you just take out the ,60 you will have best of both worlds. Set the delay time in the portal and have it not delay on reboots.
Re: Customizing Delayed start
You mean delete
and leave this one like this:
Thanks
Code: Select all
ReefAngel.Relay.DelayedOn( Port7,60);
Code: Select all
if (startTime==LastStart) {
ReefAngel.Relay.On(Port7);
} else {
ReefAngel.Relay.DelayedOn(Port7);
}
Re: Customizing Delayed start
Great, Thanks again