Custom wavemaker code
-
maxxdog21
- Posts: 34
- Joined: Thu Dec 08, 2011 3:19 pm
Custom wavemaker code
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!
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
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):
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
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
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
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
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.
Thanks.
-
rimai
- Posts: 12857
- Joined: Fri Mar 18, 2011 6:47 pm
Re: Custom wavemaker code
You missed one very important line in your code:
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
ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
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
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.
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
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:
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
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.