Does anyone know whats happening? when I reboot m controller by unplugging it and plugging it back in, none of the relays will then change from off until i unplug the USB cable from the relay box to the expansion hub and plug it back in.
Any help would be awesome.
P.S. Today I'm running it on RAGen code with NO modifications to see how it copes
Code: Select all
//
#include <Salinity.h>
#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
#include <WiFiAlert.h>
// Custom Menu
#include <avr/pgmspace.h>
prog_char menu1_label[] PROGMEM = "Lights On";
prog_char menu2_label[] PROGMEM = "Feeding Mode";
prog_char menu3_label[] PROGMEM = "Water Change";
prog_char menu4_label[] PROGMEM = "ATO Clear";
prog_char menu5_label[] PROGMEM = "Overheat Clear";
prog_char menu6_label[] PROGMEM = "PH Calibration";
prog_char menu7_label[] PROGMEM = "Sal Calibration";
prog_char menu8_label[] PROGMEM = "ORP Calibration";
prog_char menu9_label[] PROGMEM = "Date / Time";
// Group the menu entries together
PROGMEM const char *menu_items[] = {
menu1_label, menu2_label, menu3_label,
menu4_label, menu5_label, menu6_label,
menu7_label, menu8_label, menu9_label
};
// Define Relay Ports by Name
#define Return 1
#define WaveMakerLeft 2
#define WaveMakerRight 3
#define LED_WhiteBlue 4
#define LED_Supplemental 5
#define LED_Moonlights 6
#define SkimmerPump 7
#define SkimmerVenturi 8
#define Heater1 Box1_Port1
#define Heater2 Box1_Port2
#define Chiller Box1_Port3
#define ChillerPump Box1_Port4
#define SumpLight Box1_Port5
#define Ozone Box1_Port6
#define ATO Box1_Port7
#define Unused Box1_Port8
//Define Custom Memory Locations
#define CMem_B_Delay_Ozone 100
#define CMem_B_Delay_Skimmer 101
#define CMem_B_Delay_Chiller 102
#define CMem_I_OrpMin 103
#define CMem_I_OrpMax 104
#define CMem_B_LightsEnabled 105
#define CMem_B_ResetMemory 199
void init_memory()
{
InternalMemory.write(CMem_B_Delay_Ozone,10);
InternalMemory.write(CMem_B_Delay_Skimmer,5);
InternalMemory.write(CMem_B_Delay_Chiller,1);
InternalMemory.write_int(CMem_I_OrpMin,400);
InternalMemory.write_int(CMem_I_OrpMax,420);
InternalMemory.write(CMem_B_LightsEnabled,false);
InternalMemory.write(CMem_B_ResetMemory,true);
}
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.SetTemperatureUnit( Celsius ); // set to Celsius Temperature
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port3Bit | Port7Bit;
ReefAngel.FeedingModePortsE[0] = Port4Bit;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port5Bit | Port6Bit | Port7Bit | Port8Bit;
ReefAngel.WaterChangePortsE[0] = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port6Bit | Port7Bit;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port4Bit | Port5Bit;
ReefAngel.LightsOnPortsE[0] = Port5Bit;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port4Bit | Port5Bit | Port6Bit;
ReefAngel.OverheatShutoffPortsE[0] = Port1Bit | Port2Bit | Port5Bit | Port6Bit;
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T1_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// Ports that are always on
ReefAngel.Relay.On( Return );
ReefAngel.Relay.On( WaveMakerLeft );
ReefAngel.Relay.On( WaveMakerRight );
ReefAngel.Relay.On( SkimmerVenturi );
ReefAngel.Relay.On( Chiller );
////// Place additional initialization code below here
//RA has been restarted. Set lights enabled memory to off
////// Place additional initialization code above here
ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items)); // Initialize Menu
if (InternalMemory.read(CMem_B_ResetMemory))
{
init_memory();
InternalMemory.write(CMem_B_ResetMemory,false);
}
}
void loop()
{
//Initialise Relays
ReefAngel.MoonLights( LED_Moonlights );
ReefAngel.MoonLights( SumpLight );
ReefAngel.DayLights( LED_WhiteBlue );
ReefAngel.DayLights( LED_Supplemental );
ReefAngel.StandardHeater( Heater1 );
ReefAngel.StandardHeater( Heater2 );
ReefAngel.StandardFan( ChillerPump );
ReefAngel.SingleATOLow( ATO );
ReefAngel.Relay.DelayedOn( Ozone, InternalMemory.read(CMem_B_Delay_Ozone));
ReefAngel.Relay.DelayedOn( SkimmerPump, InternalMemory.read(CMem_B_Delay_Skimmer));
// ReefAngel.Relay.DelayedOn( Chiller, InternalMemory.read(CMem_B_Delay_Chiller));
//SetPWM as normal if Lights Mode Off
if(!InternalMemory.read(CMem_B_LightsEnabled))
{
ReefAngel.PWM.Channel0PWMParabola();
ReefAngel.PWM.Channel1PWMParabola();
ReefAngel.PWM.Channel2PWMParabola();
ReefAngel.PWM.Channel3PWMParabola();
ReefAngel.PWM.SetChannel( 4, MoonPhase() );
ReefAngel.PWM.SetChannel( 5, MoonPhase() );
}
else
{
ReefAngel.PWM.SetChannel(0,80);
ReefAngel.PWM.SetChannel(1,100);
ReefAngel.PWM.SetChannel(2,100);
ReefAngel.PWM.SetChannel(3,100);
}
////// Place your custom code below here
OrpControl();
////// Place your custom code above here
// This should always be the last line
ReefAngel.Portal( "egadgetjnr" );
ReefAngel.ShowInterface();
}
void DrawCustomMain()
{
int x,y;
char text[10];
// Dimming Expansion
x = 15;
y = 2;
for ( int a=0;a<6;a++ )
{
if ( a>2 ) x = 75;
if ( a==3 ) y = 2;
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :" );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a );
ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,ReefAngel.PWM.GetChannelValue(a) );
y += 10;
}
pingSerial();
// I/O Expansion
byte bkcolor;
x = 14;
y = 32;
for ( int a=0;a<6;a++ )
{
ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE;
else bkcolor=COLOR_GRAY;
ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
}
pingSerial();
// Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 39, ReefAngel.Params,
ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
ReefAngel.LCD.DrawMonitor( 15, 39, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
pingSerial();
// Salinity
ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,16,69, "SAL:" );
ReefAngel.LCD.DrawSingleMonitor( ReefAngel.Params.Salinity,COLOR_DARKKHAKI,40,69, 10 );
pingSerial();
// ORP
ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,82,69, "ORP:" );
ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,106,69, ReefAngel.Params.ORP );
pingSerial();
// pH Expansion
ReefAngel.LCD.DrawText( COLOR_MEDIUMSEAGREEN,DefaultBGColor,15,80, "PHE:" );
ReefAngel.LCD.DrawSingleMonitor( ReefAngel.Params.PHExp,COLOR_MEDIUMSEAGREEN,39,80, 100 );
pingSerial();
// Main Relay Box
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox( 12, 90, TempRelay );
pingSerial();
// Relay Expansion
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox( 12, 103, TempRelay );
pingSerial();
// Date and Time
ReefAngel.LCD.DrawDate( 6, 122 );
pingSerial();
}
void DrawCustomGraph()
{
}
void OrpControl()
{
int iOrpMax = InternalMemory.read(CMem_I_OrpMax);
int iOrpMin = InternalMemory.read(CMem_I_OrpMin);
int iCurrentOrp = ReefAngel.Params.ORP;
byte bOzoneDelay = InternalMemory.read(CMem_B_Delay_Ozone);
static boolean bOrpOn;
static WiFiAlert waOrpAlert;
if(iCurrentOrp >= iOrpMax)
{
//Turn off Orp Relay
//Serial.println("Orp Is Off");
ReefAngel.Relay.Off(Ozone);
//Send alert Orp is Off
waOrpAlert.Send("Ozone+is+off!+Max+Ozone");
bOrpOn = false;
//write to mem when orp off
}
else
{
if(!bOrpOn && iCurrentOrp <= iOrpMin )
{
//Trigger ORP Relay
//Serial.println("Orp Is On");
//Serial.print(ReefAngel.Relay.Status(Ozone));
ReefAngel.Relay.DelayedOn(Ozone,bOzoneDelay);
waOrpAlert.Send("Ozone+is+on.");
bOrpOn = true;
}
}
}
void Overheat()
{
//Enter code for overheat
//Send wifi alert
}
//Menu Code
/*prog_char menu1_label[] PROGMEM = "Lights On";
prog_char menu2_label[] PROGMEM = "Feeding Mode";
prog_char menu3_label[] PROGMEM = "Water Change";
prog_char menu4_label[] PROGMEM = "ATO Clear";
prog_char menu5_label[] PROGMEM = "Overheat Clear";
prog_char menu6_label[] PROGMEM = "PH Calibration";
prog_char menu7_label[] PROGMEM = "Sal Calibration";
prog_char menu8_label[] PROGMEM = "ORP Calibration";
prog_char menu9_label[] PROGMEM = "Date / Time";*/
void MenuEntry1()
{
//Turn All Lights On
if(!InternalMemory.read(CMem_B_LightsEnabled))
{
//Turn All Lights Relays On (except moons)
ReefAngel.Relay.Override(LED_WhiteBlue,1);
ReefAngel.Relay.Override(LED_Supplemental,1);
ReefAngel.Relay.Override(SumpLight,1);
InternalMemory.write(CMem_B_LightsEnabled,true);
//Set PWM to max
//Might not need to, done in loop
}
else
{
//Set Lights to default
ReefAngel.StandardLights(LED_WhiteBlue);
ReefAngel.StandardLights(LED_Supplemental);
ReefAngel.MoonLights(SumpLight);
//Set PWM to normal
InternalMemory.write(CMem_B_LightsEnabled,false);
}
}
void MenuEntry2()
{
//Feeding Mode
ReefAngel.FeedingModeStart();
}
void MenuEntry3()
{
//Water Change
ReefAngel.WaterChangeModeStart();
}
void MenuEntry4()
{
//ATO Clear
ReefAngel.ATOClear();
}
void MenuEntry5()
{
//Overheat Clear
ReefAngel.OverheatClear();
}
void MenuEntry6()
{
//PH Calibration
ReefAngel.SetupCalibratePHExp();
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry7()
{
//Sal Calibration
//ReefAngel.SetupCalibrateSalinity();
//ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}
void MenuEntry8()
{
//ORP Calibration
}
void MenuEntry9()
{
//Date/Time
ReefAngel.SetupDateTime();
ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;
}