Edwin's Custom Reef Angel...

Do you have a question on how to do something.
Ask in here.
Post Reply
ecam
Posts: 229
Joined: Thu Nov 15, 2012 11:27 am

Edwin's Custom Reef Angel...

Post by ecam »

Hello, I was hoping to get some help from Lnevo on customizing my reef Angel, I currently have:

Tank:
120 Gallon (w 2 MP 40s)
57 galllon (w 1 MP 40)

Equipment:

RA+ with WiFi, RF expansion and 2 dosers.

My ports are
1 - return pump
2- refuge lights
3- T5 ballast
4 - Doser Alk
5 - Frag tank light (fantom LED Par 38)
6 - Doser Calc
7- Heater
8 - Skimmer

Problem #1 - Dosers

So I tested them out by running them for 10 mins into a 300 ml cup.

One pump filled the cup in 10 mins for a flow rate of .5ml/s
The other pump had a flow rate of .295ml/sec (178 ml in 10 mins (600 seconds)

I read that Lnevo can get the pumps to calibrate based on volume... So Im hoping he can help me calibrate the pumps...

Problem #2 - MP40s

As my tank setup I currently have 3 mp 40s, 2 in the 120 (pumps 1,2) an 1 in the 57 (pump 3)... I can only control the 2 in the 120 (i made all three slaves on the Ecotech). But the RF is not picking up the 3.

Ideally i would like to do the following:

- Run 1,2 in anti-synch mode
- Run 3 in Synch mode
- Have a custom menu where i can switch modes on the fly from my controller head or phone...

***FYI I cannot do internal memeory b\c my kids play with my phone too much and dont need them pressing buttons... So i just upload my code...

SO here is my code. Thanks in advance for all help



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>fa
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>

////// Place global variable code below here


////// Place global variable code above here


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    // Ports toggled in Feeding Mode
 ReefAngel.WaterChangePorts = Port1Bit | Port8Bit; // Turn off Ports 5 and 6 when Feeding Mode is activated
  ReefAngel.FeedingModePorts = Port1Bit | Port6Bit | Port8Bit; // Turn off Ports 1, 6, 7 and 8 when Water Change Mode is activated
  ReefAngel.LightsOnPorts = Port2Bit | Port3Bit | Port4Bit| Port5Bit;
  ReefAngel.OverheatShutoffPorts = Port2Bit |Port3Bit | Port4Bit | Port5Bit | Port7Bit; // Turn off Ports 3,
    ReefAngel.TempProbe = T3_PROBE;
    ReefAngel.OverheatProbe = T3_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 820 );

    // Setup ATO Port for AI communication
    ReefAngel.AI.SetPort( lowATOPin );


    // Ports that are always on
    ReefAngel.Relay.On( Port1 );


    ////// Place additional initialization code below here
    

    ////// Place additional initialization code above here
}

void loop()
{
    ReefAngel.Relay.Set( Port2, !ReefAngel.Relay.Status( Port5 ) );
    ReefAngel.StandardLights( Port3,11,0,16,0 );
    ReefAngel.StandardLights( Port4,11,0,20,0 );
    ReefAngel.StandardLights( Port5,9,0,19,0 );
    ReefAngel.StandardHeater( Port7,780,800 );
    ReefAngel.Relay.DelayedOn( Port8,2 ); //Skimmer
    ReefAngel.AI.SetChannel( White, PWMParabola(11,0,17,0,0,75,0) );
    ReefAngel.AI.SetChannel( Blue, PWMParabola(9,0,20,0,15,100,0) );
    ReefAngel.AI.SetChannel( RoyalBlue, PWMParabola(9,0,20,0,15,100,(MoonPhase()/5)<3 ? 3:MoonPhase()/5) );
    ReefAngel.RF.UseMemory = false;
    ReefAngel.RF.SetMode( ReefCrest,85,10 );
    ReefAngel.RF.SetChannel( Radion_White, PWMParabola(9,0,20,0,0,60,0) );
    ReefAngel.RF.SetChannel( Radion_RoyalBlue, MoonPhase() );
    ReefAngel.RF.SetChannel( Radion_Red, PWMParabola(9,0,20,0,15,65,15) );
    ReefAngel.RF.SetChannel( Radion_Green, PWMParabola(9,0,20,0,15,50,15) );
    ReefAngel.RF.SetChannel( Radion_Blue, MoonPhase() );
    ReefAngel.RF.SetChannel( Radion_Intensity, PWMParabola(9,0,20,0,15,94,15) );
    if ( second()==0 ) ReefAngel.RF.RadionWrite();


    ////// Place your custom code below here
    
    
ReefAngel.RF.UseMemory = false;
if (hour()>=6 && hour()<11)
  ReefAngel.RF.SetMode(ReefCrest,85,10);
else if (hour()>=11 && hour()<13)
  ReefAngel.RF.SetMode(ReefCrest,85,10);
else if (hour()>=13 && hour()<16)
  ReefAngel.RF.SetMode(Smart_NTM,85,15);
else if (hour()>=16 && hour()<19)
  ReefAngel.RF.SetMode(ReefCrest,65,10);
else
  ReefAngel.RF.SetMode(Lagoon,40,10);
         
     
        
    // Hardcode PH calibrations
     ReefAngel.PHMin=544; // PH7.0
     ReefAngel.PHMax=830; // PH10.0

    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "ecam" );
    ReefAngel.ShowInterface();
}

void DrawCustomMain()
{
    int x,y;
    char text[10];
    // Aqua Illumination
    x = 10;
    y = 20;
    ReefAngel.LCD.DrawText( COLOR_DODGERBLUE,DefaultBGColor,x,y,"WH:" );
    ReefAngel.LCD.DrawText( COLOR_DODGERBLUE,DefaultBGColor,x+38,y,"BL:" );
    ReefAngel.LCD.DrawText( COLOR_DODGERBLUE,DefaultBGColor,x+76,y,"RB:" );
    for ( int a=0;a<3;a++ )
    {
      ReefAngel.LCD.DrawText( COLOR_DODGERBLUE,DefaultBGColor,x+18,y,ReefAngel.AI.GetChannel(a) );
      x += 38;
    }
    pingSerial();

    // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
    ReefAngel.LCD.DrawMonitor( 15, 48, ReefAngel.Params,
    ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
    ReefAngel.LCD.DrawMonitor( 15, 48, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
    pingSerial();

    // Main Relay Box
    byte TempRelay = ReefAngel.Relay.RelayData;
    TempRelay &= ReefAngel.Relay.RelayMaskOff;
    TempRelay |= ReefAngel.Relay.RelayMaskOn;
    ReefAngel.LCD.DrawOutletBox( 12, 94, TempRelay );
    pingSerial();

    // Date and Time
    ReefAngel.LCD.DrawDate( 6, 122 );
    pingSerial();
}

void DrawCustomGraph()
{
}

User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Edwin's Custom Reef Angel...

Post by lnevo »

There may not be much we can do about the MP40 on the other tank? It may be too far away or getting interference?

No internal memory check. I'll post something you can try in a bit.
ecam
Posts: 229
Joined: Thu Nov 15, 2012 11:27 am

Re: Edwin's Custom Reef Angel...

Post by ecam »

Actually the tanks are side bysside. If that helps
lnevo wrote:There may not be much we can do about the MP40 on the other tank? It may be too far away or getting interference?

No internal memory check. I'll post something you can try in a bit.
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Edwin's Custom Reef Angel...

Post by lnevo »

Ok, a little trickier since you didn't want to use memory and I think this will be easier for anyone trying to integrate it.

Inside your loop() add these 2 functions:

Code: Select all

RunDosingPumps();
LogDosingPumps();
And add this to the bottom of your code. Look through the definition section to see how everything is defined.

Code: Select all

/////////////////////////////////////////
// Define Your dosing pumps
/////////////////////////////////////////
#define numDPumps 2
byte pumpRelays[numDPumps]={ Port4, Port6 };
int DPVolume[numDPumps]={ 30, 30 } ; // 30ml for each alk and calcium
int DPRepeat[numDPumps]={ 60, 60 } ; // Repeat every 60 miniutes
/////////////////////////////////////////
// Define Calibration here
/////////////////////////////////////////
int CalTime[numDPumps]={ 600, 600 }; // 10 minutes / 10 minutes
int CalVol[numDPumps]={ 300, 178 }; // 300ml / 178ml

/////////////////////////////////////////
// Function: RunDosingPumps()
/////////////////////////////////////////
void RunDosingPumps() {
  float rate;
  int calcTime[numDPumps];

  for (int i=0;i < numDPumps; i++) {
    rate=(float)CalVol[i]/CalTime[i];
    calcTime[i]=DPVolume[i]/rate/(1440/DPRepeat[i]);

    // Run the pumps 
    ReefAngel.DosingPumpRepeat(pumpRelays[i], i*5, DPRepeat[i], calcTime[i]); // Offset between each pump is 5 minutes
  }

  // Display Time calculated in portal
  ReefAngel.CustomVar[0]=calcTime[0];
  ReefAngel.CustomVar[1]=calcTime[1];
}

/////////////////////////////////////////
// Function: LogDosingPumps()
/////////////////////////////////////////
void LogDosingPumps() {
  static time_t pumpTimer[numDPumps];
  static boolean pumpStatus[numDPumps];
  float rate;

  for (int i=0;i< numDPumps;i++) {
    if (ReefAngel.Relay.Status(pumpRelays[i])) {
      if (!pumpStatus[i]) {
        pumpTimer[i]=now()-pumpTimer[i]; // Pump was off, timer is now a time
        pumpStatus[i]=true;
      }
    } else {
      if (pumpStatus[i]) {
        pumpTimer[i]=now()-pumpTimer[i]; // Pump was on, timer is now a timer
        pumpStatus[i]=false;
    
        rate=(float)CalVol[i]/CalTime[i];

        // Report How much volume has been dosed per day.
        // Could make this in minutes... excercise for the reader..
        ReefAngel.CustomVar[2]=pumpTimer[0]*rate;
        ReefAngel.CustomVar[3]=pumpTimer[1]*rate;  
      }
    }
  
    // Clear timer at end of day
    if (now()%SECS_PER_DAY==SECS_PER_DAY-1) pumpTimer[i]=0; 
  }  
}
In the portal you will see the time calculated for each run and in Custom0 and Custom1 and then you will see how much volume has been dosed since midnight in Custom2 and Custom3.

Good luck
ecam
Posts: 229
Joined: Thu Nov 15, 2012 11:27 am

Re: Edwin's Custom Reef Angel...

Post by ecam »

Lee, thanks for the code... A few questions
This part of code appears to be driven off of my observed flow rates.. I've checked the pump about 6 times (running for 10 mins) and I have gotten different flow rates each time....) The newest flow rates are .56ml/s and .48/mls.

is there a break-in period for the pumps? if so how long should I keep running them in test mode before I put them online. I dont want to put them on now and then they start delivering the advertsied speed which would lead to a system crash. Any suggestions on how to prevent this?



#define numDPumps 2
byte pumpRelays[numDPumps]={ Port4, Port6 };
int DPVolume[numDPumps]={ 30, 30 } ; // 30ml for each alk and calcium
int DPRepeat[numDPumps]={ 60, 60 } ; // Repeat every 60 miniutes
/////////////////////////////////////////
// Define Calibration here
/////////////////////////////////////////
int CalTime[numDPumps]={ 600, 600 }; // 10 minutes / 10 minutes
int CalVol[numDPumps]={ 300, 178 }; // 300ml / 178ml
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Edwin's Custom Reef Angel...

Post by lnevo »

Get new pumps or try changing the hoses. If its not accurate now and they are new I doubt they ever will be. You can't calibrate on a daily basis...

It's one thing for them to be off from the advertised rates, but they should still maintain their flow...I'm sure at this point there's no air in the lines...
Post Reply