Where to put additional code

Share you PDE file with our community
Post Reply
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Where to put additional code

Post by lnevo »

Well, you have a lot of "lights"...Algae Scrubber and Fuge light...I didn't mess with those at all, but hopefully you can see how to adjust those if you want them based on the functions from SunLocation... if not, let me know I can help you there as well.

I set the offset to -13 hours so that it would match the longest light cycle you had which was your DayLight PWM... typically this is your Actinics btw.. if you ever wanted to use the Memory locations and utilize the ActinicOffset, you'd need to reverse your setup.

This will put your light's on tomorrow at 6:56am and off at 8:47pm with your Actinic's on one hour after sunrise and one hour before sunset. Keep in mind that we are currently in the "long" days in GBR time... so as we get to summer, your light cycle will shrink.... The difference between winter and summer at GBR though is only 2hours... not as big as here in the US :)

Anyway, here's your code, verified in Arduino. I added comments as well for what I added and why.

Let me know if you have any questions and I can explain further.

Lee

Code: Select all

#define Return pump Port1
#define ATS pump Port2
#define Scrubber light Port3
#define Fuge light Port4
#define Calcium doser Port5
#define Alk doser Port6
#define Food doser Port7
#define Main LED fan Port8

#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 <ReefAngel.h>
#include <SunLocation.h>

////// Place global variable code below here

byte ActinicPWMValue=0;
byte DaylightPWMValue=0;

// We declare this here so we can use it in multiple functions
SunLocation sl;

////// Place global variable code above here


void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.AddStandardMenu(); // Add Standard Menu

// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port3Bit | Port4Bit | Port8Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = 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( 820 );

// Since we only need to set OffSet once, then it can go in setup()
// Great Barrier reef is currently +15 hours from us. 
// Current GBR Rise/Set is 4:56am/6:47am
// Instead of subtracing the 15 hours, I only subtracted 13.
// This will make it close to your 7am-9pm light cycle.
sl.SetOffset(-13,472,-13,506); // The 472/506 were corrections I made to the formula, you can leave them or set them to 0 if you want.

// Ports that are always on
ReefAngel.Relay.On( Port1 );
ReefAngel.Relay.On( Port2 );

////// Place additional initialization code below here


////// Place additional initialization code above here
}

void loop()
{
ReefAngel.StandardLights( Port3,20,0,8,0 );
ReefAngel.StandardLights( Port4,18,0,12,0 );
ReefAngel.DosingPumpRepeat( Port5,0,60,60 );
ReefAngel.DosingPumpRepeat( Port6,30,60,60 );
ReefAngel.DosingPumpRepeat( Port7,0,30,60 );
ReefAngel.StandardLights( Port8,6,0,22,0 );
////// Place your custom code below here

  // Each day we're going to update Sunrise/Sunset, so it's part of the loop() function
  sl.CheckAndUpdate();

  // We've replaced the 7,0,21,0 with the Rise/Set Hour/Minute. Current GBR Rise/Set is 4:56am/6:47am
  DaylightPWMValue=PWMParabola(sl.GetRiseHour(),sl.GetRiseMinute(),sl.GetSetHour(),sl.GetSetMinute(),12,100,12);
  // We've replaced the 8,0,20,0 with the Rise/Set Hour/Minute +1/-1 to from GBR Rise/Set
  ActinicPWMValue=PWMParabola(sl.GetRiseHour()+1,sl.GetRiseMinute(),sl.GetSetHour()-1,sl.GetSetMinute(),12,80,12) ;
  CheckCloud();
  ReefAngel.PWM.SetActinic(ActinicPWMValue);
  ReefAngel.PWM.SetDaylight(DaylightPWMValue);

////// Place your custom code above here

// This should always be the last line
ReefAngel.Portal("jedimasterben");
ReefAngel.ShowInterface();
}
// Random Cloud/Thunderstorm effects function
void CheckCloud()
{

// ------------------------------------------------------------
// Change the values below to customize your cloud/storm effect

// Frequency in days based on the day of the month - number 2 means every 2 days, for example (day 2,4,6 etc)
// For testing purposes, you can use 1 and cause the cloud to occur everyday
#define Clouds_Every_X_Days 1

// Percentage chance of a cloud happening today
// For testing purposes, you can use 100 and cause the cloud to have 100% chance of happening
#define Cloud_Chance_per_Day 50

// Minimum number of minutes for cloud duration. Don't use max duration of less than 6
#define Min_Cloud_Duration 7

// Maximum number of minutes for the cloud duration. Don't use max duration of more than 255
#define Max_Cloud_Duration 30

// Minimum number of clouds that can happen per day
#define Min_Clouds_per_Day 1

// Maximum number of clouds that can happen per day
#define Max_Clouds_per_Day 3

// Only start the cloud effect after this setting
// In this example, start could after 11:30am
#define Start_Cloud_After NumMins(11,30)

// Always end the cloud effect before this setting
// In this example, end could before 8:00pm
#define End_Cloud_Before NumMins(18,30)

// Percentage chance of a lightning happen for every cloud
// For testing purposes, you can use 100 and cause the lightning to have 100% chance of happening
#define Lightning_Change_per_Cloud 25

// Note: Make sure to choose correct values that will work within your PWMSLope settings.
// For example, in our case, we could have a max of 5 clouds per day and they could last for 50 minutes.
// Which could mean 250 minutes of clouds. We need to make sure the PWMSlope can accomodate 250 minutes of effects or unforseen resul could happen.
// Also, make sure that you can fit double those minutes between Start_Cloud_After and End_Cloud_Before.
// In our example, we have 510 minutes between Start_Cloud_After and End_Cloud_Before, so double the 250 minutes (or 500 minutes) can fit in that 510 minutes window.
// It's a tight fit, but it did.

//#define printdebug // Uncomment this for debug print on Serial Monitor window
#define forcecloudcalculation // Uncomment this to force the cloud calculation to happen in the boot process. 


// Change the values above to customize your cloud/storm effect
// ------------------------------------------------------------
// Do not change anything below here

static byte cloudchance=255;
static byte cloudduration=0;
static int cloudstart=0;
static byte numclouds=0;
static byte lightningchance=0;
static byte cloudindex=0;
static byte lightningstatus=0;
static int LastNumMins=0;
// Every day at midnight, we check for chance of cloud happening today
if (hour()==0 && minute()==0 && second()==0) cloudchance=255;

#ifdef forcecloudcalculation
if (cloudchance==255)
#else
if (hour()==0 && minute()==0 && second()==1 && cloudchance==255) 
#endif
{
//Pick a random number between 0 and 99
cloudchance=random(100); 
// if picked number is greater than Cloud_Chance_per_Day, we will not have clouds today
if (cloudchance>Cloud_Chance_per_Day) cloudchance=0;
// Check if today is day for clouds. 
if ((day()%Clouds_Every_X_Days)!=0) cloudchance=0; 
// If we have cloud today
if (cloudchance)
{
// pick a random number for number of clouds between Min_Clouds_per_Day and Max_Clouds_per_Day
numclouds=random(Min_Clouds_per_Day,Max_Clouds_per_Day);
// pick the time that the first cloud will start
// the range is calculated between Start_Cloud_After and the even distribuition of clouds on this day. 
cloudstart=random(Start_Cloud_After,Start_Cloud_After+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
// pick a random number for the cloud duration of first cloud.
cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
//Pick a random number between 0 and 99
lightningchance=random(100);
// if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0;
}
}
// Now that we have all the parameters for the cloud, let's create the effect

if (cloudchance)
{
//is it time for cloud yet?
if (NumMins(hour(),minute())>=cloudstart && NumMins(hour(),minute())<(cloudstart+cloudduration))
{
DaylightPWMValue=ReversePWMSlope(cloudstart,cloudstart+cloudduration,DaylightPWMValue,0,180);
if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5) 
{
if (random(100)<20) lightningstatus=1; 
else lightningstatus=0;
if (lightningstatus)
{
DaylightPWMValue=100; 
ActinicPWMValue=100;
}
else 
{
DaylightPWMValue=0;
ActinicPWMValue=0;
}
delay(1);
}
}
if (NumMins(hour(),minute())>(cloudstart+cloudduration))
{
cloudindex++;
if (cloudindex < numclouds)
{
cloudstart=random(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2),(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2))+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
// pick a random number for the cloud duration of first cloud.
cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
//Pick a random number between 0 and 99
lightningchance=random(100);
// if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0;
}
}
}

if (LastNumMins!=NumMins(hour(),minute()))
{
LastNumMins=NumMins(hour(),minute());
ReefAngel.LCD.Clear(255,0,120,132,132);
ReefAngel.LCD.DrawText(0,255,5,120,"C");
ReefAngel.LCD.DrawText(0,255,11,120,"00:00");
ReefAngel.LCD.DrawText(0,255,45,120,"L");
ReefAngel.LCD.DrawText(0,255,51,120,"00:00");
if (cloudchance && (NumMins(hour(),minute())<cloudstart))
{
int x=0;
if ((cloudstart/60)>=10) x=11; else x=17;
ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart/60));
if ((cloudstart%60)>=10) x=29; else x=35;
ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart%60));
}
ReefAngel.LCD.DrawText(0,255,90,120,cloudduration);
if (lightningchance) 
{
int x=0;
if (((cloudstart+(cloudduration/2))/60)>=10) x=51; else x=57;
ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))/60));
if (((cloudstart+(cloudduration/2))%60)>=10) x=69; else x=75;
ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))%60));
}
} 
}

byte ReversePWMSlope(long cstart,long cend,byte PWMStart,byte PWMEnd, byte clength)
{
long n=elapsedSecsToday(now());
cstart*=60;
cend*=60;
if (n<cstart) return PWMStart;
if (n>=cstart && n<=(cstart+clength)) return map(n,cstart,cstart+clength,PWMStart,PWMEnd);
if (n>(cstart+clength) && n<(cend-clength)) return PWMEnd;
if (n>=(cend-clength) && n<=cend) return map(n,cend-clength,cend,PWMEnd,PWMStart);
if (n>cend) return PWMStart;
}
jedimasterben
Posts: 25
Joined: Tue Dec 25, 2012 5:17 pm

Re: Where to put additional code

Post by jedimasterben »

lnevo wrote:Well, you have a lot of "lights"...Algae Scrubber and Fuge light...I didn't mess with those at all, but hopefully you can see how to adjust those if you want them based on the functions from SunLocation... if not, let me know I can help you there as well.

I set the offset to -13 hours so that it would match the longest light cycle you had which was your DayLight PWM... typically this is your Actinics btw.. if you ever wanted to use the Memory locations and utilize the ActinicOffset, you'd need to reverse your setup.

This will put your light's on tomorrow at 6:56am and off at 8:47pm with your Actinic's on one hour after sunrise and one hour before sunset. Keep in mind that we are currently in the "long" days in GBR time... so as we get to summer, your light cycle will shrink.... The difference between winter and summer at GBR though is only 2hours... not as big as here in the US :)

Anyway, here's your code, verified in Arduino. I added comments as well for what I added and why.

Let me know if you have any questions and I can explain further.

Lee

Code: Select all

#define Return pump Port1
#define ATS pump Port2
#define Scrubber light Port3
#define Fuge light Port4
#define Calcium doser Port5
#define Alk doser Port6
#define Food doser Port7
#define Main LED fan Port8

#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 <ReefAngel.h>
#include <SunLocation.h>

////// Place global variable code below here

byte ActinicPWMValue=0;
byte DaylightPWMValue=0;

// We declare this here so we can use it in multiple functions
SunLocation sl;

////// Place global variable code above here


void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.AddStandardMenu(); // Add Standard Menu

// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port3Bit | Port4Bit | Port8Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = 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( 820 );

// Since we only need to set OffSet once, then it can go in setup()
// Great Barrier reef is currently +15 hours from us. 
// Current GBR Rise/Set is 4:56am/6:47am
// Instead of subtracing the 15 hours, I only subtracted 13.
// This will make it close to your 7am-9pm light cycle.
sl.SetOffset(-13,472,-13,506); // The 472/506 were corrections I made to the formula, you can leave them or set them to 0 if you want.

// Ports that are always on
ReefAngel.Relay.On( Port1 );
ReefAngel.Relay.On( Port2 );

////// Place additional initialization code below here


////// Place additional initialization code above here
}

void loop()
{
ReefAngel.StandardLights( Port3,20,0,8,0 );
ReefAngel.StandardLights( Port4,18,0,12,0 );
ReefAngel.DosingPumpRepeat( Port5,0,60,60 );
ReefAngel.DosingPumpRepeat( Port6,30,60,60 );
ReefAngel.DosingPumpRepeat( Port7,0,30,60 );
ReefAngel.StandardLights( Port8,6,0,22,0 );
////// Place your custom code below here

  // Each day we're going to update Sunrise/Sunset, so it's part of the loop() function
  sl.CheckAndUpdate();

  // We've replaced the 7,0,21,0 with the Rise/Set Hour/Minute. Current GBR Rise/Set is 4:56am/6:47am
  DaylightPWMValue=PWMParabola(sl.GetRiseHour(),sl.GetRiseMinute(),sl.GetSetHour(),sl.GetSetMinute(),12,100,12);
  // We've replaced the 8,0,20,0 with the Rise/Set Hour/Minute +1/-1 to from GBR Rise/Set
  ActinicPWMValue=PWMParabola(sl.GetRiseHour()+1,sl.GetRiseMinute(),sl.GetSetHour()-1,sl.GetSetMinute(),12,80,12) ;
  CheckCloud();
  ReefAngel.PWM.SetActinic(ActinicPWMValue);
  ReefAngel.PWM.SetDaylight(DaylightPWMValue);

////// Place your custom code above here

// This should always be the last line
ReefAngel.Portal("jedimasterben");
ReefAngel.ShowInterface();
}
// Random Cloud/Thunderstorm effects function
void CheckCloud()
{

// ------------------------------------------------------------
// Change the values below to customize your cloud/storm effect

// Frequency in days based on the day of the month - number 2 means every 2 days, for example (day 2,4,6 etc)
// For testing purposes, you can use 1 and cause the cloud to occur everyday
#define Clouds_Every_X_Days 1

// Percentage chance of a cloud happening today
// For testing purposes, you can use 100 and cause the cloud to have 100% chance of happening
#define Cloud_Chance_per_Day 50

// Minimum number of minutes for cloud duration. Don't use max duration of less than 6
#define Min_Cloud_Duration 7

// Maximum number of minutes for the cloud duration. Don't use max duration of more than 255
#define Max_Cloud_Duration 30

// Minimum number of clouds that can happen per day
#define Min_Clouds_per_Day 1

// Maximum number of clouds that can happen per day
#define Max_Clouds_per_Day 3

// Only start the cloud effect after this setting
// In this example, start could after 11:30am
#define Start_Cloud_After NumMins(11,30)

// Always end the cloud effect before this setting
// In this example, end could before 8:00pm
#define End_Cloud_Before NumMins(18,30)

// Percentage chance of a lightning happen for every cloud
// For testing purposes, you can use 100 and cause the lightning to have 100% chance of happening
#define Lightning_Change_per_Cloud 25

// Note: Make sure to choose correct values that will work within your PWMSLope settings.
// For example, in our case, we could have a max of 5 clouds per day and they could last for 50 minutes.
// Which could mean 250 minutes of clouds. We need to make sure the PWMSlope can accomodate 250 minutes of effects or unforseen resul could happen.
// Also, make sure that you can fit double those minutes between Start_Cloud_After and End_Cloud_Before.
// In our example, we have 510 minutes between Start_Cloud_After and End_Cloud_Before, so double the 250 minutes (or 500 minutes) can fit in that 510 minutes window.
// It's a tight fit, but it did.

//#define printdebug // Uncomment this for debug print on Serial Monitor window
#define forcecloudcalculation // Uncomment this to force the cloud calculation to happen in the boot process. 


// Change the values above to customize your cloud/storm effect
// ------------------------------------------------------------
// Do not change anything below here

static byte cloudchance=255;
static byte cloudduration=0;
static int cloudstart=0;
static byte numclouds=0;
static byte lightningchance=0;
static byte cloudindex=0;
static byte lightningstatus=0;
static int LastNumMins=0;
// Every day at midnight, we check for chance of cloud happening today
if (hour()==0 && minute()==0 && second()==0) cloudchance=255;

#ifdef forcecloudcalculation
if (cloudchance==255)
#else
if (hour()==0 && minute()==0 && second()==1 && cloudchance==255) 
#endif
{
//Pick a random number between 0 and 99
cloudchance=random(100); 
// if picked number is greater than Cloud_Chance_per_Day, we will not have clouds today
if (cloudchance>Cloud_Chance_per_Day) cloudchance=0;
// Check if today is day for clouds. 
if ((day()%Clouds_Every_X_Days)!=0) cloudchance=0; 
// If we have cloud today
if (cloudchance)
{
// pick a random number for number of clouds between Min_Clouds_per_Day and Max_Clouds_per_Day
numclouds=random(Min_Clouds_per_Day,Max_Clouds_per_Day);
// pick the time that the first cloud will start
// the range is calculated between Start_Cloud_After and the even distribuition of clouds on this day. 
cloudstart=random(Start_Cloud_After,Start_Cloud_After+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
// pick a random number for the cloud duration of first cloud.
cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
//Pick a random number between 0 and 99
lightningchance=random(100);
// if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0;
}
}
// Now that we have all the parameters for the cloud, let's create the effect

if (cloudchance)
{
//is it time for cloud yet?
if (NumMins(hour(),minute())>=cloudstart && NumMins(hour(),minute())<(cloudstart+cloudduration))
{
DaylightPWMValue=ReversePWMSlope(cloudstart,cloudstart+cloudduration,DaylightPWMValue,0,180);
if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5) 
{
if (random(100)<20) lightningstatus=1; 
else lightningstatus=0;
if (lightningstatus)
{
DaylightPWMValue=100; 
ActinicPWMValue=100;
}
else 
{
DaylightPWMValue=0;
ActinicPWMValue=0;
}
delay(1);
}
}
if (NumMins(hour(),minute())>(cloudstart+cloudduration))
{
cloudindex++;
if (cloudindex < numclouds)
{
cloudstart=random(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2),(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2))+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
// pick a random number for the cloud duration of first cloud.
cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
//Pick a random number between 0 and 99
lightningchance=random(100);
// if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0;
}
}
}

if (LastNumMins!=NumMins(hour(),minute()))
{
LastNumMins=NumMins(hour(),minute());
ReefAngel.LCD.Clear(255,0,120,132,132);
ReefAngel.LCD.DrawText(0,255,5,120,"C");
ReefAngel.LCD.DrawText(0,255,11,120,"00:00");
ReefAngel.LCD.DrawText(0,255,45,120,"L");
ReefAngel.LCD.DrawText(0,255,51,120,"00:00");
if (cloudchance && (NumMins(hour(),minute())<cloudstart))
{
int x=0;
if ((cloudstart/60)>=10) x=11; else x=17;
ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart/60));
if ((cloudstart%60)>=10) x=29; else x=35;
ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart%60));
}
ReefAngel.LCD.DrawText(0,255,90,120,cloudduration);
if (lightningchance) 
{
int x=0;
if (((cloudstart+(cloudduration/2))/60)>=10) x=51; else x=57;
ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))/60));
if (((cloudstart+(cloudduration/2))%60)>=10) x=69; else x=75;
ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))%60));
}
} 
}

byte ReversePWMSlope(long cstart,long cend,byte PWMStart,byte PWMEnd, byte clength)
{
long n=elapsedSecsToday(now());
cstart*=60;
cend*=60;
if (n<cstart) return PWMStart;
if (n>=cstart && n<=(cstart+clength)) return map(n,cstart,cstart+clength,PWMStart,PWMEnd);
if (n>(cstart+clength) && n<(cend-clength)) return PWMEnd;
if (n>=(cend-clength) && n<=cend) return map(n,cend-clength,cend,PWMEnd,PWMStart);
if (n>cend) return PWMStart;
}
Oh! lol. Just the main lights. They're actually controlled solely via PWM, so I'm not even putting them on a relay at this point. And I had gotten the daylight/actinics mixed up lol. No biggie, when I hook it all up tomorrow I'll just swap the two PWM ports physically. I've actually got four channels, but I keep violet and royal blue one the same time and percentage, and the neutral white and deep red/cyan/cool blue together, so technically I can do with just two channels.

And does this need the Wifi module to function properly, or is the coding built into the library I moved over?

Thanks for all your help, I appreciate it very much!
jedimasterben
Posts: 25
Joined: Tue Dec 25, 2012 5:17 pm

Re: Where to put additional code

Post by jedimasterben »

Well, I went to upload the code and it says that it is too large - 39,142 bytes of 32,256 maximum. :(


EDIT: I tried also removing all the // comments in the sketch and it still says it's too big. :(

EDIT 2: Didn't realize the default sketch would be 27,790 bytes.
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Where to put additional code

Post by lnevo »

Comments do not take up space when compiled.

Unfortunately, it seems this feature may be too much for the plain RA. There may be some things Roberto can point you in to free up space on the RA. I know things like the time and date menu chew up a lot of space...

You could also consider getting the plus upgrade. There is a good chance we can get it squeezed in though, but I would worry about future upgrades.

Lee
jedimasterben
Posts: 25
Joined: Tue Dec 25, 2012 5:17 pm

Re: Where to put additional code

Post by jedimasterben »

lnevo wrote:Comments do not take up space when compiled.

Unfortunately, it seems this feature may be too much for the plain RA. There may be some things Roberto can point you in to free up space on the RA. I know things like the time and date menu chew up a lot of space...

You could also consider getting the plus upgrade. There is a good chance we can get it squeezed in though, but I would worry about future upgrades.

Lee
Even just doing the sketch that Roberto posted with storms (not even with the sunrise/set) was way too big. :(

Well, looks like instead of the wifi module I'll be getting the upgraded board.
binder
Posts: 2871
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: Where to put additional code

Post by binder »

I would remove the StandardMenu and switch to the Simple Menu. The Standard Menu takes up a lot of space. If you "must" have some of those features, then creating a custom menu would be the next best option for you. If you have to do some configurations, then I would simplify your main code and then do your configurations and lastly load up the simple menu.
jedimasterben
Posts: 25
Joined: Tue Dec 25, 2012 5:17 pm

Re: Where to put additional code

Post by jedimasterben »

binder wrote:I would remove the StandardMenu and switch to the Simple Menu. The Standard Menu takes up a lot of space. If you "must" have some of those features, then creating a custom menu would be the next best option for you. If you have to do some configurations, then I would simplify your main code and then do your configurations and lastly load up the simple menu.
Frankly, I don't even know where to start with that. :(
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: Where to put additional code

Post by rimai »

Remove this line:

Code: Select all

ReefAngel.AddStandardMenu(); // Add Standard Menu
Roberto.
jedimasterben
Posts: 25
Joined: Tue Dec 25, 2012 5:17 pm

Re: Where to put additional code

Post by jedimasterben »

rimai wrote:Remove this line:

Code: Select all

ReefAngel.AddStandardMenu(); // Add Standard Menu
lol, I swear I looked for anything 'Standard menu'. I removed that and it's down to 33,930 bytes, so still a fuzz too big!
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Where to put additional code

Post by lnevo »

If you remove the line to connect to the portal, it will drop the code to 27,378. You don't need this since you don't have the wifi yet (unless you are using the Windows Client to update the profile). But at least for now you can get the module up and working :)

ReefAngel.portal("jedimasterben");
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Where to put additional code

Post by lnevo »

jedimasterben wrote: Oh! lol. Just the main lights. They're actually controlled solely via PWM, so I'm not even putting them on a relay at this point. And I had gotten the daylight/actinics mixed up lol. No biggie, when I hook it all up tomorrow I'll just swap the two PWM ports physically. I've actually got four channels, but I keep violet and royal blue one the same time and percentage, and the neutral white and deep red/cyan/cool blue together, so technically I can do with just two channels.

And does this need the Wifi module to function properly, or is the coding built into the library I moved over?

Thanks for all your help, I appreciate it very much!
You should be ok without the wifi plugged in even if it's in the code. The last post though I had you remove the line that connects to the portal, so the portal will not be updated, but when you do get the wifi you should still be able to control it remotely and even use the portal, but you won't have history or alerts until you free up more memory or upgrade the controller or remove clouds or sunrise/sunset. A few ways to go...

As far as swapping ports, if you do flip the ports you may want to change the variable names or the settings for which one comes on first :) to reflect the change.
Post Reply