Page 1 of 1

Multi-water level ATO dumping water when it shouldn't

Posted: Fri Jun 30, 2017 4:12 pm
by Smotz
Lo all,

Below is my code. My multi-water level module is giving me problems. It's activating the ATO when it shouldn't. It just dumped water from 110% to 130% for example.

The levels seem stable - about a 2% fluctuation.

Any idea how I can troubleshoot this?

Code: Select all

  if ( ReefAngel.WaterLevel.GetLevel(1) <=85 && ReefAngel.WaterLevel.GetLevel(2) <=85) ReefAngel.Relay.On (Topoff);
  if ( ReefAngel.WaterLevel.GetLevel(1) >=95 || ReefAngel.WaterLevel.GetLevel(2) >=95) ReefAngel.Relay.Off (Topoff);

  if ( ReefAngel.WaterLevel.GetLevel(1) >= 145 || ReefAngel.WaterLevel.GetLevel(2) >= 145 ) ReefAngel.Relay.Override(Topoff,0);

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sat Jul 01, 2017 10:28 pm
by rimai
Are you sure you don't have nothing else in your code that uses the same port?
Could it be that you overrode the port and forgot about it?

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sun Jul 02, 2017 7:03 am
by Smotz
here's the code if you care to look

Code: Select all

////  Port 1			Heater
////  Port 2			ATO pump
////  Port 3			Feeder
////  Port 4			Protein Skimmer
////  Port 5			Return Pump
////  Port 6			Wavemakers
////  Port 7                    UV Sterilizer
////  Port 8                    Cabinet Light

////  BOX 1 PORT 1              Calcium Doser
////  BOX 1 PORT 2              Alkalinity Doser
////  BOX 1 PORT 3              Media Reactor
////  BOX 1 PORT 8              Sump Fan
////  BOX 1 PORT 8              Fans

////  Probe T1  SUMP
////  Probe T2  Tank
////  Probe T3  Canopy


#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>
#include <DCPump.h>

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

#define Heater Port1
#define Topoff Port2
#define Feeder Port3
#define Skimmer Port4
#define Return Port5
#define Wave Port6
#define UVlight Port7
#define Fugelight Port8
#define CanopyFan  Box1_Port8
#define CalcDose  Box1_Port1
#define AlkDose  Box1_Port2
#define Reactor Box1_Port3
#define SumpFan  Box1_Port7


#define FugelightBit   1<<7
#define UVlightBit   1<<6
#define WaveBit   1<<5
#define ReturnBit   1<<4
#define SkimmerBit   1<<3
#define FeederBit   1<<2
#define TopoffBit   1<<1
#define HeaterBit   1<<0

static byte wpMode;
static byte wpWavStr;
static byte wpWavOff;
unsigned long NoteTime;

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

void setup()
{
// This must be the first line
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Use2014Screen(); // Let's use 2014 Screen 
    ReefAngel.AddMultiChannelWaterLevelExpansion();  // Multi-Channel Water Level Expansion Module
    ReefAngel.Network.WifiAuthentication("Smotz:xxxxxx");
    
// Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = SkimmerBit | ReturnBit | TopoffBit | UVlightBit ;
    ReefAngel.FeedingModePortsE[0] = FeederBit;  ////Reactor
// Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = HeaterBit | SkimmerBit | ReturnBit | TopoffBit | WaveBit | UVlightBit | FeederBit ;
    ReefAngel.WaterChangePortsE[0] = FeederBit; ///reactor
// Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = FugelightBit;
// Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = HeaterBit | TopoffBit | SkimmerBit | ReturnBit | WaveBit | UVlightBit | FeederBit | Reactor;
    ReefAngel.OverheatShutoffPortsE[0] = FeederBit; ////reactor

// Use T2 (Tank) probe as temperature and overheat functions
    ReefAngel.TempProbe = T2_PROBE;
    ReefAngel.OverheatProbe = T2_PROBE;

// Ports that are always off
    ReefAngel.Relay.Off( Feeder );
    ReefAngel.Relay.Off( Topoff );

// Ports that are always on
    ReefAngel.Relay.On( Box1_Port3 );
    ReefAngel.Relay.On( Box1_Port4 );    
    ReefAngel.Relay.On( Box1_Port5 );
    ReefAngel.Relay.On( Box1_Port6 );
    ReefAngel.Relay.On( Box1_Port7 );  

// DCPUMP
    ReefAngel.DCPump.FeedingSpeed=255;
    ReefAngel.DCPump.WaterChangeSpeed=0;
    ReefAngel.DCPump.ActinicChannel=Sync; 
    ReefAngel.DCPump.DaylightChannel=AntiSync; 
    ReefAngel.DCPump.Threshold=30; 
  ////// Place additional initialization code below here
    
  ////// Place additional initialization code above here
}

void loop()
{
    ReefAngel.Relay.On( Return );
    ReefAngel.Relay.On( Wave );
    ReefAngel.Relay.Off( Feeder );
    ReefAngel.MoonLights( Fugelight );
    ReefAngel.StandardHeater( Heater );
    ReefAngel.StandardFan( SumpFan );
    
////// Place your custom code below here

// Static bool to track if we are currently feeding or not
static boolean feedingActive = false;

//FEEDING MODE
// Begin Feeding Mode
      if (((hour() == 7)) && (minute() == 30) || (hour() == 18) && (minute() == 00)) {
          ReefAngel.FeedingModeStart(); // FEEDING MODE @ 7:30 AM or 6:00 PM
          NoteTime = millis(); // Grab millis value of when feeding mode started
          feedingActive = true; // We are entering feeding mode, so set to true
      }

      if (feedingActive) {
          unsigned long DeltaTS = millis() - NoteTime;
          if ( DeltaTS >= 130000 ) {
              ReefAngel.Relay.Off(Feeder); // turn off 2 minutes 10 secs
              feedingActive = false; // Feeding mode is now over, set to false
          } else
          if ( DeltaTS >= 120000 ) ReefAngel.Relay.On(Feeder); // turn on after 2 minutes
          else
          if ( DeltaTS >= 70000 ) ReefAngel.Relay.Off(Feeder); // turn off 1 min 10 secs 
          else
          if ( DeltaTS >= 60000 ) ReefAngel.Relay.On(Feeder); // turn on after 1 minute
      }
   
// Main Top Off
//   ReefAngel.WaterLevelATO(1,Topoff,15,85,95);  
  if ( ReefAngel.WaterLevel.GetLevel(1) <=85 && ReefAngel.WaterLevel.GetLevel(2) <=85) ReefAngel.Relay.On (Topoff);
  if ( ReefAngel.WaterLevel.GetLevel(1) >=95 || ReefAngel.WaterLevel.GetLevel(2) >=95) ReefAngel.Relay.Off (Topoff);

  if ( ReefAngel.WaterLevel.GetLevel(1) >= 145 || ReefAngel.WaterLevel.GetLevel(2) >= 145 ) ReefAngel.Relay.Override(Topoff,0);


//Dosing
   ReefAngel.DosingPumpRepeat1( CalcDose );
   ReefAngel.DosingPumpRepeat2( AlkDose );
//// 30,20 = 17.5 ml day
//// ReefAngel.DosingPumpRepeat(CalcDose,0,30,20);
//// ReefAngel.DosingPumpRepeat(AlkDose,10,30,20);

// Turn on Canopy Fans when the temp of T3 (Canopy) gets above 85.0 degrees
    if ( ReefAngel.Params.Temp[T3_PROBE] >= 850 ) ReefAngel.Relay.On( CanopyFan );
// Turn off Canopy Fans when the temp of T2 (Canopy) gets below 80.0 degrees
    if ( ReefAngel.Params.Temp[T3_PROBE] < 800 ) ReefAngel.Relay.Off( CanopyFan );
    
    ReefAngel.Relay.DelayedOn(Skimmer,5); 
    ReefAngel.Relay.DelayedOn(Reactor,2);
    
// Buzzer if temp is too high or low, or waterlevel 1 is too high or too low.
    if (ReefAngel.DisplayedMenu!=WATERCHANGE_MODE && ReefAngel.DisplayedMenu!=FEEDING_MODE) // Only check if not Feeding Mode or Water Change Mode
    {  
    if ( ReefAngel.Params.Temp[T2_PROBE] < 700 || ReefAngel.Params.Temp[T2_PROBE] > 850 || ReefAngel.WaterLevel.GetLevel(1) > 140 || ReefAngel.WaterLevel.GetLevel(1) < 70)
        {   
        pinMode(lowATOPin,OUTPUT);
        digitalWrite(lowATOPin,HIGH);
        }
        else
        {
        pinMode(lowATOPin,OUTPUT);
        digitalWrite(lowATOPin,LOW);
    }}

// Turn the fugelight on if the return is off 
    if (ReefAngel.Relay.Status ( Return ) == 0) ReefAngel.Relay.On( Fugelight );
  
 // Custom Wave Routine 
  if (InternalMemory.DCPumpMode_read()==11)  
  {
    ReefAngel.DCPump.UseMemory=false;
    // set the wpMode based on what time it is
    if (ReefAngel.DisplayedMenu==FEEDING_MODE) wpMode=5;   // Feeding Mode
    else 
      if ( (hour() >= 2) && (hour() < 8) ) wpMode=1;       // from 2am - 8am  
      else
        if ( (hour() >= 8) && (hour() < 11) ) wpMode=4;      // from 8am - 11am  Nutrient Transport
        else
          if ( (hour() >= 11) && (hour() < 14) ) wpMode=2;     // from 11a - 2pm
          else
            if ( (hour() >= 14) && (hour() < 17) ) wpMode=3;     // from 2pm - 5pm
            else
              if ( (hour() >= 17) && (hour() < 20) ) wpMode=2;     // from 5pm - 8pm
              else
                if ( (hour() >= 20) && (hour() < 23) ) wpMode=3;     // from 8pm - 11p
                else
                  if (hour() >= 23) wpMode=2;                          // from 11pm - midnight 
                  else
                    if (hour() < 2) wpMode=1;                            // from midnight - 2am

    switch (wpMode) 
    {
    case 1:  // 2am to 8am  Night Mode
      wpWavStr=35; 
      wpWavOff=10; 
      ReefAngel.DCPump.SetMode (Sine, wpWavStr, wpWavOff);
      break;

    case 2:  // 5am to 8am, 11am to 2pm, 5pm to 8pm, 11pm to midnight
      wpWavStr=45; 
      wpWavOff=3; 
      ReefAngel.DCPump.SetMode (Else, wpWavStr, wpWavOff);
      break;

    case 3:  // 2pm to 5pm, 8pm to 11pm
      wpWavStr=65; 
      wpWavOff=7; 
      ReefAngel.DCPump.SetMode (Else, wpWavStr, wpWavOff);
      break;

    case 4:  // 8am to 11am
      wpWavStr=70; 
      wpWavOff=10; 
      ReefAngel.DCPump.SetMode (NutrientTransport, wpWavStr,wpWavOff);
      break; 

    case 5:  //feeding mode
      wpWavStr=30;
      wpWavOff=3;
      ReefAngel.DCPump.SetMode (LongPulse, wpWavStr, wpWavOff);
      break; 
    }
  }
  else ReefAngel.DCPump.UseMemory = true;    //  If it's not custom mode on the portal, then do what mode the portal says.
  //  End Custom Wave Routine  

//  Only turn on UV Sterilizer between 11pm and 3am
    if ( (hour() >= 3) && (hour() < 23) )  // from 3a - 11p
    ReefAngel.Relay.Off(UVlight);
    else ReefAngel.Relay.On(UVlight);

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

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

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

//    Salinity
//    ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,20,80, "SAL:" );
//    ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,44,80, ReefAngel.Params.Salinity );
//    pingSerial();

// Main Relay Box
    byte TempRelay = ReefAngel.Relay.RelayData;
    TempRelay &= ReefAngel.Relay.RelayMaskOff;
    TempRelay |= ReefAngel.Relay.RelayMaskOn;
    ReefAngel.LCD.DrawOutletBox( 12, 95, TempRelay );
    pingSerial();
// Relay Expansion
    TempRelay = ReefAngel.Relay.RelayDataE[0];
    TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
    TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
    ReefAngel.LCD.DrawOutletBox( 12, 105, TempRelay );
    pingSerial();
// Date and Time
    ReefAngel.LCD.DrawDate( 6, 122 );
    pingSerial();
//draw the mode on the screen
    char buf[16];
    char buf2[16];
//    char buf3[32];
    sprintf(buf,"%d%% +/- %d%%",wpWavStr,wpWavOff);
    sprintf(buf2,"Wave Mode = %d%",wpMode);
//    sprintf(buf3,"Return Power = %d%",InternalMemory.LEDPWMActinic_read());
//    ReefAngel.LCD.DrawText(0,255,10,40,buf3);
    ReefAngel.LCD.DrawText(0,255,20,60,buf);
    ReefAngel.LCD.DrawText(0,255,20,50,buf2);
}

void DrawCustomGraph()
{
}

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sun Jul 02, 2017 8:09 am
by Smotz
To add - I just got a text alert that both water level 1 and 2 (I use both) are at 0. When I checked after getting the alert it was fine @ 98%.

..what can it be...how to test..

water level module?
water level tubes / pvc? probably not as both 1 & 2 tripped at the same time
expansion hub?
usb cables?

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sun Jul 02, 2017 1:42 pm
by rimai
Use this to prevent it from turning on when you get zeros.

Code: Select all

if ( ReefAngel.WaterLevel.GetLevel(1) <=85 && ReefAngel.WaterLevel.GetLevel(2) <=85 && ReefAngel.WaterLevel.GetLevel(1) >0 && ReefAngel.WaterLevel.GetLevel(2) >0) ReefAngel.Relay.On (Topoff);
I would start by checking the connections and usb cables.
Try a different port in the hub too.

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sun Jul 02, 2017 3:13 pm
by Smotz
rimai wrote:Use this to prevent it from turning on when you get zeros.

Code: Select all

if ( ReefAngel.WaterLevel.GetLevel(1) <=85 && ReefAngel.WaterLevel.GetLevel(2) <=85 && ReefAngel.WaterLevel.GetLevel(1) >0 && ReefAngel.WaterLevel.GetLevel(2) >0) ReefAngel.Relay.On (Topoff);
I would start by checking the connections and usb cables.
Try a different port in the hub too.

is there a way that I can monitor the water level live without refreshing?

Re: Multi-water level ATO dumping water when it shouldn't

Posted: Sun Jul 02, 2017 3:18 pm
by rimai
Only with the use of the cloud server, which requires the cloud wifi attachment or RA Star(coming soon).