Custom wavemaker code

Do you have a question on how to do something.
Ask in here.
Post Reply
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Custom wavemaker code

Post by maxxdog21 »

I am just kicking around this idea:
I have 4 power heads - they give great flow to the tank and the RA is runiing all 4 on a random timer cycle(code supplied by rimai). I find that it's really too much flow. 2 are enough on opposite sides of the tank, set up with opposing flows. But...I see that it is nice to use all 4 just not always.
I am building a custom menu and I would like to change my code to just use 2 power heads all the time and then have an option to trigger the other 2 heads manually through the menu - so all 4 heads would run randomly for like 1 hour after I triggered it. Even better would be that menu option and then another option to have the main 2 heads run all the time(on opposing flows) but then have the other 2 heads come on daily at a random time for about an hour only and then go back to the main 2 running. Make sense? Any help would be great!
Thanks!
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Re: Custom wavemaker code

Post by maxxdog21 »

I see that if I take away the (from the current wavemaker code) the 2 power heads that I don't want, that will make only the 2 that I do want run as I would like. I could then build a menu function using the WDT(?) to make the other 2 run when I choose that option in the menu - there-by making all 4 run kind of randomly. But how do I add another timer to the menu funtion to make it last for 1 hour and still keep the power heads cycling back and forth randomly?
In my current code, where menu entry 4 is, is where I would like to have the other 2 power heads be triggered from. It is where I was going to run the time/date function. Here is my current code(as far I have gone):

Code: Select all

/* The following features are enabled for this PDE File: 
#define DisplayLEDPWM
#define RelayExp
#define wifi
#define VersionMenu
#define PWMEXPANSION
#define CUSTOM_MENU
#define CUSTOM_MENU_ENTRIES  4
#define CUSTOM_MAIN
#define NUMBERS_8x16
#define COLORS_PDE
*/


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

#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Feeding Time";
prog_char menu1_label[] PROGMEM = "Water Change";
prog_char menu2_label[] PROGMEM = "Lights On";
prog_char menu3_label[] PROGMEM = "Turbulent water";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label};

void MenuEntry1()
{
      ReefAngel.DisplayMenuEntry("Feeding Time");
      ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
      ReefAngel.DisplayMenuEntry("Water Change");
      ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
     ReefAngel.DisplayMenuEntry("Lights On");
     ReefAngel.Relay.RelayMaskOn|=B00000001; //Override Lights On;
     ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}

void MenuEntry4()
{
     ReefAngel.DisplayMenuEntry("Turbulent water");
     //ReefAngel.SetupDateTime();
     ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}


byte PWMChannel[]={
  0,0,0,0,0,0};
  
void DrawCustomMain()
{
  //Top Banner
  ReefAngel.LCD.DrawText(COLOR_BLACK, COLOR_SKYBLUE, 9, 2, " Harry's 120H Reef "); 
  ReefAngel.LCD.DrawDate(6, 123);
  pingSerial();

  // Display Temp Text
  ReefAngel.LCD.DrawText(0,255,8,12,"Temp");
  
  // Display the T1 temp value
  char text[7];
  ConvertNumToString(text, ReefAngel.Params.Temp1, 10);
  ReefAngel.LCD.Clear(255, 4, 22, 37, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 4, 22, text, Num8x16);
  pingSerial();

// Display Salt Text
  ReefAngel.LCD.DrawText(0,255,54,12,"Salt");
  
  // Display Salt Value
  ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
  ReefAngel.LCD.Clear(255, 52, 22, 75, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 52, 22, text, Num8x16);
  pingSerial();

  // Display pH Text
  ReefAngel.LCD.DrawText(0,255,112,12,"pH");
  
  // Display pH Value
  ConvertNumToString(text, ReefAngel.Params.PH, 100);
  ReefAngel.LCD.Clear(255, 94, 22, 106, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 94, 22, text, Num8x16);
  pingSerial();

  
// Display Actinic Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,40,"Blue LED %");

// Display Actinic Percentage Value
   ConvertNumToString(text, PWMChannel[1], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 40, text);
   pingSerial();  

 // Display Daylight Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,50,"White LED %");

 // Display Daylight Percentage Value
   ConvertNumToString(text, PWMChannel[0], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 50, text);
   pingSerial();

 // Display Moonlight Phase Text
  ReefAngel.LCD.DrawText(0,255,8,60,"Moonlight ");

 // Display Moonlight Phase Value
  ConvertNumToString(text, PWMChannel[2], 1);
  strcat(text,"  ");
  ReefAngel.LCD.DrawText(0, 255, 80, 60, text);
  pingSerial();

 
  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(13, 97, TempRelay);
  pingSerial();

  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox(13, 109, TempRelay);
  pingSerial();
  

}
 void DrawCustomGraph()
{
 }

void setup()
{
  ReefAngel.Init();  //Initialize controller

  ReefAngel.FeedingModePorts = B00110000;
  ReefAngel.FeedingModePortsE[0] = B00110000;
  ReefAngel.WaterChangePorts = B00111100;
  ReefAngel.WaterChangePortsE[0] = B00110011;
  ReefAngel.OverheatShutoffPorts = B00000011;
  ReefAngel.LightsOnPorts = B00011110;

  // Ports that are always on
  ReefAngel.Relay.On(Port3);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);

  // Wavemaker timer
  ReefAngel.Timer[1].SetInterval(random(15,90));
  ReefAngel.Timer[1].Start();
  ReefAngel.Relay.On(Port6);
  ReefAngel.Relay.On(Box1_Port6);

}

void loop()
{	
  ReefAngel.ShowInterface();

  // Specific functions

  // T5 White
  ReefAngel.StandardLights(Port1,10,30,20,0);
  
  //T5 Blue
  ReefAngel.StandardLights(Port2,9,30,20,45);
  
  //LED Blue
  ReefAngel.StandardLights(Port7,9,0,21,15);
  
  //LED White
  ReefAngel.StandardLights(Port8,10,0,20,30);
  
  //Heater
  ReefAngel.StandardHeater(Box1_Port3,773,783);
  
  //Refugium
  ReefAngel.StandardLights(Box1_Port4,21,0,7,0);
  
  //Fan
  ReefAngel.StandardLights(Box1_Port7,8,30,21,0);
  
  //LED Moonlight
  ReefAngel.StandardLights(Box1_Port8,20,45,7,30);
  
  // Channel 0 = White
  PWMChannel[0]=PWMSlope(10,0,20,30,0,100,30,PWMChannel[0]); // calculate slope %
  // Channel 1 = Blue
  PWMChannel[1]=PWMSlope(9,0,21,15,0,100,30,PWMChannel[1]); // calculate slope %
  // Channel 2= Moonlights
  PWMChannel[2]=MoonPhase(); // calculate moon phase %

  // this section sends the data to the PWM expansion module
  for (int a=0;a<4;a++)
    ReefAngel.PWM.Expansion(a,int(2.55*PWMChannel[a]));

  // Wavemaker
  if ( ReefAngel.Timer[1].IsTriggered() )
  {
    ReefAngel.Timer[1].SetInterval(random(15,90));
    ReefAngel.Timer[1].Start();
    ReefAngel.Relay.Toggle(Port5);
    ReefAngel.Relay.Toggle(Port6);
    ReefAngel.Relay.Toggle(Box1_Port5);
    ReefAngel.Relay.Toggle(Box1_Port6);
  } 


}


rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom wavemaker code

Post by rimai »

Try this.

Code: Select all

/* The following features are enabled for this PDE File: 
#define DisplayLEDPWM
#define RelayExp
#define wifi
#define VersionMenu
#define PWMEXPANSION
#define CUSTOM_MENU
#define CUSTOM_MENU_ENTRIES  4
#define CUSTOM_MAIN
#define NUMBERS_8x16
#define COLORS_PDE
*/


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

#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Feeding Time";
prog_char menu1_label[] PROGMEM = "Water Change";
prog_char menu2_label[] PROGMEM = "Lights On";
prog_char menu3_label[] PROGMEM = "Turbulent water";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label};

boolean WM_Override=false;

void MenuEntry1()
{
      //ReefAngel.DisplayMenuEntry("Feeding Time");
      ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
      //ReefAngel.DisplayMenuEntry("Water Change");
      ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
     //ReefAngel.DisplayMenuEntry("Lights On");
     ReefAngel.Relay.RelayMaskOn|=B00000001; //Override Lights On;
     ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}

void MenuEntry4()
{
     //ReefAngel.DisplayMenuEntry("Turbulent water");
     WM_Override=true;
     ReefAngel.Timer[2].Start();
     ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}


byte PWMChannel[]={
  0,0,0,0,0,0};
  
void DrawCustomMain()
{
  //Top Banner
  ReefAngel.LCD.DrawText(COLOR_BLACK, COLOR_SKYBLUE, 9, 2, " Harry's 120H Reef "); 
  ReefAngel.LCD.DrawDate(6, 123);
  pingSerial();

  // Display Temp Text
  ReefAngel.LCD.DrawText(0,255,8,12,"Temp");
  
  // Display the T1 temp value
  char text[7];
  ConvertNumToString(text, ReefAngel.Params.Temp1, 10);
  ReefAngel.LCD.Clear(255, 4, 22, 37, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 4, 22, text, Num8x16);
  pingSerial();

// Display Salt Text
  ReefAngel.LCD.DrawText(0,255,54,12,"Salt");
  
  // Display Salt Value
  ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
  ReefAngel.LCD.Clear(255, 52, 22, 75, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 52, 22, text, Num8x16);
  pingSerial();

  // Display pH Text
  ReefAngel.LCD.DrawText(0,255,112,12,"pH");
  
  // Display pH Value
  ConvertNumToString(text, ReefAngel.Params.PH, 100);
  ReefAngel.LCD.Clear(255, 94, 22, 106, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 94, 22, text, Num8x16);
  pingSerial();

  
// Display Actinic Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,40,"Blue LED %");

// Display Actinic Percentage Value
   ConvertNumToString(text, PWMChannel[1], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 40, text);
   pingSerial();  

// Display Daylight Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,50,"White LED %");

// Display Daylight Percentage Value
   ConvertNumToString(text, PWMChannel[0], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 50, text);
   pingSerial();

// Display Moonlight Phase Text
  ReefAngel.LCD.DrawText(0,255,8,60,"Moonlight ");

// Display Moonlight Phase Value
  ConvertNumToString(text, PWMChannel[2], 1);
  strcat(text,"  ");
  ReefAngel.LCD.DrawText(0, 255, 80, 60, text);
  pingSerial();


  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(13, 97, TempRelay);
  pingSerial();

  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox(13, 109, TempRelay);
  pingSerial();
  

}
void DrawCustomGraph()
{
}

void setup()
{
  ReefAngel.Init();  //Initialize controller

  ReefAngel.FeedingModePorts = B00110000;
  ReefAngel.FeedingModePortsE[0] = B00110000;
  ReefAngel.WaterChangePorts = B00111100;
  ReefAngel.WaterChangePortsE[0] = B00110011;
  ReefAngel.OverheatShutoffPorts = B00000011;
  ReefAngel.LightsOnPorts = B00011110;

  // Ports that are always on
  ReefAngel.Relay.On(Port3);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);

  // Wavemaker timer
  ReefAngel.Timer[1].SetInterval(random(15,90));
  ReefAngel.Timer[1].Start();
  // Turbulent Water Timer
  ReefAngel.Timer[2].SetInterval(60);
  ReefAngel.Timer[2].Start();
  
  ReefAngel.Relay.On(Port6);

}

void loop()
{   
  ReefAngel.ShowInterface();

  // Specific functions

  // T5 White
  ReefAngel.StandardLights(Port1,10,30,20,0);
  
  //T5 Blue
  ReefAngel.StandardLights(Port2,9,30,20,45);
  
  //LED Blue
  ReefAngel.StandardLights(Port7,9,0,21,15);
  
  //LED White
  ReefAngel.StandardLights(Port8,10,0,20,30);
  
  //Heater
  ReefAngel.StandardHeater(Box1_Port3,773,783);
  
  //Refugium
  ReefAngel.StandardLights(Box1_Port4,21,0,7,0);
  
  //Fan
  ReefAngel.StandardLights(Box1_Port7,8,30,21,0);
  
  //LED Moonlight
  ReefAngel.StandardLights(Box1_Port8,20,45,7,30);
  
  // Channel 0 = White
  PWMChannel[0]=PWMSlope(10,0,20,30,0,100,30,PWMChannel[0]); // calculate slope %
  // Channel 1 = Blue
  PWMChannel[1]=PWMSlope(9,0,21,15,0,100,30,PWMChannel[1]); // calculate slope %
  // Channel 2= Moonlights
  PWMChannel[2]=MoonPhase(); // calculate moon phase %

  // this section sends the data to the PWM expansion module
  for (int a=0;a<4;a++)
    ReefAngel.PWM.Expansion(a,int(2.55*PWMChannel[a]));

  // Wavemaker
  if ( ReefAngel.Timer[1].IsTriggered() )
  {
    ReefAngel.Timer[1].SetInterval(random(15,90));
    ReefAngel.Timer[1].Start();
    ReefAngel.Relay.Toggle(Port5);
    ReefAngel.Relay.Toggle(Port6);
    if (WM_Override)
    {
      if (bitRead(Port5,4)
        ReefAngel.Relay.On(Box1_Port5);
      else
        ReefAngel.Relay.Off(Box1_Port5);
      
      if (bitRead(Port6,4)
        ReefAngel.Relay.On(Box1_Port6);
      else
        ReefAngel.Relay.Off(Box1_Port6);
    }
    else
    {
        ReefAngel.Relay.Off(Box1_Port5);
        ReefAngel.Relay.Off(Box1_Port6);
    }
  } 

  if ( ReefAngel.Timer[2].IsTriggered() )
  {
    WM_Override=false;
  }
}
Roberto.
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Re: Custom wavemaker code

Post by maxxdog21 »

Thanks Roberto, it looks real cool. I have a question though - I have not tried it yet, but it looks like it is using both port 5 & 6 on the same box for the main wavemaker and when the turbulent water mode is triggered it then uses 5 & 6 on the second relay box. IS this correct? What I need is to use say port 5 from main box and port 5(or 6) from second relay box as main wave maker and then the other 2 ports from each box as the menu option.
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom wavemaker code

Post by rimai »

Try this instead then:

Code: Select all

/* The following features are enabled for this PDE File: 
#define DisplayLEDPWM
#define RelayExp
#define wifi
#define VersionMenu
#define PWMEXPANSION
#define CUSTOM_MENU
#define CUSTOM_MENU_ENTRIES  4
#define CUSTOM_MAIN
#define NUMBERS_8x16
#define COLORS_PDE
*/


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

#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Feeding Time";
prog_char menu1_label[] PROGMEM = "Water Change";
prog_char menu2_label[] PROGMEM = "Lights On";
prog_char menu3_label[] PROGMEM = "Turbulent water";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label};

boolean WM_Override=false;

void MenuEntry1()
{
      //ReefAngel.DisplayMenuEntry("Feeding Time");
      ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
      //ReefAngel.DisplayMenuEntry("Water Change");
      ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
     //ReefAngel.DisplayMenuEntry("Lights On");
     ReefAngel.Relay.RelayMaskOn|=B00000001; //Override Lights On;
     ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}

void MenuEntry4()
{
     //ReefAngel.DisplayMenuEntry("Turbulent water");
     WM_Override=true;
     ReefAngel.Timer[2].Start();
     ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}


byte PWMChannel[]={
  0,0,0,0,0,0};
  
void DrawCustomMain()
{
  //Top Banner
  ReefAngel.LCD.DrawText(COLOR_BLACK, COLOR_SKYBLUE, 9, 2, " Harry's 120H Reef "); 
  ReefAngel.LCD.DrawDate(6, 123);
  pingSerial();

  // Display Temp Text
  ReefAngel.LCD.DrawText(0,255,8,12,"Temp");
  
  // Display the T1 temp value
  char text[7];
  ConvertNumToString(text, ReefAngel.Params.Temp1, 10);
  ReefAngel.LCD.Clear(255, 4, 22, 37, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 4, 22, text, Num8x16);
  pingSerial();

// Display Salt Text
  ReefAngel.LCD.DrawText(0,255,54,12,"Salt");
  
  // Display Salt Value
  ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
  ReefAngel.LCD.Clear(255, 52, 22, 75, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 52, 22, text, Num8x16);
  pingSerial();

  // Display pH Text
  ReefAngel.LCD.DrawText(0,255,112,12,"pH");
  
  // Display pH Value
  ConvertNumToString(text, ReefAngel.Params.PH, 100);
  ReefAngel.LCD.Clear(255, 94, 22, 106, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 94, 22, text, Num8x16);
  pingSerial();

  
// Display Actinic Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,40,"Blue LED %");

// Display Actinic Percentage Value
   ConvertNumToString(text, PWMChannel[1], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 40, text);
   pingSerial();  

// Display Daylight Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,50,"White LED %");

// Display Daylight Percentage Value
   ConvertNumToString(text, PWMChannel[0], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 50, text);
   pingSerial();

// Display Moonlight Phase Text
  ReefAngel.LCD.DrawText(0,255,8,60,"Moonlight ");

// Display Moonlight Phase Value
  ConvertNumToString(text, PWMChannel[2], 1);
  strcat(text,"  ");
  ReefAngel.LCD.DrawText(0, 255, 80, 60, text);
  pingSerial();


  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(13, 97, TempRelay);
  pingSerial();

  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox(13, 109, TempRelay);
  pingSerial();
  

}
void DrawCustomGraph()
{
}

void setup()
{
  ReefAngel.Init();  //Initialize controller

  ReefAngel.FeedingModePorts = B00110000;
  ReefAngel.FeedingModePortsE[0] = B00110000;
  ReefAngel.WaterChangePorts = B00111100;
  ReefAngel.WaterChangePortsE[0] = B00110011;
  ReefAngel.OverheatShutoffPorts = B00000011;
  ReefAngel.LightsOnPorts = B00011110;

  // Ports that are always on
  ReefAngel.Relay.On(Port3);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);

  // Wavemaker timer
  ReefAngel.Timer[1].SetInterval(random(15,90));
  ReefAngel.Timer[1].Start();
  // Turbulent Water Timer
  ReefAngel.Timer[2].SetInterval(60);
  ReefAngel.Timer[2].Start();
  
  ReefAngel.Relay.On(Port6);

}

void loop()
{   
  ReefAngel.ShowInterface();

  // Specific functions

  // T5 White
  ReefAngel.StandardLights(Port1,10,30,20,0);
  
  //T5 Blue
  ReefAngel.StandardLights(Port2,9,30,20,45);
  
  //LED Blue
  ReefAngel.StandardLights(Port7,9,0,21,15);
  
  //LED White
  ReefAngel.StandardLights(Port8,10,0,20,30);
  
  //Heater
  ReefAngel.StandardHeater(Box1_Port3,773,783);
  
  //Refugium
  ReefAngel.StandardLights(Box1_Port4,21,0,7,0);
  
  //Fan
  ReefAngel.StandardLights(Box1_Port7,8,30,21,0);
  
  //LED Moonlight
  ReefAngel.StandardLights(Box1_Port8,20,45,7,30);
  
  // Channel 0 = White
  PWMChannel[0]=PWMSlope(10,0,20,30,0,100,30,PWMChannel[0]); // calculate slope %
  // Channel 1 = Blue
  PWMChannel[1]=PWMSlope(9,0,21,15,0,100,30,PWMChannel[1]); // calculate slope %
  // Channel 2= Moonlights
  PWMChannel[2]=MoonPhase(); // calculate moon phase %

  // this section sends the data to the PWM expansion module
  for (int a=0;a<4;a++)
    ReefAngel.PWM.Expansion(a,int(2.55*PWMChannel[a]));

  // Wavemaker
  if ( ReefAngel.Timer[1].IsTriggered() )
  {
    ReefAngel.Timer[1].SetInterval(random(15,90));
    ReefAngel.Timer[1].Start();
    ReefAngel.Relay.Toggle(Port5);
    ReefAngel.Relay.Toggle(Box1_Port5);
    if (WM_Override)
    {
      if (bitRead(Port5,4)
        ReefAngel.Relay.On(Port6);
      else
        ReefAngel.Relay.Off(Port6);
      
      if (bitRead(Box1_Port5,4)
        ReefAngel.Relay.On(Box1_Port6);
      else
        ReefAngel.Relay.Off(Box1_Port6);
    }
    else
    {
        ReefAngel.Relay.Off(Port6);
        ReefAngel.Relay.Off(Box1_Port6);
    }
  } 

  if ( ReefAngel.Timer[2].IsTriggered() )
  {
    WM_Override=false;
  }
}
Roberto.
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Re: Custom wavemaker code

Post by maxxdog21 »

I can't really tell if it works. The menu does not really work at all. After I load the PDE file, the screen comes up blank. Then if I push the button, the main screen comes up and if I push it again, it goes right into the feeding mode - no menu ever comes up. Then if I push it again, it just says exit. So I have to figure this out. Any ideas on what I am missing for the menu to work right?
Thanks.
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom wavemaker code

Post by rimai »

You missed one very important line in your code:

Code: Select all

  ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
This is the line that initializes the custom menu.
Without it, you get the behavior you were describing.

So, the code should be like this:

Code: Select all

/* The following features are enabled for this PDE File: 
#define DisplayLEDPWM
#define RelayExp
#define wifi
#define VersionMenu
#define PWMEXPANSION
#define CUSTOM_MENU
#define CUSTOM_MENU_ENTRIES  4
#define CUSTOM_MAIN
#define NUMBERS_8x16
#define COLORS_PDE
*/


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

#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Feeding Time";
prog_char menu1_label[] PROGMEM = "Water Change";
prog_char menu2_label[] PROGMEM = "Lights On";
prog_char menu3_label[] PROGMEM = "Turbulent water";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label};

boolean WM_Override=false;

void MenuEntry1()
{
      //ReefAngel.DisplayMenuEntry("Feeding Time");
      ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
      //ReefAngel.DisplayMenuEntry("Water Change");
      ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
     //ReefAngel.DisplayMenuEntry("Lights On");
     ReefAngel.Relay.RelayMaskOn|=B00000001; //Override Lights On;
     ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}

void MenuEntry4()
{
     //ReefAngel.DisplayMenuEntry("Turbulent water");
     WM_Override=true;
     ReefAngel.Timer[2].Start();
     ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}


byte PWMChannel[]={
  0,0,0,0,0,0};
  
void DrawCustomMain()
{
  //Top Banner
  ReefAngel.LCD.DrawText(COLOR_BLACK, COLOR_SKYBLUE, 9, 2, " Harry's 120H Reef "); 
  ReefAngel.LCD.DrawDate(6, 123);
  pingSerial();

  // Display Temp Text
  ReefAngel.LCD.DrawText(0,255,8,12,"Temp");
  
  // Display the T1 temp value
  char text[7];
  ConvertNumToString(text, ReefAngel.Params.Temp1, 10);
  ReefAngel.LCD.Clear(255, 4, 22, 37, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 4, 22, text, Num8x16);
  pingSerial();

// Display Salt Text
  ReefAngel.LCD.DrawText(0,255,54,12,"Salt");
  
  // Display Salt Value
  ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
  ReefAngel.LCD.Clear(255, 52, 22, 75, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 52, 22, text, Num8x16);
  pingSerial();

  // Display pH Text
  ReefAngel.LCD.DrawText(0,255,112,12,"pH");
  
  // Display pH Value
  ConvertNumToString(text, ReefAngel.Params.PH, 100);
  ReefAngel.LCD.Clear(255, 94, 22, 106, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 94, 22, text, Num8x16);
  pingSerial();

  
// Display Actinic Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,40,"Blue LED %");

// Display Actinic Percentage Value
   ConvertNumToString(text, PWMChannel[1], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 40, text);
   pingSerial();  

// Display Daylight Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,50,"White LED %");

// Display Daylight Percentage Value
   ConvertNumToString(text, PWMChannel[0], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 50, text);
   pingSerial();

// Display Moonlight Phase Text
  ReefAngel.LCD.DrawText(0,255,8,60,"Moonlight ");

// Display Moonlight Phase Value
  ConvertNumToString(text, PWMChannel[2], 1);
  strcat(text,"  ");
  ReefAngel.LCD.DrawText(0, 255, 80, 60, text);
  pingSerial();


  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(13, 97, TempRelay);
  pingSerial();

  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox(13, 109, TempRelay);
  pingSerial();
  

}
void DrawCustomGraph()
{
}

void setup()
{
  ReefAngel.Init();  //Initialize controller
  ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));

  ReefAngel.FeedingModePorts = B00110000;
  ReefAngel.FeedingModePortsE[0] = B00110000;
  ReefAngel.WaterChangePorts = B00111100;
  ReefAngel.WaterChangePortsE[0] = B00110011;
  ReefAngel.OverheatShutoffPorts = B00000011;
  ReefAngel.LightsOnPorts = B00011110;

  // Ports that are always on
  ReefAngel.Relay.On(Port3);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);

  // Wavemaker timer
  ReefAngel.Timer[1].SetInterval(random(15,90));
  ReefAngel.Timer[1].Start();
  // Turbulent Water Timer
  ReefAngel.Timer[2].SetInterval(60);
  ReefAngel.Timer[2].Start();
  
  ReefAngel.Relay.On(Port6);

}

void loop()
{   
  ReefAngel.ShowInterface();

  // Specific functions

  // T5 White
  ReefAngel.StandardLights(Port1,10,30,20,0);
  
  //T5 Blue
  ReefAngel.StandardLights(Port2,9,30,20,45);
  
  //LED Blue
  ReefAngel.StandardLights(Port7,9,0,21,15);
  
  //LED White
  ReefAngel.StandardLights(Port8,10,0,20,30);
  
  //Heater
  ReefAngel.StandardHeater(Box1_Port3,773,783);
  
  //Refugium
  ReefAngel.StandardLights(Box1_Port4,21,0,7,0);
  
  //Fan
  ReefAngel.StandardLights(Box1_Port7,8,30,21,0);
  
  //LED Moonlight
  ReefAngel.StandardLights(Box1_Port8,20,45,7,30);
  
  // Channel 0 = White
  PWMChannel[0]=PWMSlope(10,0,20,30,0,100,30,PWMChannel[0]); // calculate slope %
  // Channel 1 = Blue
  PWMChannel[1]=PWMSlope(9,0,21,15,0,100,30,PWMChannel[1]); // calculate slope %
  // Channel 2= Moonlights
  PWMChannel[2]=MoonPhase(); // calculate moon phase %

  // this section sends the data to the PWM expansion module
  for (int a=0;a<4;a++)
    ReefAngel.PWM.Expansion(a,int(2.55*PWMChannel[a]));

  // Wavemaker
  if ( ReefAngel.Timer[1].IsTriggered() )
  {
    ReefAngel.Timer[1].SetInterval(random(15,90));
    ReefAngel.Timer[1].Start();
    ReefAngel.Relay.Toggle(Port5);
    ReefAngel.Relay.Toggle(Box1_Port5);
    if (WM_Override)
    {
      if (bitRead(Port5,4))
        ReefAngel.Relay.On(Port6);
      else
        ReefAngel.Relay.Off(Port6);
      
      if (bitRead(Box1_Port5,4))
        ReefAngel.Relay.On(Box1_Port6);
      else
        ReefAngel.Relay.Off(Box1_Port6);
    }
    else
    {
        ReefAngel.Relay.Off(Port6);
        ReefAngel.Relay.Off(Box1_Port6);
    }
  } 

  if ( ReefAngel.Timer[2].IsTriggered() )
  {
    WM_Override=false;
  }
}
Roberto.
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Re: Custom wavemaker code

Post by maxxdog21 »

Yep, that did it, it fixed the menu screen. However, it seems that when I hit the buttom for the "turbulant water", all the pumps shut off. I looked at the code and it seems that this section might not be right?

ReefAngel.Timer[1].SetInterval(random(15,90));
ReefAngel.Timer[1].Start();
ReefAngel.Relay.Toggle(Port5);
ReefAngel.Relay.Toggle(Box1_Port5);
if (WM_Override)
{
if (bitRead(Port5,4))
ReefAngel.Relay.On(Port6);
else
ReefAngel.Relay.Off(Port6);

if (bitRead(Box1_Port5,4))
ReefAngel.Relay.On(Box1_Port6);
else
ReefAngel.Relay.Off(Box1_Port6);
}
else
{
ReefAngel.Relay.Off(Port6); <------------ is this right? these 2 lines are repeats of the
ReefAngel.Relay.Off(Box1_Port6); <------------- and this? 2 lines above? Maybe shutting
} <---------------- off all pumps.
}

if ( ReefAngel.Timer[2].IsTriggered() )
{
WM_Override=false;
}
}

Thanks for fixing the menu screen.
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom wavemaker code

Post by rimai »

No. Those lines are to turn Port6 and Box1_Port6 when you are not in turbulent mode.
WM_Override is what determines the turbulent mode.
I think the 2 things I did wrong were to put the timer to 60s instead of 60 minutes and also turn the wrong port initially.
Try this one:

Code: Select all

/* The following features are enabled for this PDE File: 
#define DisplayLEDPWM
#define RelayExp
#define wifi
#define VersionMenu
#define PWMEXPANSION
#define CUSTOM_MENU
#define CUSTOM_MENU_ENTRIES  4
#define CUSTOM_MAIN
#define NUMBERS_8x16
#define COLORS_PDE
*/


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

#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Feeding Time";
prog_char menu1_label[] PROGMEM = "Water Change";
prog_char menu2_label[] PROGMEM = "Lights On";
prog_char menu3_label[] PROGMEM = "Turbulent water";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label};

boolean WM_Override=false;

void MenuEntry1()
{
      //ReefAngel.DisplayMenuEntry("Feeding Time");
      ReefAngel.FeedingModeStart();
}
void MenuEntry2()
{
      //ReefAngel.DisplayMenuEntry("Water Change");
      ReefAngel.WaterChangeModeStart();
}
void MenuEntry3()
{
     //ReefAngel.DisplayMenuEntry("Lights On");
     ReefAngel.Relay.RelayMaskOn|=B00000001; //Override Lights On;
     ReefAngel.DisplayedMenu=RETURN_MAIN_MODE;
}

void MenuEntry4()
{
     //ReefAngel.DisplayMenuEntry("Turbulent water");
     WM_Override=true;
     ReefAngel.Timer[2].Start();
     ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}


byte PWMChannel[]={
  0,0,0,0,0,0};
  
void DrawCustomMain()
{
  //Top Banner
  ReefAngel.LCD.DrawText(COLOR_BLACK, COLOR_SKYBLUE, 9, 2, " Harry's 120H Reef "); 
  ReefAngel.LCD.DrawDate(6, 123);
  pingSerial();

  // Display Temp Text
  ReefAngel.LCD.DrawText(0,255,8,12,"Temp");
  
  // Display the T1 temp value
  char text[7];
  ConvertNumToString(text, ReefAngel.Params.Temp1, 10);
  ReefAngel.LCD.Clear(255, 4, 22, 37, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 4, 22, text, Num8x16);
  pingSerial();

// Display Salt Text
  ReefAngel.LCD.DrawText(0,255,54,12,"Salt");
  
  // Display Salt Value
  ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
  ReefAngel.LCD.Clear(255, 52, 22, 75, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 52, 22, text, Num8x16);
  pingSerial();

  // Display pH Text
  ReefAngel.LCD.DrawText(0,255,112,12,"pH");
  
  // Display pH Value
  ConvertNumToString(text, ReefAngel.Params.PH, 100);
  ReefAngel.LCD.Clear(255, 94, 22, 106, 38);
  ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE, 255, 94, 22, text, Num8x16);
  pingSerial();

  
// Display Actinic Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,40,"Blue LED %");

// Display Actinic Percentage Value
   ConvertNumToString(text, PWMChannel[1], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 40, text);
   pingSerial();  

// Display Daylight Percentage Text
  ReefAngel.LCD.DrawText(0,255,8,50,"White LED %");

// Display Daylight Percentage Value
   ConvertNumToString(text, PWMChannel[0], 1);
   strcat(text,"  ");
   ReefAngel.LCD.DrawText(0, 255, 80, 50, text);
   pingSerial();

// Display Moonlight Phase Text
  ReefAngel.LCD.DrawText(0,255,8,60,"Moonlight ");

// Display Moonlight Phase Value
  ConvertNumToString(text, PWMChannel[2], 1);
  strcat(text,"  ");
  ReefAngel.LCD.DrawText(0, 255, 80, 60, text);
  pingSerial();


  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(13, 97, TempRelay);
  pingSerial();

  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox(13, 109, TempRelay);
  pingSerial();
  

}
void DrawCustomGraph()
{
}

void setup()
{
  ReefAngel.Init();  //Initialize controller
  ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));

  ReefAngel.FeedingModePorts = B00110000;
  ReefAngel.FeedingModePortsE[0] = B00110000;
  ReefAngel.WaterChangePorts = B00111100;
  ReefAngel.WaterChangePortsE[0] = B00110011;
  ReefAngel.OverheatShutoffPorts = B00000011;
  ReefAngel.LightsOnPorts = B00011110;

  // Ports that are always on
  ReefAngel.Relay.On(Port3);
  ReefAngel.Relay.On(Port4);
  ReefAngel.Relay.On(Box1_Port1);
  ReefAngel.Relay.On(Box1_Port2);

  // Wavemaker timer
  ReefAngel.Timer[1].SetInterval(random(15,90));
  ReefAngel.Timer[1].Start();
  // Turbulent Water Timer
  ReefAngel.Timer[2].SetInterval(3600);
  ReefAngel.Timer[2].Start();
  
  ReefAngel.Relay.On(Port5);

}

void loop()
{   
  ReefAngel.ShowInterface();

  // Specific functions

  // T5 White
  ReefAngel.StandardLights(Port1,10,30,20,0);
  
  //T5 Blue
  ReefAngel.StandardLights(Port2,9,30,20,45);
  
  //LED Blue
  ReefAngel.StandardLights(Port7,9,0,21,15);
  
  //LED White
  ReefAngel.StandardLights(Port8,10,0,20,30);
  
  //Heater
  ReefAngel.StandardHeater(Box1_Port3,773,783);
  
  //Refugium
  ReefAngel.StandardLights(Box1_Port4,21,0,7,0);
  
  //Fan
  ReefAngel.StandardLights(Box1_Port7,8,30,21,0);
  
  //LED Moonlight
  ReefAngel.StandardLights(Box1_Port8,20,45,7,30);
  
  // Channel 0 = White
  PWMChannel[0]=PWMSlope(10,0,20,30,0,100,30,PWMChannel[0]); // calculate slope %
  // Channel 1 = Blue
  PWMChannel[1]=PWMSlope(9,0,21,15,0,100,30,PWMChannel[1]); // calculate slope %
  // Channel 2= Moonlights
  PWMChannel[2]=MoonPhase(); // calculate moon phase %

  // this section sends the data to the PWM expansion module
  for (int a=0;a<4;a++)
    ReefAngel.PWM.Expansion(a,int(2.55*PWMChannel[a]));

  // Wavemaker
  if ( ReefAngel.Timer[1].IsTriggered() )
  {
    ReefAngel.Timer[1].SetInterval(random(15,90));
    ReefAngel.Timer[1].Start();
    ReefAngel.Relay.Toggle(Port5);
    ReefAngel.Relay.Toggle(Box1_Port5);
    if (WM_Override)
    {
      if (bitRead(Port5,4))
        ReefAngel.Relay.On(Port6);
      else
        ReefAngel.Relay.Off(Port6);
      
      if (bitRead(Box1_Port5,4))
        ReefAngel.Relay.On(Box1_Port6);
      else
        ReefAngel.Relay.Off(Box1_Port6);
    }
    else
    {
        ReefAngel.Relay.Off(Port6);
        ReefAngel.Relay.Off(Box1_Port6);
    }
  } 

  if ( ReefAngel.Timer[2].IsTriggered() )
  {
    WM_Override=false;
  }
}
Roberto.
maxxdog21
Posts: 34
Joined: Thu Dec 08, 2011 3:19 pm

Re: Custom wavemaker code

Post by maxxdog21 »

Thanks Roberto. I will try it out on Thursday when I get home. I hope it works - it's a real pain to have to plug/unplug the power heads for a little extra water action.
Post Reply