Detecting Expansion Relays

Basic / Standard Reef Angel hardware
dedvalson
Posts: 140
Joined: Tue Oct 04, 2011 5:49 am

Detecting Expansion Relays

Post 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
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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.
Attachments
I2CScanner.ino
(1.9 KiB) Downloaded 437 times
Roberto.
dedvalson
Posts: 140
Joined: Tue Oct 04, 2011 5:49 am

Re: Detecting Expansion Relays

Post 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
Attachments
Relay.zip
Relay.cpp and Relay.h with new IsRelayPresent function
(2.24 KiB) Downloaded 431 times
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post by rimai »

Wow!!!
That is so cool!!!
Thanks for sharing :)
I'll get it merged into the libraries.
Roberto.
binder
Posts: 2865
Joined: Fri Mar 18, 2011 6:20 pm
Location: Illinois
Contact:

Re: Detecting Expansion Relays

Post 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:
dedvalson
Posts: 140
Joined: Tue Oct 04, 2011 5:49 am

Re: Detecting Expansion Relays

Post by dedvalson »

Good idea. That makes it a lot cleaner.

Don
chase
Posts: 101
Joined: Fri Sep 16, 2011 8:26 am

Re: Detecting Expansion Relays

Post 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);
    }
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post by rimai »

Yes, ! means not.

Code: Select all

  if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
  {
    ReefAngel.Relay.Off (Port1);
  }
Roberto.
chase
Posts: 101
Joined: Fri Sep 16, 2011 8:26 am

Re: Detecting Expansion Relays

Post by chase »

Great thanks Roberto, here's to saving another ATO port! ;)
Image
chase
Posts: 101
Joined: Fri Sep 16, 2011 8:26 am

Re: Detecting Expansion Relays

Post 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.
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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.
Roberto.
chase
Posts: 101
Joined: Fri Sep 16, 2011 8:26 am

Re: Detecting Expansion Relays

Post by chase »

Sounds good, thanks roberto.
Image
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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.
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post by rimai »

yes. possible.
Can you post your code?
Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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 );
}
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}
Roberto.
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Detecting Expansion Relays

Post 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!
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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?
Image
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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.
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}
Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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.
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}

Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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
    }
Image
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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
    }
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}
Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post by modulok »

Delayed ports still coming on with always on ports.
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}
Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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 );
}
Image
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Detecting Expansion Relays

Post 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 );
}
Roberto.
modulok
Posts: 163
Joined: Wed Oct 24, 2012 8:37 am

Re: Detecting Expansion Relays

Post 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.
Image
Post Reply