Help with code

Share you PDE file with our community
Post Reply
Drs1210

Help with code

Post by Drs1210 »

I recently noticed that my wp-40 was not on. I looked at my screen and it said it was at 0%. If I unplug the RA and plug it back it, it's fine. This has happened twice so far. Anybody else have this issue or know what might be wrong?

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

// Define Relay Ports by Name
#define KalkDoser          1
#define WCEmpty            2
#define Autotopoff         3
#define Refugium           4
#define KalkStirrer        5
#define WCFill             6
#define Heater             7
#define Return             8

#define RODIValve          Box1_Port1
#define Skimmer            Box1_Port2
#define Unused             Box1_Port3
#define Unused             Box1_Port4
#define Unused             Box1_Port5
#define Unused             Box1_Port6
#define Unused             Box1_Port7
#define Unused             Box1_Port8

////// Place global variable code below here
byte wpMode;
int WCstatus;
////// Place global variable code above here
void setup()
{
  // This must be the first line
  InternalMemory.LCDID_write(0);
  ReefAngel.Init();  //Initialize controller
  ReefAngel.AddDateTimeMenu(); 
  ReefAngel.AddStandardMenu();  // Add Standard Menu
  ReefAngel.PHMin=546;//PH7.0
  ReefAngel.PHMax=734;//PH10.0
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = 0;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port3Bit | Port7Bit | Port8Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = Port4Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port7Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 810 );
  ReefAngel.Timer[1].SetInterval(180);

  // Ports that are always on
  ReefAngel.Relay.On( Return ); // Return Pump
  ReefAngel.Relay.On( Skimmer ); // Skimmer

    ////// Place additional initialization code below here
  ////// Place additional initialization code above here
}
void loop()
{
  ////// Place your custom code below here
  CheckPower();           // Monitor for power outages

  ReefAngel.PWM.SetChannel( 0, PWMSlope(9,30,21,30,17,100,60,0) );
  ReefAngel.PWM.SetChannel( 1, PWMSlope(9,30,21,30,17,100,60,0) );
  ReefAngel.PWM.SetChannel( 2, PWMSlope(9,30,21,30,17,100,60,0) );
  ReefAngel.PWM.SetChannel( 3, PWMSlope(9,30,21,30,17,100,60,0) );
  ReefAngel.PWM.SetChannel( 4, PWMSlope(9,30,21,30,17,100,60,0) );
  ReefAngel.PWM.SetChannel( 5, PWMSlope(9,30,21,30,17,100,60,0) );

  ReefAngel.WaterLevelATO(Port3,120,43,45);
  if (ReefAngel.LowATO.IsActive()) ReefAngel.Relay.On(RODIValve);
  if (!ReefAngel.HighATO.IsActive()) ReefAngel.Relay.Off(RODIValve);
  ReefAngel.DosingPumpRepeat( Port1,0,45,6 );
  if (ReefAngel.Params.PH>=850) ReefAngel.Relay.Off(KalkDoser);
  ReefAngel.StandardLights( Port4,20,0,8,0 );
  ReefAngel.Relay.Set(Port5,now()%7200<900);
  ReefAngel.StandardHeater( Port7,780,785 );

    if (hour()>=6 && hour()<8)
    {
      ReefAngel.PWM.SetDaylight( TidalSwellMode(70,true) ); // Tidal Swell at 70% on sync mode
      ReefAngel.PWM.SetActinic( TidalSwellMode(70,false) ); // Tidal Swell at 70% on anti-sync mode
      wpMode=0;
    }

    else if (hour()>=8 && hour()<9)
    {
      ReefAngel.PWM.SetDaylight( ReefCrestMode(65,20,true) ); // ReefCrest at 65% +/- 20 on sync mode
      ReefAngel.PWM.SetActinic( ReefCrestMode(65,20,false) ); // ReefCrest at 65% +/- 20 on anti-sync mode
      wpMode=1;
    }

    else if (hour()>=9 && hour()<13)
    {
      ReefAngel.PWM.SetDaylight( ElseMode(60,30,true )); // ElseMode on sync mode, 60 +/- 30%
      ReefAngel.PWM.SetActinic( ElseMode(60,30,false )); // ElseMode on anti-sync mode, 60 +/- 30%
      wpMode=3;
    }

    else if (hour()>=13 && hour()<16)
    {
      ReefAngel.PWM.SetDaylight( NutrientTransportMode(75,90,2000,true) ); // Nutrient Transport on sync mode
      ReefAngel.PWM.SetActinic( NutrientTransportMode(75,90,2000,false) ); // Nutrient Transport on anti-sync mode
      wpMode=2;
    }

    else if (hour()>=16 && hour()<20)
    {
      ReefAngel.PWM.SetDaylight( ElseMode(60,30,true )); // ElseMode on sync mode, 60 +/- 30%
      ReefAngel.PWM.SetActinic( ElseMode(60,30,false )); // ElseMode on anti-sync mode, 60 +/- 30%
      wpMode=3;
    }

    else if (hour()>=20 && hour()<21)
    {
      ReefAngel.PWM.SetDaylight( ReefCrestMode(65,20,true) ); // ReefCrest at 65% +/- 20 on sync mode
      ReefAngel.PWM.SetActinic( ReefCrestMode(65,20,false) ); // ReefCrest at 65% +/- 20 on anti-sync mode
      wpMode=1;
    }

    else if (hour()>=21 && hour()<23)
    {
      ReefAngel.PWM.SetDaylight( TidalSwellMode(70,true) ); // Tidal Swell at 70% on sync mode
      ReefAngel.PWM.SetActinic( TidalSwellMode(70,false) ); // Tidal Swell at 70% on anti-sync mode
      wpMode=0;
    }

    else
    {
      ReefAngel.PWM.SetDaylight( SineMode(40,55,30,true) ); // Sine at 40% 55% with for 30s on sync mode
      ReefAngel.PWM.SetActinic( SineMode(40,55,30,false) ); // Sine at 40% 55% with for 30s on anti sync mode
      wpMode=4;
    }

  if (ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
  {
    if (WCstatus==-1) 
    {
      ReefAngel.Timer[1].Start();
      WCstatus=0;
    }
    if ( ReefAngel.Timer[1].IsTriggered() )
    {
      ReefAngel.Relay.On(WCEmpty);
      WCstatus=1;
    }
    if (ReefAngel.WaterLevel.GetLevel()<=15 && WCstatus>0 && WCstatus<10) WCstatus++;
    if (ReefAngel.WaterLevel.GetLevel()<=15 && WCstatus==10)
    {
      WCstatus=11;
      ReefAngel.Relay.Off(WCEmpty);
      ReefAngel.Relay.On(WCFill);
    }
    if (ReefAngel.WaterLevel.GetLevel()<=81 && WCstatus>10 && WCstatus<20) WCstatus++;
    if (ReefAngel.WaterLevel.GetLevel()>81 && WCstatus==20) 
    {
      ReefAngel.Relay.Off(WCFill);
      ButtonPress++;
    }
  }
  else 
  {
    WCstatus=-1;
    ReefAngel.Relay.Off(WCEmpty);
    ReefAngel.Relay.Off(WCFill); 
  } 
  ReefAngel.Portal("Drs1210");
  ReefAngel.ShowInterface(); // Display everything on the LCD screen
}
void CheckPower() {
  static boolean powerOutage=false;


  // Power Outage - turn off everything
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) // Expansion Relay NOT present
  {
    powerOutage=true;
    ReefAngel.Relay.Off(KalkDoser); 
    ReefAngel.Relay.Off(WCEmpty); 
    ReefAngel.Relay.Off(Refugium); 
    ReefAngel.Relay.Off(KalkStirrer);
    ReefAngel.Relay.Off(WCFill);
    ReefAngel.Relay.Off(Heater);
    ReefAngel.Relay.Off(RODIValve); 
    ReefAngel.Relay.Off(Skimmer); 

  }

  // Power Restored - Turn things back on
  if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    LastStart=now();
    powerOutage=false;
    ReefAngel.Relay.On(Return); 
    ReefAngel.Relay.On(Skimmer); 

  }
}
void DrawCustomMain()
{
  byte x = 6;
  byte y = 2;
  byte t;
  char text[7];

  ReefAngel.LCD.DrawDate(6, 3);
  ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
  pingSerial();

  ReefAngel.LCD.DrawText(COLOR_BLACK,255,56,83, "Res");
  ReefAngel.LCD.DrawText(COLOR_GREEN,255, 45, 83, "H");
  ReefAngel.LCD.DrawText(COLOR_GREEN,255, 45, 91, "I");
  ReefAngel.LCD.DrawText(COLOR_RED,255, 77, 83, "L");
  ReefAngel.LCD.DrawText(COLOR_RED,255, 77, 91, "O");

  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 75, "--------------------");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 6, 98, "--------------------");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 78, "|");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 86, "|");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 2, 95, "|");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 78, "|");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 86, "|");
  ReefAngel.LCD.DrawText(COLOR_TOMATO,255, 126, 95, "|");

  ReefAngel.LCD.DrawText(0,255,10,30,"Tank");
  ConvertNumToString(text, ReefAngel.Params.Temp[T1_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, 91, 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();

  ReefAngel.LCD.DrawText(0,255,8,68,"WC");
  ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T3_PROBE], COLOR_CHOCOLATE, 25, 68, 10);
  pingSerial();

  ReefAngel.LCD.DrawText(0,255,66,68,"Room");
  ReefAngel.LCD.DrawSingleMonitor(ReefAngel.Params.Temp[T2_PROBE], COLOR_MEDIUMORCHID, 94, 68, 10);
  pingSerial();

  ReefAngel.LCD.DrawText(0,255,15,83,"WL");
  ConvertNumToString(text, ReefAngel.WaterLevel.GetLevel(),1);
  ReefAngel.LCD.DrawLargeText(COLOR_BLUE, 255, 10, 91, text, Num8x8);
  ReefAngel.LCD.DrawText(0,255,26,91," %");
  pingSerial();

  // WP40 Mode

  ReefAngel.LCD.DrawText(0,255,18,12,"Jebao WP40 Mode:");
  ReefAngel.LCD.Clear(COLOR_WHITE, 1, 21, 132, 21); 
  if (wpMode == 0) ReefAngel.LCD.DrawLargeText(COLOR_LIMEGREEN,255, 23, 21,"Tidal Swell");
  else if (wpMode == 1) ReefAngel.LCD.DrawLargeText(COLOR_MAGENTA,255, 25, 21,"Reef Crest");
  else if (wpMode == 2) ReefAngel.LCD.DrawLargeText(COLOR_GOLD,255, 8, 21,"Nutrient Trnsp.");
  else if (wpMode == 3) ReefAngel.LCD.DrawLargeText(COLOR_CORNFLOWERBLUE,255, 30, 21,"Else Mode");
  else if (wpMode == 4) ReefAngel.LCD.DrawLargeText(COLOR_RED,255, 30, 21,"Sine Mode");

  ReefAngel.LCD.DrawText(0,255,96,83,"WP40");
  ConvertNumToString(text, ReefAngel.PWM.GetActinicValue(),1);
  ReefAngel.LCD.DrawLargeText(COLOR_OLIVE, 255, 99, 91, text, Num8x8);
  ReefAngel.LCD.DrawText(0,255,115,91," %");
  pingSerial();

  // Main Relay box
  byte TempRelay = ReefAngel.Relay.RelayData;
  TempRelay &= ReefAngel.Relay.RelayMaskOff;
  TempRelay |= ReefAngel.Relay.RelayMaskOn;
  ReefAngel.LCD.DrawOutletBox(14, 106, TempRelay);
  pingSerial();

  // Relay Expansion
  TempRelay = ReefAngel.Relay.RelayDataE[0];
  TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
  TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
  ReefAngel.LCD.DrawOutletBox( 14, 118, TempRelay );
  pingSerial();

  if (ReefAngel.HighATO.IsActive())
    ReefAngel.LCD.FillCircle(57,94,3,COLOR_RED);
  else
    ReefAngel.LCD.FillCircle(57,94,3,COLOR_GREEN);

  if (ReefAngel.LowATO.IsActive())
    ReefAngel.LCD.FillCircle(70,94,3,COLOR_RED);
  else
    ReefAngel.LCD.FillCircle(70,94,3,COLOR_GREEN);

}
void DrawCustomGraph()
{
}

byte ElseMode( byte MidPoint, byte Offset, boolean WaveSync )
{
  // Static's only initialize the first time they are called
  static unsigned long LastChange=millis();        // Set the inital time that the last change occurred
  static int Delay = random( 500, 3000);           // Set the initial delay
  static int NewSpeed = MidPoint;                  // Set the initial speed
  static int AntiSpeed = MidPoint;                 // Set the initial anti sync speed
  if ((millis()-LastChange) > Delay)               // Check if the delay has elapsed
  {
    Delay=random(500,5000);                        // If so, come up with a new delay
    int ChangeUp = random(Offset);                 // Amount to go up or down
    if (random(100)<50)                            // 50/50 chance of speed going up or going down
    {
      NewSpeed = MidPoint - ChangeUp;
      AntiSpeed = MidPoint + ChangeUp;
    }
    else
    {
      NewSpeed = MidPoint + ChangeUp;
      AntiSpeed = MidPoint - ChangeUp;
    }
    LastChange=millis();                           // Reset the time of the last change
  }
  if (WaveSync)
  {
    return NewSpeed;
  }
  else
  {
    return AntiSpeed;
  }
}
Drs1210

Re: Help with code

Post by Drs1210 »

Anybody? It happened again today but this time it was stuck on 20%. It seems like it happens when it's on nutrient transport mode.
jjdezek
Posts: 329
Joined: Fri May 17, 2013 1:35 pm

Re: Help with code

Post by jjdezek »

It sounds like its going down below the20% and causing it to freeze. They don't like to run that low I guess, pretty common issue.
Image
Drs1210

Re: Help with code

Post by Drs1210 »

I didn't think I had it running that low on any of my modes.
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Help with code

Post by lnevo »

Where are you seeing it stuck at 20%
Drs1210

Re: Help with code

Post by Drs1210 »

On the RA head unit. It was also stuck on 0% a couple of times too. I assume it has to do with the controller because if I unplug it and plug it back in it goes back to normal operation.
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: Help with code

Post by rimai »

Did you have port4 overriden on by any chance?
The 0% may be just the mode.
NTM does leave the pump at 0% for a short period. I think for 10minutes or so.
I can't remember exactly how long.
Pay attention to what time it was an which mode you were running.
Roberto.
Drs1210

Re: Help with code

Post by Drs1210 »

No I dont thinks so. That would make sense since it was on NTM at the time. Does it also leave it at 20% for awhile too?
Post Reply