Page 1 of 1

Ramp up / Down Lights

Posted: Sun Nov 06, 2011 5:03 pm
by wolfador
Roberto made me a cable so I can control my Ai Nano.

I have the timers setup, just need help getting the lights to ramp up / down like the Ai controller did. I had them set for 30min's time to ramp to the next light schedule.

Here is the schedule I had with the Ai Controller:
5am - 30m ramp - W0 B4 R4 - moon cycle
9am - 30m ramp - W3 B8 R8
11am - 30m ramp - W15 B20 R20
1p - 60m - ramp - W30 B35 R35
5p - 60m ramp - W5 B32 R32
8p - 30m ramp - W3 B7 R7
10p - 21m ramp - W0 B2 R2 - moon cycle

Here is how the Ai is setup in my pde:

Code: Select all

  if (hour()>=5 && hour()<9)
    {
  ReefAngel.AI.SetChannel(White,0);
  ReefAngel.AI.SetChannel(Blue,4);
  ReefAngel.AI.SetChannel(RoyalBlue,4);
    }
    else if (hour()>=9 && hour()<11)
    {
  ReefAngel.AI.SetChannel(White,3);
  ReefAngel.AI.SetChannel(Blue,8);
  ReefAngel.AI.SetChannel(RoyalBlue,8);
    }
   else if (hour()>=11 && hour()<13)
    {
  ReefAngel.AI.SetChannel(White,15);
  ReefAngel.AI.SetChannel(Blue,20);
  ReefAngel.AI.SetChannel(RoyalBlue,20);
    }
   else if (hour()>=13 && hour()<17)
    {
  ReefAngel.AI.SetChannel(White,30);
  ReefAngel.AI.SetChannel(Blue,35);
  ReefAngel.AI.SetChannel(RoyalBlue,35);
    }
   else if (hour()>=17 && hour()<20)
    {
  ReefAngel.AI.SetChannel(White,5);
  ReefAngel.AI.SetChannel(Blue,32);
  ReefAngel.AI.SetChannel(RoyalBlue,32);
    }
   else if (hour()>=20 && hour()<22)
    {
  ReefAngel.AI.SetChannel(White,3);
  ReefAngel.AI.SetChannel(Blue,7);
  ReefAngel.AI.SetChannel(RoyalBlue,7);
    }
   else if (hour()>=22 && hour()<5)
    {
  ReefAngel.AI.SetChannel(White,0);
  ReefAngel.AI.SetChannel(Blue,2);
  ReefAngel.AI.SetChannel(RoyalBlue,2);
    }
Also need to add in the Moon cycle for the overnight timers and some cool stuff like thunderstorm and clouds :D

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 5:14 pm
by rimai
Nice :)
So, my question now is whether you would like to have the same ramp as you have now or you want to get it more smooth.
The way I see you had it setup before was at 9am, it would go from W0B4R4 to W3B8R8 withint 30mins and then stay at that level until 11am. Then ramp from W3B8R8 at 11am to W15B20R20 within 30 mins and stay at that level for another hour and a half. Then go on the same way through the entire schedule posted.
Seems like a ramp, flat, ramp flat, ramp, flat type of waveform.
The PWMSlope function creates a symmetrical waveform which would be ramp, flat, ramp.
Or, we could even go with a sinusoidal type of waveform.
Up to you.

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 5:20 pm
by wolfador
I think making it smoother would be awesome and make great use of the Ai Nano.

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 5:34 pm
by rimai
Let's start by doing just one slope function.
You may be able to change and play around to achieve best results.
If it still doen't look right, we can revise.

Code: Select all

#include <ReefAngel_Features.h>
#include <ReefAngel_Globals.h>
#include <ReefAngel_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <ReefAngel_EEPROM.h>
#include <ReefAngel_NokiaLCD.h>
#include <ReefAngel_ATO.h>
#include <ReefAngel_Joystick.h>
#include <ReefAngel_LED.h>
#include <ReefAngel_TempSensor.h>
#include <ReefAngel_Relay.h>
#include <ReefAngel_PWM.h>
#include <ReefAngel_Timer.h>
#include <ReefAngel_Memory.h>
#include <ReefAngel.h>
#include <ReefAngel_AI.h>

void setup()
{
  ReefAngel.Init();  
  ReefAngel.AI.SetPort(highATOPin);
}

void loop()
{
  ReefAngel.AI.SetChannel(White,PWMSlope(9,0,22,0,0,30,240,0));
  ReefAngel.AI.SetChannel(Blue,PWMSlope(9,0,22,0,0,35,240,2));
  ReefAngel.AI.SetChannel(RoyalBlue,PWMSlope(9,0,22,0,0,35,240,2));
  ReefAngel.ShowInterface();
}
Let me know how it looks.

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 6:27 pm
by wolfador
okay, I have it set to ramp up to 30,35,35 stopping at 5pm, after that it should start ramping down to 0,4,4 until 9am again. I read that the PWMSlope doesn't do inverted values. What would we do to get around that?

Thanks

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 6:35 pm
by rimai
Oh, the PWMSlope is symmetrical and the maximum amount of minutes it could slope up/down is 255 minutes.
The code I posted would ramp up, for example white channel, from 9am at 0% to 1pm at 30% and would stay at 30% from 1pm to 6pm. Then, ramp down from 6pm at 30% to 10pm at 0%, making a symmetrical shape.
By the looks of what you said, you were trying to create a pyramid type of waveform, instead of a trapezoid. Is it correct?

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 6:50 pm
by wolfador
I guess I was looking to do an arc to better mimic the sun rising and setting but a trapezoid form will also work since that is what I was working with before.

I didn't know the PWMSlope would ramp back down so I just loaded the code you posted and will watch it here to see if it ramps down.

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 6:59 pm
by rimai
We can do sinusoidal too if you would like.
There isn't such a function created yet, but it should be easy enough to do.

Re: Ramp up / Down Lights

Posted: Sun Nov 06, 2011 7:27 pm
by wolfador
I am not sure it really do much for me now that I think about it since I am only going to 35% max power on the lights there is not much it could ramp up / down too. I think what we have now will work okay.

Re: Ramp up / Down Lights

Posted: Mon Nov 07, 2011 7:38 am
by wolfador
I added the AI values to the /r99 xml readout / iPhone app so I can see how it ramps up without being there today. LOL. Looking okay so far.

Re: Ramp up / Down Lights

Posted: Mon Nov 07, 2011 9:06 am
by rimai
Cool!!
:mrgreen:
Let us know how RA and AI integration is working out for you when you are done testing it out :)

Re: Ramp up / Down Lights

Posted: Mon Nov 07, 2011 10:02 am
by wolfador
Still ramping up nicely.

Will the standard MoonPhase() in
http://forum.reefangel.com/viewtopic.ph ... e&start=10

work in this application? Full moon was set to 4% blue and 4% RoyalBlue on the Ai Controller.

Re: Ramp up / Down Lights

Posted: Mon Nov 07, 2011 10:28 am
by rimai
MoonPhase gives a value from 0 to 100.
You can just multiply that to 0.04 to achieve the 4%.

Re: Ramp up / Down Lights

Posted: Mon Nov 07, 2011 10:31 am
by wolfador
rimai wrote:MoonPhase gives a value from 0 to 100.
You can just multiply that to 0.04 to achieve the 4%.

Cool thats what I thought, I will load it up when I get home and try it out tonight.

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 5:36 am
by wolfador
Moon Cycle worked good last night, I modified the times a bit for the main PWMSlope to shorten the white ramp to have the lights a little more blue when I get home from work.

Made a custom Main Screen to show the Ai LED values:

Image


Just gotta modify the spacing a bit to clean it up.

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 5:40 am
by wolfador
duplicate

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 8:44 am
by rimai
Nice!!!
You need to send a request to Curt to merge the changes you've made to the XML data, so everyone can use the AI data too in the future. :)

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 8:54 am
by wolfador
rimai wrote:Nice!!!
You need to send a request to Curt to merge the changes you've made to the XML data, so everyone can use the AI data too in the future. :)

I sent him a couple pull requests yesterday for it, he keeps finding small things wrong with it. :D I think I have it correctly now.


Now time to work on clouds and thunderstorms :lol:

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 9:14 am
by rimai
Yeah, all you have to do is use the cloud and storm function that was created:
http://forum.reefangel.com/viewtopic.php?f=12&t=288
You will want to add a third variable for the royal blue channel.
Let me know if you have problems along the way.

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 9:44 am
by wolfador
Grr sketch too big :( anything I can remove?

Binary sketch size: 32768 bytes (of a 32256 byte maximum)
Features.h

Code: Select all

#define DisplayImages
#define wifi
#define CUSTOM_MAIN
#define SIMPLE_MENU
#define AI_LED
I can remove the DisplayImages but it still only gets me down to 32408 and I happen to like the images :mrgreen:

Code: Select all

#include <ReefAngel_Features.h>
#include <ReefAngel_Globals.h>
#include <ReefAngel_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <ReefAngel_EEPROM.h>
#include <ReefAngel_NokiaLCD.h>
#include <ReefAngel_ATO.h>
#include <ReefAngel_Joystick.h>
#include <ReefAngel_LED.h>
#include <ReefAngel_TempSensor.h>
#include <ReefAngel_Relay.h>
#include <ReefAngel_PWM.h>
#include <ReefAngel_Timer.h>
#include <ReefAngel_Memory.h>
//#include <ReefAngel_Salinity.h>
#include <ReefAngel_AI.h>
#include <ReefAngel.h>

byte WhiteValue=0;
byte BlueValue=0;
byte RoyalBlueValue=0;

#define Port8   8
#define Heater  7
#define Port6   6
#define Port5   5
#define FugePH  4
#define PH      3
#define SOL     2
#define FugeLT  1

#define T1LOW   720
#define T1HIGH  850
#define T2LOW   500
#define T2HIGH  850
#define T3LOW   650
#define T3HIGH  1000

// Labels for the web banner
#include <avr/pgmspace.h>
prog_char id_label[] PROGMEM = "wolfador";
prog_char probe1_label[] PROGMEM = "Water";
prog_char probe2_label[] PROGMEM = "Room";
prog_char probe3_label[] PROGMEM = "Ai%20Nano";
prog_char relay1_label[] PROGMEM = "Fuge%20Light";
prog_char relay2_label[] PROGMEM = "Ai%20Sol%20Nano";
prog_char relay3_label[] PROGMEM = "PowerHead";
prog_char relay4_label[] PROGMEM = "Fuge%20Pump";
prog_char relay5_label[] PROGMEM = "NA";
prog_char relay6_label[] PROGMEM = "NA";
prog_char relay7_label[] PROGMEM = "Heater";
prog_char relay8_label[] PROGMEM = "NA";


PROGMEM const char *webbanner_items[] = {
id_label, probe1_label, probe2_label, probe3_label, relay1_label, relay2_label,
relay3_label, relay4_label, relay5_label, relay6_label, relay7_label, relay8_label};

void WifiSendAlert(byte id, boolean IsAlert)
{
static byte alert_status;
if (IsAlert)
{
if ((alert_status & 1<<(id-1))==0)
{
alert_status|=1<<(id-1);
Serial.print("GET /status/alert.asp?e=4122988294@txt.att.net&id=");
Serial.println(alert_status,DEC);
Serial.println("\n\n");
}}
else
{
if (id==0)
{
alert_status=0;
delay(900);
}
else
{
alert_status&=~(1<<(id-1));
}}}

void DrawCustomMain()
{
     // the graph is drawn/updated when we exit the main menu &
     // when the parameters are saved
     ReefAngel.LCD.DrawDate(6, 115);
     pingSerial();
#if defined AI_LED && ! defined RemoveAllLights
     ReefAngel.LCD.DrawMonitor(15, 68, ReefAngel.Params);
     ReefAngel.LCD.DrawText(DPColor, DefaultBGColor, 70, 78 ,"W:");
     ReefAngel.LCD.DrawSingleMonitor(ReefAngel.AI.GetChannel(0), DPColor, 84, 78, 1);
     ReefAngel.LCD.DrawText(APColor , DefaultBGColor, 70, 90 ,"B:");
     ReefAngel.LCD.DrawSingleMonitor(ReefAngel.AI.GetChannel(1), APColor, 84, 90, 1);
     ReefAngel.LCD.DrawText(APColor , DefaultBGColor, 94, 90 ,"RB:");
     ReefAngel.LCD.DrawSingleMonitor(ReefAngel.AI.GetChannel(2), APColor, 115, 90, 1);
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
     ReefAngel.LCD.DrawMonitor(15, 65, ReefAngel.Params);
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
     pingSerial();
     byte TempRelay = ReefAngel.Relay.RelayData;
     TempRelay &= ReefAngel.Relay.RelayMaskOff;
     TempRelay |= ReefAngel.Relay.RelayMaskOn;
     ReefAngel.LCD.DrawOutletBox(12, 100, TempRelay);
}
void DrawCustomGraph()
{
     ReefAngel.LCD.DrawText(DefaultFGColor, DefaultBGColor, 20, 2, "Wolfador's 10G");
     ReefAngel.LCD.DrawGraph(5,10);
}
//*********************************************************************************************************************************
// 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 100

  // 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 15

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

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

  // 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 100

  // 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))
    {
      WhiteValue=ReversePWMSlope(cloudstart,cloudstart+cloudduration,WhiteValue,0,180);
      if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5) 
      {
        if (random(100)<20) lightningstatus=1; 
        else lightningstatus=0;
        if (lightningstatus)
        {
          WhiteValue=50; 
          BlueValue=50;
          RoyalBlueValue=50;
        }
        else 
        {
          WhiteValue=0; 
          BlueValue=0;
          RoyalBlueValue=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;
}

void setup()
{
    ReefAngel.Init();

    ReefAngel.LoadWebBanner(pgm_read_word(&(webbanner_items[0])), SIZE(webbanner_items));
    ReefAngel.Timer[4].SetInterval(180);
    ReefAngel.Timer[4].Start();

    ReefAngel.FeedingModePorts = B00001100;
    ReefAngel.WaterChangePorts = B01001100;
    //ReefAngel.OverheatShutoffPorts = B10110000;
   // ReefAngel.LightsOnPorts = B00000010;
  
  //WifiAuthentication("wolfador:gixxer");   

    ReefAngel.Relay.On(FugePH);
    ReefAngel.Relay.On(PH);
    ReefAngel.Relay.On(SOL);
    
    ReefAngel.AI.SetPort(highATOPin);
}

void loop()
{
    ReefAngel.ShowInterface();

    // Specific functions
    ReefAngel.StandardLights(FugeLT,23,0,10,0); 
    ReefAngel.StandardHeater(Heater);
    
    // Web Banner stuff
if(ReefAngel.Timer[4].IsTriggered())
{
ReefAngel.Timer[4].Start();
ReefAngel.WebBanner();
}

//This will send an alert if T1 is below 77 and reset if above 78
if (ReefAngel.Params.Temp1<770 && ReefAngel.Params.Temp1>0) WifiSendAlert(3,true);
if (ReefAngel.Params.Temp1>780 && ReefAngel.Params.Temp1<1850) WifiSendAlert(3,false);
//This will send an alert if T1 is above 83 and reset if below 80
if (ReefAngel.Params.Temp1>820 && ReefAngel.Params.Temp1>1850) WifiSendAlert(4,true);
if (ReefAngel.Params.Temp1<800 && ReefAngel.Params.Temp1>0) WifiSendAlert(4,false);

   if (hour()>=22 || hour()<9)
    {
  ReefAngel.AI.SetChannel(White,0);
  ReefAngel.AI.SetChannel(Blue,MoonPhase()*0.06);
  ReefAngel.AI.SetChannel(RoyalBlue,MoonPhase()*0.06);
    }
    else
    {
      WhiteValue=PWMSlope(9,0,21,0,3,30,200,3);
      BlueValue=PWMSlope(9,0,21,0,8,35,240,8);
      RoyalBlueValue=PWMSlope(9,0,21,0,8,35,240,8);
      CheckCloud();
      ReefAngel.AI.SetChannel(White,WhiteValue);
      ReefAngel.AI.SetChannel(Blue,BlueValue);
      ReefAngel.AI.SetChannel(RoyalBlue,RoyalBlueValue);
      
  //ReefAngel.AI.SetChannel(White,PWMSlope(9,0,21,0,3,30,200,3));
  //ReefAngel.AI.SetChannel(Blue,PWMSlope(9,0,21,0,8,35,240,8));
  //ReefAngel.AI.SetChannel(RoyalBlue,PWMSlope(9,0,21,0,8,35,240,8));
    }

}

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 9:48 am
by wolfador
If I remove the WifiSendAlert() it compiles and gets it down to 32054 bytes (of a 32256 byte maximum).

Would like to keep that if possible though.

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 9:55 am
by rimai
You can do custom menu to save more spave :)

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 10:06 am
by binder
rimai wrote:You can do custom menu to save more spave :)
i agree. you can trigger the modes via wifi so that can save the memory with less menu options.

curt

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 3:47 pm
by wolfador
I did a custom menu with just the Feeding and WaterChange modes. I think I will add a Thunderstorm menu item to to show it off.

Got the Clouds code working and went through a test cycle. Looked neat. Next time it goes through I will try and grab a video.

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 4:02 pm
by rimai
Cool!!
Yes, I'd love to see video :)

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 5:53 pm
by binder
wolfador wrote:
rimai wrote:Nice!!!
You need to send a request to Curt to merge the changes you've made to the XML data, so everyone can use the AI data too in the future. :)
I sent him a couple pull requests yesterday for it, he keeps finding small things wrong with it. :D I think I have it correctly now.
Yeah, I have to find the small things in order to keep the code footprint down and keep up with the "high quality code" for the controller.
Code is merged in master branch. :ugeek:

curt

Re: Ramp up / Down Lights

Posted: Tue Nov 08, 2011 5:56 pm
by wolfador
binder wrote: Yeah, I have to find the small things in order to keep the code footprint down and keep up with the "high quality code" for the controller.
Code is merged in master branch. :ugeek:

curt
Cool thanks. I will finalize it into the iPhone app now.

Re: Ramp up / Down Lights

Posted: Sun Nov 13, 2011 5:27 pm
by rimai
Can we officially say that RA is capable of controlling Aqua Illumination fixtures?
Where is the video proof of it? ;)

Re: Ramp up / Down Lights

Posted: Sun Nov 13, 2011 5:36 pm
by wolfador
yes we can, have not been home this weekend to get a video lol. Will get one soon.