Page 1 of 2

Detecting Expansion Relays

Posted: Sun May 13, 2012 4:35 pm
by dedvalson
Is it possible to determine if a relay box is missing from the RA code? I had a power failure and I would like to put my main RA box on a UPS but not put my Expansion box on one. That way the essential things could keep running but not the lights. But then I thought it would be awesome if I could make some decisions in my code based on the presence (or absence) of the expansion box. I figured that it was likely that the I2C would know that the box wasn't there so I thought I would ask.

Don

Re: Detecting Expansion Relays

Posted: Sun May 13, 2012 4:40 pm
by rimai
Yes, there is a way to detect relay expansion presence, but I have very little to give you at the moment.
I've never thought of this scenario :(
It's pretty cool idea though :ugeek:
The only thing I have to give you is the I2C scanner code.

Re: Detecting Expansion Relays

Posted: Sun May 20, 2012 8:15 am
by dedvalson
Hi,

With the file you sent me this turned out to be pretty easy.

I have modified the Relay classes (.cpp and .h) and included them here. I put in a define to enable this feature so that it wouldn't take any additional memory unless SaveRelaysPresent is defined in the features file.

When it is enabled, a new function exists: boolean RelayClass::IsRelayPresent(byte module). A module argument of 0xff indicates the main relays (kind of useless, they can't ever be gone I guess). An argument of 0-7 querys the status of a particular expansion relay box.

Here is how I used it in my sketch:

Code: Select all

    powerOut = !ReefAngel.Relay.IsRelayPresent(0);

    // turn off power hogs if the power is out    
    if (powerOut)
    {
      ReefAngel.Relay.Off (SKIMMER);
      ReefAngel.Relay.Off (SKUPPER);
      ReefAngel.Relay.Off (REFUGIUM);
      ReefAngel.Relay.Off (REACTOR);
    }


This turns off non-essential things connected to the main relay box if the expansion is missing. This allows the UPS running the main box to continue to run as long as possible during a power failure. I have tested it and it works great.

I have attached the new relay.cpp and relay.h. If you think they are OK can you add this to the development libraries.

Don

Re: Detecting Expansion Relays

Posted: Sun May 20, 2012 8:34 am
by rimai
Wow!!!
That is so cool!!!
Thanks for sharing :)
I'll get it merged into the libraries.

Re: Detecting Expansion Relays

Posted: Sun May 20, 2012 9:22 am
by binder
Another thing that can be done to further simplify things is to add in some define's for the relay boxes. This will make it easier to use the function. Instead of doing this:

Code: Select all

ReefAngel.Relay.IsRelayPresent(0);
You could to this:

Code: Select all

ReefAngel.Relay.IsRelayPresent(MAIN_RELAY);  // useless like you said, but just an example
// or this
ReefAngel.Relay.IsRelayPresent(EXP1_RELAY);
Then we would add to the Globals.h file, something like this:

Code: Select all

#define MAIN_RELAY 0xff
#define EXP1_RELAY 0
#define EXP2_RELAY 1
#define EXP3_RELAY 2
#define EXP4_RELAY 3
#define EXP5_RELAY 4
#define EXP6_RELAY 5
#define EXP7_RELAY 6
#define EXP8_RELAY 7
Doing this would simply clean up the code and make it read a little easier for people at no cost of code size.

If Roberto doesn't add this to the Globals.h file, I will once I merge his branch.
Nice job on the coding and adding in a feature that will be handy. :ugeek:

Re: Detecting Expansion Relays

Posted: Sun May 20, 2012 10:23 am
by dedvalson
Good idea. That makes it a lot cleaner.

Don

Re: Detecting Expansion Relays

Posted: Sat Jun 30, 2012 7:40 pm
by chase
binder wrote:Another thing that can be done to further simplify things is to add in some define's for the relay boxes. This will make it easier to use the function. Instead of doing this:

Code: Select all

ReefAngel.Relay.IsRelayPresent(0);
You could to this:

Code: Select all

ReefAngel.Relay.IsRelayPresent(MAIN_RELAY);  // useless like you said, but just an example
// or this
ReefAngel.Relay.IsRelayPresent(EXP1_RELAY);
Then we would add to the Globals.h file, something like this:

Code: Select all

#define MAIN_RELAY 0xff
#define EXP1_RELAY 0
#define EXP2_RELAY 1
#define EXP3_RELAY 2
#define EXP4_RELAY 3
#define EXP5_RELAY 4
#define EXP6_RELAY 5
#define EXP7_RELAY 6
#define EXP8_RELAY 7
Doing this would simply clean up the code and make it read a little easier for people at no cost of code size.

If Roberto doesn't add this to the Globals.h file, I will once I merge his branch.
Nice job on the coding and adding in a feature that will be handy. :ugeek:
I noticed this was added into the libraries but am not exactly sure how to use it. I have my main relay hooked into a ups, and the expansion is not. This was my best guess-

Code: Select all

if !ReefAngel.Relay.IsRelayPresent(EXP1_RELAY 0); //! meaning opposite/off?
{
      ReefAngel.Relay.Off (Port 1);
      ReefAngel.Relay.Off (Heater);
      ReefAngel.Relay.Off (Lights);
      ReefAngel.Relay.Off (ATO);
    }

Re: Detecting Expansion Relays

Posted: Sat Jun 30, 2012 8:06 pm
by rimai
Yes, ! means not.

Code: Select all

  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    ReefAngel.Relay.Off (Port1);
  }

Re: Detecting Expansion Relays

Posted: Sat Jun 30, 2012 8:21 pm
by chase
Great thanks Roberto, here's to saving another ATO port! ;)

Re: Detecting Expansion Relays

Posted: Sun Jul 08, 2012 8:59 pm
by chase
Is there a portal alert setting for if EXP1_RELAY is not present (as in lost power)? I looked through the list and didn't see anything obvious.

Re: Detecting Expansion Relays

Posted: Mon Jul 09, 2012 6:52 am
by rimai
You can use custom variables to accomplish that.

Code: Select all

  ReefAngel.CustomVar[0]=ReefAngel.Relay.IsRelayPresent(EXP1_RELAY);
  ReefAngel.CustomVar[7]=1;
Then create a trigger if C0=0.

Re: Detecting Expansion Relays

Posted: Tue Jul 10, 2012 8:35 am
by chase
Sounds good, thanks roberto.

Re: Detecting Expansion Relays

Posted: Fri Dec 21, 2012 2:30 pm
by modulok
Is there a way to set a small delay before it turns off ports?

Example: Wait for power outage 2 minutes before shutting off return and skimmer pumps.

Also, when I restore power to the non-ups relay port 2 on the main relay isn't coming back.

Re: Detecting Expansion Relays

Posted: Fri Dec 21, 2012 3:16 pm
by rimai
yes. possible.
Can you post your code?

Re: Detecting Expansion Relays

Posted: Fri Dec 21, 2012 3:47 pm
by modulok

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


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


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
    ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
    ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port6Bit;
    ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 830 );


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

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

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

void loop()
{
    ReefAngel.Relay.DelayedOn( Port4,3 );
    ReefAngel.Relay.DelayedOn( Port5,6 );
    // ReefAngel.StandardHeater( Port6,770,776 );
    // on below 76.6 and off after 77.0
    ReefAngel.StandardHeater( Port6,766,770 );
    StandardHeater2( Box1_Port6,776,780 );
    ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
    ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
    ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
    ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
    ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
    //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
   // ReefAngel.PWM.SetDaylight( MoonPhase() );
   // ReefAngel.PWM.SetActinic( MoonPhase() );
        // Moonlights schedule
if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
    ////// Place your custom code below here

///// Power Out Shutdown all but 2 flow pumps
if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
{
      ReefAngel.Relay.Off (Port2);
      ReefAngel.Relay.Off (Port4);
      ReefAngel.Relay.Off (Port5);
      ReefAngel.Relay.Off (Port6);
    }
    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "modulok" );
    ReefAngel.ShowInterface();
}
    // heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
    if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
    if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
    if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
    int x,y;
    char text[10];
    // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
    ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
    ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
    ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
    pingSerial();

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

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

void DrawCustomGraph()
{
    ReefAngel.LCD.DrawGraph( 5, 5 );
}

Re: Detecting Expansion Relays

Posted: Fri Dec 21, 2012 9:05 pm
by rimai
The Relay.On(Port2) needs to be moved to inside loop to have them come back on.
Try this:

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


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


void setup()
{
  // This must be the first line
  ReefAngel.Init();  //Initialize controller
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
  ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
  ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = 0;
  ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port6Bit;
  ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 830 );


  ////// Place additional initialization code below here
  ReefAngel.Timer[1].SetInterval(120);

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

void loop()
{
  // Ports that are always on
  ReefAngel.Relay.On( Port1 );
  ReefAngel.Relay.On( Port2 );
  ReefAngel.Relay.On( Port3 );
  ReefAngel.Relay.DelayedOn( Port4,3 );
  ReefAngel.Relay.DelayedOn( Port5,6 );
  // ReefAngel.StandardHeater( Port6,770,776 );
  // on below 76.6 and off after 77.0
  ReefAngel.StandardHeater( Port6,766,770 );
  StandardHeater2( Box1_Port6,776,780 );
  ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
  ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
  ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
  ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
  ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
  //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
  // ReefAngel.PWM.SetDaylight( MoonPhase() );
  // ReefAngel.PWM.SetActinic( MoonPhase() );
  // Moonlights schedule
  if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
  ////// Place your custom code below here

  ///// Power Out Shutdown all but 2 flow pumps
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) ReefAngel.Timer[1].Start();
  
  if (ReefAngel.Timer[1].IsTriggered())
  {
    ReefAngel.Relay.Off (Port2);
    ReefAngel.Relay.Off (Port4);
    ReefAngel.Relay.Off (Port5);
    ReefAngel.Relay.Off (Port6);
  }
  ////// Place your custom code above here

  // This should always be the last line
  ReefAngel.Portal( "modulok" );
  ReefAngel.ShowInterface();
}
// heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
  if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
  if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
  if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
  int x,y;
  char text[10];
  // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
  pingSerial();

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

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

void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 5 );
}

Detecting Expansion Relays

Posted: Sat Dec 22, 2012 8:06 am
by lnevo
Wow, awesome thread. Don't know how I ever missed this one. I'm planning on finally hooking up my expansion relay this weekend and was planning on this very thing, but was going to do it with physical ports. Now I can just code the ports I need to shut off during a power outage!

Re: Detecting Expansion Relays

Posted: Sat Dec 22, 2012 1:28 pm
by modulok
Yeah, its so useful. I haven't even hooked my RA up to my tank yet and I love it so much.

Can any of the other controllers do this?

Re: Detecting Expansion Relays

Posted: Sat Dec 22, 2012 9:59 pm
by modulok
Moving the ports always on into the loop worked when the exp relay power was restored. (The wizard put it outside of the loop)

Without using the time part I did a little testing. Ports 1-6 come back on when power is restored, but ports4+5 (return+skimmer) do not obey their ReefAngel.Relay.DelayedOn in the loop. Can they still follow the same delay when power is restored?

When using the timer function (for testing I put 10 seconds instead of 120), the IsRelayPresent doesn't seem to be working anymore.

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 9:57 am
by rimai
Do you keep your RA all through the entire power outage?
The DelayedOn ports only delay on reboot, water change or feeding mode exit.
So, to make them work on power restore, we need to assign LastStart=now(); when power is restored.
I also see what the problem is with the code posted above...
Try this:

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

boolean PowerOutage=false;

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


void setup()
{
  // This must be the first line
  ReefAngel.Init();  //Initialize controller
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
  ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
  ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = 0;
  ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port6Bit;
  ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 830 );


  ////// Place additional initialization code below here
  ReefAngel.Timer[1].SetInterval(120);

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

void loop()
{
  // Ports that are always on
  ReefAngel.Relay.On( Port1 );
  ReefAngel.Relay.On( Port2 );
  ReefAngel.Relay.On( Port3 );
  ReefAngel.Relay.DelayedOn( Port4,3 );
  ReefAngel.Relay.DelayedOn( Port5,6 );
  // ReefAngel.StandardHeater( Port6,770,776 );
  // on below 76.6 and off after 77.0
  ReefAngel.StandardHeater( Port6,766,770 );
  StandardHeater2( Box1_Port6,776,780 );
  ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
  ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
  ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
  ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
  ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
  //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
  // ReefAngel.PWM.SetDaylight( MoonPhase() );
  // ReefAngel.PWM.SetActinic( MoonPhase() );
  // Moonlights schedule
  if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
  ////// Place your custom code below here

  ///// Power Out Shutdown all but 2 flow pumps
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) PowerOutage=true;
  
  if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    ReefAngel.Timer[1].Start();
    LastStart=now();
  }
  if (ReefAngel.Timer[1].IsTriggered())
  {
    ReefAngel.Relay.Off (Port2);
    ReefAngel.Relay.Off (Port4);
    ReefAngel.Relay.Off (Port5);
    ReefAngel.Relay.Off (Port6);
  }
  ////// Place your custom code above here

  // This should always be the last line
  ReefAngel.Portal( "modulok" );
  ReefAngel.ShowInterface();
}
// heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
  if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
  if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
  if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
  int x,y;
  char text[10];
  // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
  pingSerial();

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

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

void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 5 );
}

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 11:51 am
by modulok
rimai wrote:Do you keep your RA all through the entire power outage?
I'd like to keep the RA and main relay on for as long as the batteries will stay up. If that's what you are asking.

I tried the code and the timer function is still not working. 2nd relay is not triggering powerout scenario.

Shouldn't it be if (PowerOutage && !ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) ? with the exclamation point? I did try it and it didn't matter, still not shutting down ports like it should.

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 1:46 pm
by rimai
The ! sign means NOT
http://arduino.cc/en/Reference/Boolean

Try this:

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

boolean PowerOutage=false;

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


void setup()
{
  // This must be the first line
  ReefAngel.Init();  //Initialize controller
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
  ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
  ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = 0;
  ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port6Bit;
  ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 830 );


  ////// Place additional initialization code below here
  ReefAngel.Timer[1].SetInterval(120);

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

void loop()
{
  // Ports that are always on
  ReefAngel.Relay.On( Port1 );
  ReefAngel.Relay.On( Port2 );
  ReefAngel.Relay.On( Port3 );
  ReefAngel.Relay.DelayedOn( Port4,3 );
  ReefAngel.Relay.DelayedOn( Port5,6 );
  // ReefAngel.StandardHeater( Port6,770,776 );
  // on below 76.6 and off after 77.0
  ReefAngel.StandardHeater( Port6,766,770 );
  StandardHeater2( Box1_Port6,776,780 );
  ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
  ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
  ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
  ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
  ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
  //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
  // ReefAngel.PWM.SetDaylight( MoonPhase() );
  // ReefAngel.PWM.SetActinic( MoonPhase() );
  // Moonlights schedule
  if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
  ////// Place your custom code below here

  ///// Power Out Shutdown all but 2 flow pumps
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
    if (!PowerOutage)
    {
      PowerOutage=true;
      ReefAngel.Timer[1].Start();
    }

  if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) LastStart=now();

  if (ReefAngel.Timer[1].IsTriggered())
  {
    ReefAngel.Relay.Off (Port2);
    ReefAngel.Relay.Off (Port4);
    ReefAngel.Relay.Off (Port5);
    ReefAngel.Relay.Off (Port6);
  }
  ////// Place your custom code above here

  // This should always be the last line
  ReefAngel.Portal( "modulok" );
  ReefAngel.ShowInterface();
}
// heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
  if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
  if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
  if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
  int x,y;
  char text[10];
  // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
  pingSerial();

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

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

void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 5 );
}


Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 3:47 pm
by modulok
Nope...still nothing happening when pulling the cord to 2nd relay box. It doesn't like the timer addition, gotta be something with that part.

This works, but there is no timer.

Code: Select all

    // Power Outage - Shutdown all but 1 flow pump
    if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
    //if (!PowerOutage)
    //{
    //  PowerOutage=true;
    //  ReefAngel.Timer[1].Start();
    //}
  //if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) LastStart=now();

      //if (ReefAngel.Timer[1].IsTriggered())
     {
      ReefAngel.Relay.Off (Port1); //Flow1
      ReefAngel.Relay.Off (Port3); //Flow3
      ReefAngel.Relay.Off (Port4); //Return
      ReefAngel.Relay.Off (Port5); //Skimmer
      ReefAngel.Relay.Off (Port6); //Heater
    }

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 8:56 pm
by modulok
After messing with this for awhile, I think I am ok not using the timer function. Without it there is a 3-4 sec delay before ports shutdown. And for quick outages that just make the lights blink I think 3-4 secs is enough.

The only thing I'd like to get working is LastStart=now(); Not sure where to place it.

Code: Select all

    // Power Outage - Only Flow2 port on
    if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) //Exp1 Relay NOT present
    {
      ReefAngel.Relay.Off (Port1); //Flow1
      ReefAngel.Relay.Off (Port3); //Flow3
      ReefAngel.Relay.Off (Port4); //Return
      ReefAngel.Relay.Off (Port5); //Skimmer
      ReefAngel.Relay.Off (Port6); //Heater
    }

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 10:42 pm
by rimai
Cool.
Try this then:

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

boolean PowerOutage=false;

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


void setup()
{
  // This must be the first line
  ReefAngel.Init();  //Initialize controller
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
  ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
  ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = 0;
  ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port6Bit;
  ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 830 );


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

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

void loop()
{
  // Ports that are always on
  ReefAngel.Relay.On( Port1 );
  ReefAngel.Relay.On( Port2 );
  ReefAngel.Relay.On( Port3 );
  ReefAngel.Relay.DelayedOn( Port4,3 );
  ReefAngel.Relay.DelayedOn( Port5,6 );
  // ReefAngel.StandardHeater( Port6,770,776 );
  // on below 76.6 and off after 77.0
  ReefAngel.StandardHeater( Port6,766,770 );
  StandardHeater2( Box1_Port6,776,780 );
  ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
  ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
  ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
  ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
  ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
  //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
  // ReefAngel.PWM.SetDaylight( MoonPhase() );
  // ReefAngel.PWM.SetActinic( MoonPhase() );
  // Moonlights schedule
  if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
  ////// Place your custom code below here

  // Power Outage - Only Flow2 port on
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) //Exp1 Relay NOT present
  {
    PowerOutage=true;
    ReefAngel.Relay.Off (Port1); //Flow1
    ReefAngel.Relay.Off (Port3); //Flow3
    ReefAngel.Relay.Off (Port4); //Return
    ReefAngel.Relay.Off (Port5); //Skimmer
    ReefAngel.Relay.Off (Port6); //Heater
  }

  if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    PowerOutage=false;
    LastStart=now();
  }

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

  // This should always be the last line
  ReefAngel.Portal( "modulok" );
  ReefAngel.ShowInterface();
}
// heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
  if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
  if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
  if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
  int x,y;
  char text[10];
  // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
  pingSerial();

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

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

void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 5 );
}

Re: Detecting Expansion Relays

Posted: Sun Dec 23, 2012 11:02 pm
by modulok
Delayed ports still coming on with always on ports.

Re: Detecting Expansion Relays

Posted: Tue Dec 25, 2012 11:24 am
by rimai
I found out what the problem is...
The order of events is important in this case.
We need to assign a new value to LastStart before it is compared by DelayedOn(), or it will just the old value...

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

boolean PowerOutage=false;

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


void setup()
{
  // This must be the first line
  ReefAngel.Init();  //Initialize controller
  // Ports toggled in Feeding Mode
  ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit;
  ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit;
  // Ports toggled in Water Change Mode
  ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
  ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit;
  // Ports toggled when Lights On / Off menu entry selected
  ReefAngel.LightsOnPorts = 0;
  ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit;
  // Ports turned off when Overheat temperature exceeded
  ReefAngel.OverheatShutoffPorts = Port6Bit;
  ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit;
  // Use T1 probe as temperature and overheat functions
  ReefAngel.TempProbe = T1_PROBE;
  ReefAngel.OverheatProbe = T1_PROBE;
  // Set the Overheat temperature setting
  InternalMemory.OverheatTemp_write( 830 );


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

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

void loop()
{
  // Ports that are always on
  ReefAngel.Relay.On( Port1 );
  ReefAngel.Relay.On( Port2 );
  ReefAngel.Relay.On( Port3 );
  if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    PowerOutage=false;
    LastStart=now();
  }
  ReefAngel.Relay.DelayedOn( Port4,3 );
  ReefAngel.Relay.DelayedOn( Port5,6 );
  // ReefAngel.StandardHeater( Port6,770,776 );
  // on below 76.6 and off after 77.0
  ReefAngel.StandardHeater( Port6,766,770 );
  StandardHeater2( Box1_Port6,776,780 );
  ReefAngel.StandardLights( Box1_Port1,10,0,20,0 );
  ReefAngel.StandardLights( Box1_Port2,11,0,18,0 );
  ReefAngel.StandardLights( Box1_Port3,12,0,19,0 );
  ReefAngel.StandardLights( Box1_Port4,19,0,22,0 );
  ReefAngel.StandardLights( Box1_Port5,0,0,8,0 );
  //  ReefAngel.StandardHeater( Box1_Port6,770,780 );
  // ReefAngel.PWM.SetDaylight( MoonPhase() );
  // ReefAngel.PWM.SetActinic( MoonPhase() );
  // Moonlights schedule
  if (hour()>=22 || hour()<=10) // Turn Moonlights on/off
  {
    ReefAngel.PWM.SetActinic(MoonPhase());
    ReefAngel.PWM.SetDaylight(MoonPhase());
  }
  else
  {
    ReefAngel.PWM.SetActinic(0);
    ReefAngel.PWM.SetDaylight(0);
  }
  ////// Place your custom code below here

  // Power Outage - Only Flow2 port on
  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) //Exp1 Relay NOT present
  {
    PowerOutage=true;
    ReefAngel.Relay.Off (Port1); //Flow1
    ReefAngel.Relay.Off (Port3); //Flow3
    ReefAngel.Relay.Off (Port4); //Return
    ReefAngel.Relay.Off (Port5); //Skimmer
    ReefAngel.Relay.Off (Port6); //Heater
  }
  ////// Place your custom code above here

  // This should always be the last line
  ReefAngel.Portal( "modulok" );
  ReefAngel.ShowInterface();
}
// heater 2 using temp sensor 2
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
  if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
  if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
  if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}


void DrawCustomMain()
{
  int x,y;
  char text[10];
  // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, ReefAngel.Params,
  ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
  ReefAngel.LCD.DrawMonitor( 15, 62, 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, 93, TempRelay );
  pingSerial();

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

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

void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 5 );
}

Re: Detecting Expansion Relays

Posted: Wed Dec 26, 2012 2:42 pm
by modulok
Excellent! Delayed ports now being delayed when power is restored.

I don't know why, but now the delay after the exp1 relay loses power is just 2 seconds instead of the 3-4 sec I had the other day. I think it would be best to add a 10 second delay.

Can we revisit adding a timer delay before turning off the main relay ports?

Edit: It's close to working...After the timer expires the ports shutoff (including delayed ports) but click right back on.

Code: Select all

// Power Outage - Only Flow2 port on
    if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) PowerOutage=true; //Exp1 Relay NOT present
    if (!PowerOutage)
    {  
      ReefAngel.Timer[1].Start();
    }  
    if (ReefAngel.Timer[1].IsTriggered())
    {  
      ReefAngel.Relay.Off (Port1); //Flow1
      ReefAngel.Relay.Off (Port3); //Flow3
      ReefAngel.Relay.Off (Port4); //Return
      ReefAngel.Relay.Off (Port5); //Skimmer
      ReefAngel.Relay.Off (Port6); //Heater
    }
Entire 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 ---------------------------------
boolean PowerOutage=false; 

// Globals for Params on Custom Main
byte x,y;
char text[10];

// Custom Menu
#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Turn Lights On";
prog_char menu1_label[] PROGMEM = "Turn Lights Off";
prog_char menu2_label[] PROGMEM = "Start Feeding";
prog_char menu3_label[] PROGMEM = "Start Water Change";
prog_char menu4_label[] PROGMEM = "Clear Overheat";
prog_char menu5_label[] PROGMEM = "Calibrate pH";
prog_char menu6_label[] PROGMEM = "Display Version";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label  };

void MenuEntry1()
{
ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
    ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
}
#endif  // RelayExp
ReefAngel.Relay.Write();

}
void MenuEntry2()
{
ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
    ReefAngel.Relay.RelayMaskOnE[i] = 0;
}
#endif  // RelayExp
ReefAngel.Relay.Write();

}
void MenuEntry3()
{
ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();

}
void MenuEntry4()
{
ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();

}
void MenuEntry5()
{
ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();

}
void MenuEntry6()
{
ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;

}
void MenuEntry7()
{
ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.DisplayVersion();

}
// End Custom Menu Globals

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

//--------------------------------- Begin Setup ---------------------------------
void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    // Initialize the menu
    ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit; //Flow1&3,Return,Skimmer
    ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit; //FrontT5,Heater
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
    ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit; //Front+BackT5,Heater
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit | Port4Bit; //Center+Front+BackT5,RSMLED
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port6Bit; //heater
    ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit; //Front+BackT5,FugeLight,Heater
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 830 );
    
    //--------------------------------- Place additional initialization code below here ---------------------------------
    ReefAngel.Timer[1].SetInterval(5);
    //--------------------------------- Place additional initialization code above here ---------------------------------
}
//--------------------------------- End Setup ---------------------------------
//--------------------------------- Begin Loop ---------------------------------
void loop()
{
    // Ports that are always on
    ReefAngel.Relay.On( Port1 ); //Flow1
    ReefAngel.Relay.On( Port2 ); //Flow2
    ReefAngel.Relay.On( Port3 ); //Flow3
    // Ports that are delayed on Power Cycle & Feeding & Water Change
    if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
    {
      PowerOutage=false;
      LastStart=now();
    }
    ReefAngel.Relay.DelayedOn( Port4,1 ); //Return -set to 1 min for testing CHANGE TO 2MINS
    ReefAngel.Relay.DelayedOn( Port5,1 ); //Skimmer -set to 1 min for testing CHANGE TO 4MINS
    // Heaters
    ReefAngel.StandardHeater( Port6,776,780 ); //DispHeater
    StandardHeater2( Box1_Port6,776,780 ); //SumpHeater
    // T5 Light Schedule
    ReefAngel.StandardLights( Box1_Port1,10,0,20,0 ); //CenterT5 10a-8p
    ReefAngel.StandardLights( Box1_Port2,11,0,18,0 ); //FrontT5 11a-6p
    ReefAngel.StandardLights( Box1_Port3,12,0,19,0 ); //BackT5 12p-17p
    // RSMLED Moonlight Schedule
    if (hour()<11) ReefAngel.StandardLights( Box1_Port4,8,0,11,0 ); //RSMLED Morning 8a-11a
    else ReefAngel.StandardLights( Box1_Port4,19,0,22,0 ); //RSMLED Evening 7p-10p
    // Fuge Light Schedule
    ReefAngel.StandardLights( Box1_Port5,0,0,8,0 ); //FugeLight 12a-8a
    // PWM Dimmable Moonlights Schedule
    if (hour()>=22 || hour()<8) // Turn Dimmable Moonlights on 10PM/ off 8AM
    {
      ReefAngel.PWM.SetActinic(MoonPhase());
      ReefAngel.PWM.SetDaylight(MoonPhase());
    }
    else
    {
      ReefAngel.PWM.SetActinic(0);
      ReefAngel.PWM.SetDaylight(0);
    }
    
    //--------------------------------- Place your custom code below here ---------------------------------
    // Power Outage - Only Flow2 port on
    if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) PowerOutage=true; //Exp1 Relay NOT present
    if (!PowerOutage)
    {  
      ReefAngel.Timer[1].Start();
    }  
    if (ReefAngel.Timer[1].IsTriggered())
    {  
      ReefAngel.Relay.Off (Port1); //Flow1
      ReefAngel.Relay.Off (Port3); //Flow3
      ReefAngel.Relay.Off (Port4); //Return
      ReefAngel.Relay.Off (Port5); //Skimmer
      ReefAngel.Relay.Off (Port6); //Heater
    }
    // Skimmer off when Return pump is off.
    if (bitRead(ReefAngel.Relay.RelayMaskOff,3)==0)//Return
    {
        bitClear(ReefAngel.Relay.RelayMaskOff,4); //Skimmer
    }
    //////////// Place your custom code above here //////////// 

    // This should always be the last line
    ReefAngel.Portal( "modulok" );
    ReefAngel.ShowInterface();
}
//--------------------------------- End Loop ---------------------------------
// Sump Heater Use Sump Temp Probe
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
    if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
    if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
    if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}
//--------------------------------- Begin Custom Main ---------------------------------
void DrawCustomMain()
{
ReefAngel.LCD.DrawDate(6, 2);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();

// Display T1 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
ReefAngel.LCD.DrawHugeNumbers(COLOR_CRIMSON, 255, 5, 14, text);
pingSerial();

// Display pH Text
ReefAngel.LCD.DrawText(COLOR_INDIGO,255,80,14,"pH");
// Display pH Value
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_INDIGO, 255, 95, 14, text, Num8x16);
pingSerial();

// Display T3 Probe Text
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,255,80,24,"Rm");
// Display T3 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
ReefAngel.LCD.DrawLargeText(COLOR_ROYALBLUE, 255, 95, 24, text, Num8x16);
pingSerial();
//Moon Phase
//ReefAngel.LCD.DrawText(COLOR_NAVY,255,4,78, "MoonPhase:");
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,4,88,MoonPhaseLabel());
//Dimmable Moon LEDs
ReefAngel.LCD.DrawText(COLOR_NAVY,255,4,98, "MoonLEDs:");
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,60,98, ReefAngel.PWM.GetActinicValue());
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,75,98, "%");
  
// Display Main Relay Box
    byte TempRelay = ReefAngel.Relay.RelayData;
    TempRelay &= ReefAngel.Relay.RelayMaskOff;
    TempRelay |= ReefAngel.Relay.RelayMaskOn;
    ReefAngel.LCD.DrawOutletBox( 13, 107, TempRelay );
    pingSerial();

// Display Expansion Relay Box 1
    TempRelay = ReefAngel.Relay.RelayDataE[0];
    TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
    TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
    ReefAngel.LCD.DrawOutletBox( 13, 119, TempRelay );
    pingSerial();

}
//--------------------------------- End Custom Main ---------------------------------
void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 35 );
}

Re: Detecting Expansion Relays

Posted: Wed Dec 26, 2012 9:51 pm
by rimai
Try this:

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 ---------------------------------
boolean PowerOutage=false; 
boolean DelayedPowerOutage=false; 

// Globals for Params on Custom Main
byte x,y;
char text[10];

// Custom Menu
#include <avr/pgmspace.h>
prog_char menu0_label[] PROGMEM = "Turn Lights On";
prog_char menu1_label[] PROGMEM = "Turn Lights Off";
prog_char menu2_label[] PROGMEM = "Start Feeding";
prog_char menu3_label[] PROGMEM = "Start Water Change";
prog_char menu4_label[] PROGMEM = "Clear Overheat";
prog_char menu5_label[] PROGMEM = "Calibrate pH";
prog_char menu6_label[] PROGMEM = "Display Version";
PROGMEM const char *menu_items[] = {
menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label  };

void MenuEntry1()
{
ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
    ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
}
#endif  // RelayExp
ReefAngel.Relay.Write();

}
void MenuEntry2()
{
ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
#ifdef RelayExp
for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
{
    ReefAngel.Relay.RelayMaskOnE[i] = 0;
}
#endif  // RelayExp
ReefAngel.Relay.Write();

}
void MenuEntry3()
{
ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();

}
void MenuEntry4()
{
ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();

}
void MenuEntry5()
{
ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();

}
void MenuEntry6()
{
ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;

}
void MenuEntry7()
{
ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.DisplayVersion();

}
// End Custom Menu Globals

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

//--------------------------------- Begin Setup ---------------------------------
void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    // Initialize the menu
    ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items));
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port1Bit | Port3Bit | Port4Bit | Port5Bit; //Flow1&3,Return,Skimmer
    ReefAngel.FeedingModePortsE[0] = Port2Bit | Port6Bit; //FrontT5,Heater
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
    ReefAngel.WaterChangePortsE[0] = Port2Bit | Port3Bit | Port6Bit; //Front+BackT5,Heater
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    ReefAngel.LightsOnPortsE[0] = Port1Bit | Port2Bit | Port3Bit | Port4Bit; //Center+Front+BackT5,RSMLED
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port6Bit; //heater
    ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port3Bit | Port5Bit | Port6Bit; //Front+BackT5,FugeLight,Heater
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 830 );
    
    //--------------------------------- Place additional initialization code below here ---------------------------------
    ReefAngel.Timer[1].SetInterval(5);
    //--------------------------------- Place additional initialization code above here ---------------------------------
}
//--------------------------------- End Setup ---------------------------------
//--------------------------------- Begin Loop ---------------------------------
void loop()
{
    // Ports that are always on
    ReefAngel.Relay.On( Port1 ); //Flow1
    ReefAngel.Relay.On( Port2 ); //Flow2
    ReefAngel.Relay.On( Port3 ); //Flow3
    // Ports that are delayed on Power Cycle & Feeding & Water Change
    if (PowerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
    {
      PowerOutage=false;
      DelayedPowerOutage=false;
      LastStart=now();
    }
    ReefAngel.Relay.DelayedOn( Port4,1 ); //Return -set to 1 min for testing CHANGE TO 2MINS
    ReefAngel.Relay.DelayedOn( Port5,1 ); //Skimmer -set to 1 min for testing CHANGE TO 4MINS
    // Heaters
    ReefAngel.StandardHeater( Port6,776,780 ); //DispHeater
    StandardHeater2( Box1_Port6,776,780 ); //SumpHeater
    // T5 Light Schedule
    ReefAngel.StandardLights( Box1_Port1,10,0,20,0 ); //CenterT5 10a-8p
    ReefAngel.StandardLights( Box1_Port2,11,0,18,0 ); //FrontT5 11a-6p
    ReefAngel.StandardLights( Box1_Port3,12,0,19,0 ); //BackT5 12p-17p
    // RSMLED Moonlight Schedule
    if (hour()<11) ReefAngel.StandardLights( Box1_Port4,8,0,11,0 ); //RSMLED Morning 8a-11a
    else ReefAngel.StandardLights( Box1_Port4,19,0,22,0 ); //RSMLED Evening 7p-10p
    // Fuge Light Schedule
    ReefAngel.StandardLights( Box1_Port5,0,0,8,0 ); //FugeLight 12a-8a
    // PWM Dimmable Moonlights Schedule
    if (hour()>=22 || hour()<8) // Turn Dimmable Moonlights on 10PM/ off 8AM
    {
      ReefAngel.PWM.SetActinic(MoonPhase());
      ReefAngel.PWM.SetDaylight(MoonPhase());
    }
    else
    {
      ReefAngel.PWM.SetActinic(0);
      ReefAngel.PWM.SetDaylight(0);
    }
    
    //--------------------------------- Place your custom code below here ---------------------------------
    // Power Outage - Only Flow2 port on
    if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)) PowerOutage=true; //Exp1 Relay NOT present
    if (!PowerOutage)
    {  
      ReefAngel.Timer[1].Start();
    }  
    if (ReefAngel.Timer[1].IsTriggered())
    {  
      DelayedPowerOutage=true;
    }
    if (DelayedPowerOutage)
    {
      ReefAngel.Relay.Off (Port1); //Flow1
      ReefAngel.Relay.Off (Port3); //Flow3
      ReefAngel.Relay.Off (Port4); //Return
      ReefAngel.Relay.Off (Port5); //Skimmer
      ReefAngel.Relay.Off (Port6); //Heater
    }
    // Skimmer off when Return pump is off.
    if (bitRead(ReefAngel.Relay.RelayMaskOff,3)==0)//Return
    {
        bitClear(ReefAngel.Relay.RelayMaskOff,4); //Skimmer
    }
    //////////// Place your custom code above here //////////// 

    // This should always be the last line
    ReefAngel.Portal( "modulok" );
    ReefAngel.ShowInterface();
}
//--------------------------------- End Loop ---------------------------------
// Sump Heater Use Sump Temp Probe
void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp)
{
    if (ReefAngel.Params.Temp[T2_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
    if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
    if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
}
//--------------------------------- Begin Custom Main ---------------------------------
void DrawCustomMain()
{
ReefAngel.LCD.DrawDate(6, 2);
ReefAngel.LCD.Clear(COLOR_BLACK, 1, 11, 132, 11);
pingSerial();

// Display T1 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
ReefAngel.LCD.DrawHugeNumbers(COLOR_CRIMSON, 255, 5, 14, text);
pingSerial();

// Display pH Text
ReefAngel.LCD.DrawText(COLOR_INDIGO,255,80,14,"pH");
// Display pH Value
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_INDIGO, 255, 95, 14, text, Num8x16);
pingSerial();

// Display T3 Probe Text
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,255,80,24,"Rm");
// Display T3 Probe Value
ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
ReefAngel.LCD.DrawLargeText(COLOR_ROYALBLUE, 255, 95, 24, text, Num8x16);
pingSerial();
//Moon Phase
//ReefAngel.LCD.DrawText(COLOR_NAVY,255,4,78, "MoonPhase:");
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,4,88,MoonPhaseLabel());
//Dimmable Moon LEDs
ReefAngel.LCD.DrawText(COLOR_NAVY,255,4,98, "MoonLEDs:");
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,60,98, ReefAngel.PWM.GetActinicValue());
ReefAngel.LCD.DrawText(COLOR_CORNFLOWERBLUE,255,75,98, "%");
  
// Display Main Relay Box
    byte TempRelay = ReefAngel.Relay.RelayData;
    TempRelay &= ReefAngel.Relay.RelayMaskOff;
    TempRelay |= ReefAngel.Relay.RelayMaskOn;
    ReefAngel.LCD.DrawOutletBox( 13, 107, TempRelay );
    pingSerial();

// Display Expansion Relay Box 1
    TempRelay = ReefAngel.Relay.RelayDataE[0];
    TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
    TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
    ReefAngel.LCD.DrawOutletBox( 13, 119, TempRelay );
    pingSerial();

}
//--------------------------------- End Custom Main ---------------------------------
void DrawCustomGraph()
{
  ReefAngel.LCD.DrawGraph( 5, 35 );
}

Re: Detecting Expansion Relays

Posted: Wed Dec 26, 2012 10:59 pm
by modulok
ok, the delay seems to be triggering now...but when the exp1 relay's power is restored the ports that were shut off do not come back on.