so its my first week with RA, and so far im loving it.
Im just struggling to get to grips with the programming stuff (I am technical, but suck at programming - I just space out, lol)
I need some help and understanding here:
1) Where do i specify that i am using moonlights? I tried to copy and paste some code (from here http://forum.reefangel.com/viewtopic.php?f=12&t=1160) and it gave me an error along the lines of "Moonphase is not defined"
2) How do i change vortech mode from the webserver/portal?
3) Please look over my code and tell me if it looks wrong to you
I pretty much need to control my Vortech mode (from iphone or wifi or portal, matters not) be able to use feed and waterchange modes (works everywhere except for from the headunit itself) and set moonlights.
Heaters etc should be pretty straightforward?
My code:
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 <avr/pgmspace.h>
#include <ReefAngel_Colors.h>
#include <ReefAngel_CustomColors.h>
#include <ReefAngel_Salinity.h>
#include <ReefAngel_RF.h>
#include <ReefAngel.h>
//*********************************************************************************************************************************
//Global Variables
byte vtechmode;
byte DayAge;
byte ThisPhase;
int JulianDate(int,int,int);
double MoonAge(int,int,int);
byte MoonState();
boolean bFeeding=false;
byte SeasonsVar[]={
0,0,0,0,0,0,0,0};
//End Global Variables
//*********************************************************************************************************************************
//*********************************************************************************************************************************
//Define Relay Ports
#define MH 1
#define MH 2
#define Heater 250 3
#define Heater 300 4
#define Tunze 5
#define Vortech 6
#define Skimmer 7
#define Return 8
//*********************************************************************************************************************************
//*********************************************************************************************************************************
//Custom Main, Graph & Menu
void DrawCustomMain()
{
Wire.requestFrom(8,8);
for (int a=0;a<8;a++)
{
if (Wire.available()) SeasonsVar[a]=Wire.receive();
}
byte x = 6;
byte y = 2;
byte t;
char text[7];
ReefAngel.LCD.DrawDate(6, 2);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 90, "--------------------");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 126, "--------------------");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 93, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 103, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 113, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 123, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 93, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 103, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 113, "|");
ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 123, "|");
ReefAngel.LCD.DrawText(0,255,18,12,"Vortech MP40W");
ReefAngel.LCD.Clear(255, 1, 19, 128, 29);
if (vtechmode == 0) ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN,255,35,21,"Constant");
else if(vtechmode == 1) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255,42,21,"Lagoon");
else if (vtechmode == 2) ReefAngel.LCD.DrawLargeText(COLOR_GOLD,255,25,21,"Reef Crest");
else if (vtechmode == 3) ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE,255,22,21,"Short Pulse");
else if (vtechmode == 4) ReefAngel.LCD.DrawLargeText(COLOR_PINK,255,25,21,"Long Pulse");
else if (vtechmode == 9) ReefAngel.LCD.DrawLargeText(COLOR_WHITE,0,45,21,"Night");
ReefAngel.LCD.DrawText(0,255,10,30,"Display");
ConvertNumToString(text, ReefAngel.Params.Temp3, 10);
ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 10, 40, text, Num8x8);
pingSerial();
ReefAngel.LCD.DrawText(0,255,100,30,"pH");
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_PLUM, 255, 85, 40, text, Num8x8);
pingSerial();
ReefAngel.LCD.DrawText(0,255,43,48,"Salinity");
ConvertNumToString(text, ReefAngel.Params.Salinity, 100);
ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN, 255, 49, 58, text, Num8x8);
pingSerial();
pingSerial();
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 77, TempRelay);
(ReefAngel.PWM.GetActinicValue() > 0)
{
ReefAngel.LCD.DrawText(0,255,8,97,"Moon");
DayAge = MoonAge(day(), month(), year());
MoonState(DayAge);
char* ThisPhaseLabel[]={
"New","Waxing Crescent","First Quarter","Waxing Gibbous","Full","Waning Gibbous","Last Quarter","Waning Crescent" };
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,35,97,ThisPhaseLabel[ThisPhase]);
}
void DrawCustomGraph()
{
}
//End Custom
//*********************************************************************************************************************************
void setup()
{
ReefAngel.Init();
ReefAngel.PHMin=502;
ReefAngel.PHMax=827;
ReefAngel.FeedingModePorts = B10100000;
ReefAngel.WaterChangePorts = B10101000;
ReefAngel.OverheatShutoffPorts = B01000000;
ReefAngel.LightsOnPorts = B00000000;
// Ports that are always on
ReefAngel.Relay.On(PowerCenter);
ReefAngel.Relay.On(Return);
ReefAngel.Relay.On(Reactors);
ReefAngel.Relay.On(LEDPSU);
ReefAngel.Relay.On(Refugium);
ReefAngel.Relay.On(Salinitypsu);
}
void loop()
{
//Heater on&off
ReefAngel.StandardHeater(Heater,780,792);
//Delay Skimmer
ReefAngel.Relay.DelayedOn(Skimmer, 5);
if (ReefAngel.DisplayedMenu==FEEDING_MODE) bFeeding=true;
}
if (ReefAngel.DisplayedMenu==DEFAULT_MENU && ReefAngel.Timer[4].IsTriggered())
{
ReefAngel.RF.UseMemory=true;
vtechmode = InternalMemory.RFMode_read();
}
if (hour() <= 6 && hour() >= 22)
{
ReefAngel.PWM.SetActinic(MoonPhase());
}
else
{
ReefAngel.PWM.SetActinic(0);
}
ReefAngel.ShowInterface();
}
int JulianDate(int d, int m, int y)
{
int mm, yy;
int k1, k2, k3;
int j;
yy = y - (int)((12 - m) / 10);
mm = m + 9;
if (mm >= 12)
{
mm = mm - 12;
}
k1 = (int)(365.25 * (yy + 4712));
k2 = (int)(30.6001 * mm + 0.5);
k3 = (int)((int)((yy / 100) + 49) * 0.75) - 38;
// 'j' for dates in Julian calendar:
j = k1 + k2 + d + 59;
if (j > 2299160)
{
// For Gregorian calendar:
j = j - k3; // 'j' is the Julian date at 12h UT (Universal Time)
}
return j;
}
double MoonAge(int d, int m, int y)
{
int j = JulianDate(d, m, y);
//Calculate the approximate phase of the moon
int ip = (j + 4.867) / 29.53059;
ip = ip - abs(ip);
//After several trials I've seen to add the following lines,
//which gave the result was not bad
if(ip < 0.5)
int ag = ip * 29.53059 + 29.53059 / 2;
else
int ag = ip * 29.53059 - 29.53059 / 2;
// Moon's age in days
byte ag = abs(ag) + 1;
return ag;
}
byte MoonState(byte D)
{
switch(D){
case 1:
0, 29;
ThisPhase = 0;
case 2:
1, 2, 3, 4, 5, 6;
ThisPhase = 1;
case 3:
7;
ThisPhase = 2;
case 4:
8, 9, 10, 11, 12, 13;
ThisPhase = 3;
case 5:
14;
ThisPhase = 4;
case 6:
15, 16, 17, 18, 19, 20, 21;
ThisPhase = 5;
case 7:
22;
ThisPhase = 6;
case 8:
23, 24, 25, 26, 27, 28;
ThisPhase = 7;
default:
return 0;
}
}