Thanks to Curt, I've been using seasonal temps flawlessly for a while now, and love it!
https://forum.reefangel.com/viewtopic.php?f=12&t=6622
However, I'd now like to ramp my lights several times a day so my corals don't get blasted with max light intensity all day long. can either be randomly (like cloudy periods) or one hour up...one down...one up...
any idea how I might code that?
Thanks
Ramping leds up multiple times a day
Re: Ramping leds up multiple times a day
I have an idea or 2 but need some time to write it down.
You are just wanting to ramp up to 100% and back down multiple times and not be related to the seasonal temperatures, correct?
Sent from my XT1585 using Tapatalk
You are just wanting to ramp up to 100% and back down multiple times and not be related to the seasonal temperatures, correct?
Sent from my XT1585 using Tapatalk
Re: Ramping leds up multiple times a day
Hey Curt, no rush at all and thanks a bunch.
correct not related to seasonal temps but would still like to control max intensity via the portal as I'm doing now.
Thanks
correct not related to seasonal temps but would still like to control max intensity via the portal as I'm doing now.
Thanks
Re: Ramping leds up multiple times a day
fyi, heres my latest 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 <PAR.h>
#include <ReefAngel.h>
////// Place global variable code below here
void SeasonalDaylight ()
{
static int daylightArray[][4] = {
{13,0,22,0}, // default in case of error in month=0 (May)
{15,0,22,0}, //January (winter)
{14,30,22,0}, //February (winter)
{14,0,22,0}, //March (early spring)
{13,30,22,0}, //April (spring)
{13,0,22,0}, //May (spring)
{12,30,22,0}, //June (early summer)
{12,0,22,0}, //July (summer)
{12,30,22,0}, //August (summer)
{13,0,22,0}, //September (early fall)
{13,30,22,0}, //October (fall)
{14,0,22,0}, //November (fall)
{14,30,22,0} //December (early winter)
};
// Port 2 is power supply for Day lights
ReefAngel.PWM.SetDaylightRaw(PWMSlopeHighRes(
daylightArray[month()][0],
daylightArray[month()][1],
daylightArray[month()][2],
daylightArray[month()][3],
InternalMemory.PWMSlopeStartD_read(),
InternalMemory.PWMSlopeEndD_read(),
InternalMemory.PWMSlopeDurationD_read(),
ReefAngel.PWM.GetDaylightValueRaw()
));
/*
TODO comment out the next line if the power supply for the lights is not needed
and the lights are plugged into a power strip. Otherwise, if the lights
are plugged into the relay, you will need to toggle the port to turn
the lights off
*/
ReefAngel.StandardLights(Port2, daylightArray[month()][0], daylightArray[month()][1],
daylightArray[month()][2], daylightArray[month()][3]);
}//end SeasonalDaylight
void SeasonalActiniclight ()
{
static int actinicArray[][4] = {
{12,30,22,30}, // default in case of error in month=0 (May)
{14,30,22,30}, //January (winter)
{14,0,22,30}, //February (winter)
{13,30,22,30}, //March (early spring)
{13,0,22,30}, //April (spring)
{12,30,22,30}, //May (spring)
{12,0,22,30}, //June (early summer)
{11,30,22,30}, //July (summer)
{12,0,22,30}, //August (summer)
{12,30,22,30}, //September (early fall)
{13,0,22,30}, //October (fall)
{13,30,22,30}, //November (fall)
{14,0,22,30} //December (early winter)
};
// Port 1 is power supply for Actinic Lights
ReefAngel.PWM.SetActinicRaw(PWMSlopeHighRes(
actinicArray[month()][0],
actinicArray[month()][1],
actinicArray[month()][2],
actinicArray[month()][3],
InternalMemory.PWMSlopeStartA_read(),
InternalMemory.PWMSlopeEndA_read(),
InternalMemory.PWMSlopeDurationA_read(),
ReefAngel.PWM.GetActinicValueRaw()
));
/*
TODO comment out the next line if the power supply for the lights is not needed
and the lights are plugged into a power strip. Otherwise, if the lights
are plugged into the relay, you will need to toggle the port to turn
the lights off
*/
ReefAngel.StandardLights(Port1, actinicArray[month()][0], actinicArray[month()][1],
actinicArray[month()][2], actinicArray[month()][3]);
}//end SeasonalActinics
////// Place global variable code above here
void setup()
{
// This must be the first line
InternalMemory.LCDID_write(0); //this line was added when i got a replacement RA+ board
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port5Bit | Port6Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port3Bit | Port4Bit | Port5Bit | Port6Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port1Bit | Port2Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit | Port3Bit | Port5Bit | Port6Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Feeeding and Water Change mode speed
ReefAngel.DCPump.FeedingSpeed=0;
ReefAngel.DCPump.WaterChangeSpeed=0;
// Ports that are always on
ReefAngel.Relay.On( Port4 );
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
//ReefAngel.ActinicLights( Port1 );
//ReefAngel.DayLights( Port2 );
// Light code
SeasonalDaylight();
SeasonalActiniclight();
ReefAngel.StandardHeater( Port3 );
ReefAngel.Relay.DelayedOn(Port5 );
ReefAngel.DosingPumpRepeat1( Port7 );
ReefAngel.DosingPumpRepeat2( Port8 );
//ReefAngel.PWM.DaylightPWMSlope();
//ReefAngel.PWM.ActinicPWMSlope();
ReefAngel.DCPump.LowATOChannel = Sync; // WP40
ReefAngel.DCPump.HighATOChannel = AntiSync; // SW-8
ReefAngel.DCPump.AntiSyncOffset = 125;
////// Place your custom code below here
// Wavemaker
if ( ((hour() >= 2) && (hour() < 8)) || ((hour() >= 15) && (hour() < 19)) ) // off from 2am-8am & 3pm-7pm
{
ReefAngel.Relay.Off(Port6);
}
else
{
ReefAngel.WavemakerRandom( Port6, 30, 150 ); // random between 30 and 150 seconds
}
// DC pumps....................................
static int rmode;
static boolean changeMode=true;
// These are the modes we can cycle through. You can add more and even repeat...
byte modes[] = { ReefCrest, Lagoon, TidalSwell, ShortPulse, Sine, Else, Gyre, NutrientTransport };
if (now()%1800==0 || changeMode==true) // Change every 30 mins (1800seconds) or controller reboot
{
rmode=random(100)%sizeof(modes); // Change the mode by picking from our array
changeMode=false;
}
// Set timer when in feeding mode
static unsigned long feeding;
if (ReefAngel.DisplayedMenu==FEEDING_MODE) feeding=now();
// Continue NutrientTranspot Mode for 30 minutes after feeding
if (now()-feeding<1800)
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=ReefCrest;
ReefAngel.DCPump.Speed=75;
}
// Night/Quiet mode
else if (hour()>=2 && hour()<8 ) // 2am to 8am
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.SetMode( Gyre,40,10 );
}
else if (hour()>=15 && hour()<19) // 3pm and 7pm
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.SetMode( ShortPulse,40,30 );
}
//Storm mode
else if (hour()>=1 && hour()<2) // 1am and 2am
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.SetMode( Else,70,15 );
}
else if (hour()>=11 && hour()<12) // 11am and 12pm
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.SetMode( ReefCrest,80,15 );
}
// Custom Mode and nothing else going on
else if (InternalMemory.DCPumpMode_read()==11)
{
ReefAngel.DCPump.UseMemory=false;
ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
ReefAngel.DCPump.Mode=modes[rmode]; // Put the mode to the random mode :)
ReefAngel.DCPump.Speed=InternalMemory.DCPumpSpeed_read(); // Set speed from portal
} else {
ReefAngel.DCPump.UseMemory=true; // Will reset all values from memory
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "" );
ReefAngel.DDNS( "" ); // Your DDNS is
ReefAngel.ShowInterface();
}