http://forum.reefangel.com/viewtopic.php?p=42105#p42105
So, I decided to create a tutorial page, so we can find it easy for future reference
The problem:
I've tried all different versions of stand pipe and they all have something in common... You must inject air into the drain pipe to avoid full siphon. I doesn't matter which one you use. You will always end up with cascading noise, even if it is minimal and a lot of bubbles in your sump.
I only have one drain pipe, so I can't really use those full siphon version with 3 pipes.
The solution:
Use a Reef Angel coupled with a water level expansion and a Speedwave pump to control the flow of your drain based on the overflow water level, so you have a dead silent drain pipe
Don't mind the mess... Here is a video:
[youtube]http://www.youtube.com/watch?v=r15TTX-KHZw[/youtube]
And here is the code I was using:
Code: Select all
#include <Salinity.h>
#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 <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
#define Level 50
#define MinPWM 50
#define OperatingPWM 66
long nummillis=5000;
byte PWMValue=0;
unsigned long lastmillis=millis();
boolean override=false;
void setup()
{
ReefAngel.Init(); //Initialize controller
InternalMemory.WaterLevelMax_write(1800);
}
void loop()
{
PWMValue=OperatingPWM;
if (ReefAngel.WaterLevel.GetLevel()<Level-2)
{
override=true;
lastmillis=millis();
PWMValue+=2;
}
if (ReefAngel.WaterLevel.GetLevel()>Level+2)
{
override=true;
lastmillis=millis();
PWMValue-=2;
}
if (millis()-lastmillis>nummillis && override)
{
override=false;
}
if (!override) PWMValue=OperatingPWM;
if (ReefAngel.WaterLevel.GetLevel()>Level+10) PWMValue=MinPWM;
PWMValue=constrain(PWMValue,MinPWM,100);
ReefAngel.PWM.SetActinic(PWMValue);
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
// the graph is drawn/updated when we exit the main menu &
// when the parameters are saved
ReefAngel.LCD.DrawDate(6, 122);
pingSerial();
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor(15, 60, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue());
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor(15, 60, ReefAngel.Params);
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
char text[10];
ConvertNumToString(text, ReefAngel.WaterLevel.GetLevel(), 1);
strcat(text," ");
ReefAngel.LCD.DrawText(DefaultFGColor,DefaultBGColor,15,93,"Water Level:");
ReefAngel.LCD.DrawText(DefaultFGColor,DefaultBGColor,88,93,text);
pingSerial();
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 103, TempRelay);
}
void DrawCustomGraph()
{
ReefAngel.LCD.DrawGraph(5, 5);
}