While i'm fine with the dosing every hour or 2 hours for calcium I would like to set it up so it only doses alk between midnight and 9am to help balance ph swings. I have the brs dosers which at 1.1ml a min are very slow so i dont really need to break up my dosing so much.
Also am working on code for nutrient transport mode, i have seen the examples where people put it on right after feeding mode ends, but i would like to wait 30 mins after feeding, then do NT mode so that LPS has a chance to digest its food before the vortechs blow it away from them
Only other plan i have is to get the water level expansion and use it to implement an automatic water change as follows:
start water change mode (return pump and skimmer off)
wait 5 mins for sump level to stabilize with pumps off
read value of water level using expansion, store to variable
turn on water removal pump into bucket with float switch
when float switch activates shut off removal pump
start new water pump to add fresh salt water
when water level expansion level = water level variable stored before removal started turn off new water pump
exit water change mode
here is my ino/pde code
Code: Select all
#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
////// Place global variable code below here
byte vtechmode;
////// Place global variable code above here
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
// Ports toggled in Feeding Mode (return, skimmer and closed loop pumps)
ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port6Bit;
ReefAngel.FeedingModePortsE[0] = Port1Bit;
// Ports toggled in Water Change Mode (return and skimmer)
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit;
ReefAngel.WaterChangePortsE[0] = 0;
// Ports turned off when Overheat temperature exceeded (turn off daylights leave actinics on)
ReefAngel.OverheatShutoffPorts = Port4Bit;
ReefAngel.OverheatShutoffPortsE[0] = 0;
// Use T2 probe as temperature and overheat functions (T2 is display tank temp
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T2_PROBE;
// Ports that are always on
ReefAngel.Relay.On( Port1 );
ReefAngel.Relay.On( Port6 );
ReefAngel.Relay.On( Box1_Port1 );
ReefAngel.Relay.On( Box1_Port6 );
ReefAngel.Relay.On( Box1_Port7 );
ReefAngel.Relay.On( Box1_Port8 );
////// Place additional initialization code below here
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.Relay.DelayedOn( Port2 );//skimmer
ReefAngel.ActinicLights( Port3 );
ReefAngel.DayLights( Port4 );
ReefAngel.StandardHeater( Port5 );//sump heater
ReefAngel.MoonLights( Port7 );//moonlights
ReefAngel.MoonLights( Port8 );//fuge light
ReefAngel.StandardHeater( Box1_Port2 );//display heater
ReefAngel.StandardFan( Box1_Port3 );//cooling fan
ReefAngel.DosingPumpRepeat1( Box1_Port4 );//alk doser
ReefAngel.DosingPumpRepeat2( Box1_Port5 );//cal doser
ReefAngel.RF.UseMemory = true;
////// Place your custom code below here
//sets nightmode on vortech pumps
if ( (hour() >= 23) || (hour() <= 11) ) // from 11p - 11a
{
ReefAngel.RF.UseMemory=false;
ReefAngel.RF.SetMode(Night,15,0);
vtechmode = 9;
}
else
{
ReefAngel.RF.UseMemory=true;
vtechmode = InternalMemory.RFMode_read();
}
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "fwadiver" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
byte x = 6;
byte y = 2;
byte t;
char text[7];
// Parameters
// Date and Time
ReefAngel.LCD.DrawDate(6, 2);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();
//vortech Display
ReefAngel.LCD.DrawText(0,255,18,12,"EcoSmart Vortech");
if (vtechmode == 0) ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN,255,35,22,"Constant");
else if(vtechmode == 1) ReefAngel.LCD.DrawLargeText(COLOR_GOLD,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 == 5) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255,8,21,"Nutrient Trnsp.");
else if (vtechmode == 6) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255,23,21,"Tidal Swell");
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.Temp[T3_PROBE], 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();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 77, TempRelay);
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 100, TempRelay );
pingSerial();
ReefAngel.LCD.DrawText(0,255,8,68,"Sump");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T1_PROBE], COLOR_CORNFLOWERBLUE, 40, 68, 10);
ReefAngel.LCD.DrawText(0,255,70,68,"Room");
ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T2_PROBE], COLOR_CORNFLOWERBLUE, 99, 68, 10);
}
void DrawCustomGraph()
{
}