Re: Mike's RSM 500 Code
Posted: Wed Jun 22, 2016 6:13 pm
You aren't turning anything back on when the power comes up. You can either explicitly add it, or move all your on statements from setup() into loop()
Community discussion about Reef Angel Controllers and reefing related subjects
http://forum.reefangel.com/
Code: Select all
void CheckPower() {
static time_t powerOutage=false;
static WiFiAlert powerAlert;
// Power Outage - turn off everything
if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && !powerOutage) // Expansion Relay NOT present
{
byte rfPowerOutageSpeed=InternalMemory.read(Mem_B_PowerOutageSpeed);
powerOutage=now();
if (now()-powerOutage > 300) {
ReefAngel.Relay.Set(Return, now()%3600<300);
}
ReefAngel.Relay.Off(FlowPumps);
ReefAngel.Relay.Off(Lights);
ReefAngel.Relay.Off(Skimmer);
ReefAngel.Relay.Off(FanSump);
ReefAngel.Relay.Off(HeaterSump);
ReefAngel.RF.SetMode(Constant,rfPowerOutageSpeed,0);
if (now()-powerOutage > 10) { // Wait 10 seconds before sending to avoid false alarms
powerAlert.Send("Power+outage!");
}
}
// Power Restored - Turn things back on
if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY))
{
powerOutage=0;
LastStart=now();
ReefAngel.RF.SetMode(vtMode,vtSpeed,vtDuration);
powerAlert.Send("Power+restored.",true);
}
}
Code: Select all
sketch_rsms500:64: error: expected ',' or '...' before numeric constant
sketch_rsms500.cpp: In function 'void loop()':
sketch_rsms500:64: error: too few arguments to function 'void WaterchangeHeater(byte, int)'
sketch_rsms500:144: error: at this point in file
sketch_rsms500.cpp: At global scope:
sketch_rsms500:256: error: expected ',' or '...' before numeric constant
Code: Select all
#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <PAR.h>
#include <WiFiAlert.h>
#include <ReefAngel.h>
// Define Custom Memory Locations
#define Mem_B_SwabbieRepeat 100
#define Mem_B_SwabbieTime 101
#define Mem_B_PowerOutageSpeed 102
#define Mem_I_WCHeaterLowTemp 103
#define Mem_I_WCHeaterHighTemp 105
// Define Named Relay Ports
#define FlowPumps 1
#define Lights 2
#define Return 3
#define VortechL 4
#define VortechR 5
#define Skimmer 6
#define FanSump 7
#define HeaterSump 8
#define Reactor Box1_Port1
#define Swabbie Box1_Port2
#define FugeLight Box1_Port3
#define Unused Box1_Port4
#define WCMix Box1_Port5
#define WCFlow Box1_Port6
#define WCHeater Box1_Port7
#define Bad Box1_Port8
// Place global variable code below here
// Vortech Variables for PowerOutage
// byte vtMode, vtSpeed, vtDuration;
// Place global variable code above here
// #################### Setup (controller starting) ####################
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Use2014Screen(); // Let's use 2014 Screen
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = 0;
ReefAngel.FeedingModePortsE[0] = Port8Bit; //Unused port for testing random feeding
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = Port1Bit | Port3Bit; // Flowpumps,Return
ReefAngel.WaterChangePortsE[0] = Port1Bit | Port3Bit; // Reactor,FugeLight
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = Port2Bit; //Lights
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = Port2Bit | Port8Bit; //Lights,HeaterSump
// Use T1 probe as temperature and overheat functions
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T1_PROBE;
// ON by default
ReefAngel.Relay.On(FlowPumps);
ReefAngel.Relay.On(Return);
ReefAngel.Relay.On(VortechL);
ReefAngel.Relay.On(VortechR);
// OFF by default
ReefAngel.Relay.Off(Swabbie);
ReefAngel.Relay.Off(WCMix);
ReefAngel.Relay.Off(WCFlow);
ReefAngel.Relay.Off(WCHeater);
ReefAngel.Relay.Off(Unused);
ReefAngel.Relay.Off(Bad);
// ##### Place additional initialization code below here #####
// Define labels for LCD screen
ReefAngel.CustomLabels[0]="Flow Pumps";
ReefAngel.CustomLabels[1]="Lights";
ReefAngel.CustomLabels[2]="Return";
ReefAngel.CustomLabels[3]="Vortech L";
ReefAngel.CustomLabels[4]="Vortech R";
ReefAngel.CustomLabels[5]="Skimmer";
ReefAngel.CustomLabels[6]="Fan";
ReefAngel.CustomLabels[7]="Heater";
ReefAngel.CustomLabels[Box1_Port1Label] = "Reactor";
ReefAngel.CustomLabels[Box1_Port2Label] = "Swabbie";
ReefAngel.CustomLabels[Box1_Port3Label] = "Fuge Light";
ReefAngel.CustomLabels[Box1_Port4Label] = "Unused";
ReefAngel.CustomLabels[Box1_Port5Label] = "WCMix";
ReefAngel.CustomLabels[Box1_Port6Label] = "WCFlow";
ReefAngel.CustomLabels[Box1_Port7Label] = "WCHeater";
ReefAngel.CustomLabels[Box1_Port8Label] = "Bad";
// 5 second timer for power outage detection
ReefAngel.Timer[1].SetInterval( 5 );
}
// #################### Loop ####################
void loop()
{
ReefAngel.Relay.On(Reactor);
ReefAngel.StandardHeater(HeaterSump);
ReefAngel.StandardFan(FanSump);
ReefAngel.StandardLights(Lights);
ReefAngel.StandardLights(FugeLight,22,0,6,0);
ReefAngel.Relay.DelayedOn(Skimmer);
// ##### Place your custom code below here #####
RunSwabbie(); // Skimmer neck cleaner
SetRF(); // Set Vortech modes
CheckPower(); // Monitor for power loss
CheckSwitches(); // Monitor float switches
WaterchangeHeater(); // Heater control for Waterchange Heater
// ##### Place your custom code above here #####
// This should always be the last line
ReefAngel.Portal("modulok");
ReefAngel.ShowInterface();
}
// #################### Custom Function ####################
void CheckPower()
{
static boolean powerOutage = false;
static WiFiAlert powerAlert;
static boolean delayedPowerOutage = false;
// Power Outage - Leave Only Vortech Pumps active
if ( !ReefAngel.Relay.IsRelayPresent( EXP1_RELAY ) ) {
powerOutage = true; //Expansion Relay 1 has lost power
}
if ( !powerOutage ) {
ReefAngel.Timer[1].Start();
}
if ( ReefAngel.Timer[1].IsTriggered() ) {
delayedPowerOutage = true;
}
if (delayedPowerOutage) {
ReefAngel.Relay.Off(FlowPumps);
ReefAngel.Relay.Off(Return);
ReefAngel.Relay.Off(Skimmer);
ReefAngel.Relay.Off(Lights);
ReefAngel.Relay.Off(FanSump);
ReefAngel.Relay.Off(HeaterSump);
ReefAngel.RF.SetMode(Constant,70,0);
powerAlert.Send("Power+lost!");
}
// Power Restored - return equipment back to normal power state
if ( powerOutage && ReefAngel.Relay.IsRelayPresent( EXP1_RELAY ) ) {
powerOutage = false;
delayedPowerOutage = false;
LastStart = now();
ReefAngel.Relay.On(FlowPumps);
ReefAngel.Relay.On(Return);
powerAlert.Send("Power+restored.",true);
}
}
void CheckSwitches() {
static boolean returnOverride=true;
static WiFiAlert skimmerAlert, atoAlert;
skimmerAlert.SetDelay(3600);
atoAlert.SetDelay(3600);
if (ReefAngel.DisplayedMenu==FEEDING_MODE || ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
returnOverride=true;
// HighATO=off, Skimmer shuts off
if (!ReefAngel.HighATO.IsActive()) {
skimmerAlert.Send("Skimmate+container+is+full!+Skimmer+has+been+shutoff.");
ReefAngel.Relay.Override(Skimmer,0);
}
// If Return pump is off, kill power to Skimmer
if (!ReefAngel.Relay.Status(Return)) {
ReefAngel.Relay.Override(Skimmer,0);
}
// Alert if ATO timeout flag
if (bitRead(ReefAngel.AlertFlags,ATOTimeOutFlag))
atoAlert.Send("ATO+timeout!+ATO+disabled.");
}
void SetRF() {
// Vortech MP40 | Constant | Lagoon | ReefCrest | ShortWave 1=10ms | LongWave 1=1s | NutrientTransport 1=10ms | TidalSwell
if ( ReefAngel.DisplayedMenu != FEEDING_MODE || ReefAngel.DisplayedMenu != WATERCHANGE_MODE ) {
if ( hour() >= 16 && hour() <= 20 ) {
ReefAngel.RF.UseMemory = false;
ReefAngel.RF.SetMode( LongWave, 70, 30 );
}
else if ( hour() >= 20 || hour() < 7 ) {
ReefAngel.RF.UseMemory = false;
ReefAngel.RF.SetMode( ReefCrest, 40, 0 );
}
else {
ReefAngel.RF.UseMemory = true;
}
}
}
void RunSwabbie() {
int repeat=InternalMemory.read(Mem_B_SwabbieRepeat)*60;
int runtime=InternalMemory.read(Mem_B_SwabbieTime)*60;
static time_t t;
// Manual mode
if (ReefAngel.Relay.isMaskOn(Swabbie)) {
ReefAngel.Relay.Auto(Swabbie);
t=now();
}
if (now()-t < runtime) {
ReefAngel.Relay.On(Swabbie);
}
else {
ReefAngel.DosingPumpRepeat(Swabbie,0,repeat,runtime);
}
}
void WaterchangeHeater(byte WCHeaterRelay, int Mem_I_WCHeaterLowTemp, int Mem_I_WCHeaterHighTemp)
{
if (ReefAngel.Params.Temp[T3_PROBE] == 0) return; // Don't turn the heater on if the temp is reading 0
if (ReefAngel.Params.Temp[T3_PROBE] <= Mem_I_WCHeaterLowTemp && ReefAngel.Params.Temp[T3_PROBE] > 0) ReefAngel.Relay.On(WCHeater); // If sensor temperature <= LowTemp - turn on heater
if (ReefAngel.Params.Temp[T3_PROBE] >= Mem_I_WCHeaterHighTemp) ReefAngel.Relay.Off(WCHeater); // If sensor temperature >= HighTemp - turn off heater
}
// #################### Custom Function End ####################