Code: Select all
Compiling code for RA_STAR board
Number of Relay Expansion Modules: 3
Relay Expansion Module
16 Channel Dimming Expansion Module
Dimming Signal
Water Level Expansion Module
Reef Angel Star
Salinity Expansion Module
Multi Channel Water Level Expansion Module
Extra Temperature Probes
D:\Arduino\libraries\RA_PWM\RA_PWM.cpp: In member function 'void RA_PWMClass::SIXTEENChannelPWMSmoothRamp(byte, byte, byte, byte)':
D:\Arduino\libraries\RA_PWM\RA_PWM.cpp:1124:58: error: 'SIXTEENChannelSmoothRamp' was not declared in this scope
SIXTEENChannelSmoothRamp(Channel,Start,End,SlopeLength,0);
^
exit status 1
Progress: 55.17%
Your code has some errors and couldn't be compiled.
Please fix the errors above and try again.
Code: Select all
#include <Salinity.h>
#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_TS.h>
#include <RA_TouchLCD.h>
#include <RA_TFT.h>
#include <RA_TS.h>
#include <Font.h>
#include <RA_Wifi.h>
#include <RA_Wiznet5100.h>
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetDHCP.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_ATO.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 <RA_CustomLabels.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <PAR.h>
#include <DCPump.h>
#include <ReefAngel.h>
#include <SoftwareSerial.h>
////// Place global variable code below here
#define Heater1 Box1_Port1
#define Heater2 Box1_Port3
#define Heater3 Box1_Port5
#define SalExp Box1_Port7
#define ReturnDCP Box1_Port2
#define TopOff Box1_Port4
#define Skimmer Box1_Port6
#define QTFiltHeat Box1_Port8
#define DimExp1 Box2_Port1
#define DimExp2 Box2_Port2
#define SE_600_48 Box2_Port8
#define RODIHeat Box2_Port5
#define SaltH2OHeat Box2_Port7
#define EhiemFeed Box3_Port1
// Define Custom Memory
#define Mem_I_Latitude 100
#define Mem_I_Longitude 102
#define Mem_B_AcclDay 108
#define Mem_B_ResetMemory 117
////// Place global variable code above here
int LEDgroupslvl = 90; // Used for main LED groups 1 - 8 <--- This needs to be moved to internal memory
///// 16ch DImming using Cloud Wifi Hub Expansion code begin
unsigned long last16channelcheck = millis();
int OldPercentage16[16];
byte OldPercentage16Override[16];
char buffer[15];
///// 16ch DImming using Cloud Wifi Hub Expansion code end
long randNumber;
unsigned long lastdircheck = millis();
void init_memory()
{
// Initialize Custom Memory Locations
InternalMemory.write_int(Mem_I_Latitude,39);
InternalMemory.write_int(Mem_I_Longitude,77);
InternalMemory.write(Mem_B_AcclDay,0);
InternalMemory.write(Mem_B_ResetMemory,false);
}
void setup()
{
// This must be the first line
ReefAngel.Init(); //Initialize controller
ReefAngel.Star();
ReefAngel.AddSalinityExpansion(); // Salinity Expanion Module
ReefAngel.AddMultiChannelWaterLevelExpansion(); // Multi-Channel Water Level Expanion Module
ReefAngel.AddExtraTempProbes(); //Add additional temperature probes - Dispaly Temp 4, Temp 5, and Temp 6
ReefAngel.Add16ChPWM(); // Add second Dimming Expansion Module (6 Channel in this code)
randomSeed(now()/SECS_PER_DAY);
// Ports toggled in Feeding Mode
ReefAngel.FeedingModePorts = 0;
ReefAngel.FeedingModePortsE[0] = Port2Bit | Port4Bit | Port6Bit;
ReefAngel.FeedingModePortsE[1] = 0;
ReefAngel.FeedingModePortsE[2] = 0;
// Ports toggled in Water Change Mode
ReefAngel.WaterChangePorts = 0;
ReefAngel.WaterChangePortsE[0] = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port6Bit;
ReefAngel.WaterChangePortsE[1] = 0;
ReefAngel.WaterChangePortsE[2] = 0;
// Ports turned off when Overheat temperature exceeded
ReefAngel.OverheatShutoffPorts = 0;
ReefAngel.OverheatShutoffPortsE[0] = Port1Bit | Port3Bit | Port5Bit | Port6Bit | Port7Bit;
ReefAngel.OverheatShutoffPortsE[1] = 0;
ReefAngel.OverheatShutoffPortsE[2] = 0;
// Ports toggled when Lights On / Off menu entry selected
ReefAngel.LightsOnPorts = 0;
ReefAngel.LightsOnPortsE[0] = 0;
ReefAngel.LightsOnPortsE[1] = 0;
ReefAngel.LightsOnPortsE[2] = 0;
// Use T2 probe as temperature and overheat functions
ReefAngel.TempProbe = T2_PROBE;
ReefAngel.OverheatProbe = T2_PROBE;
// Set the Overheat temperature setting
InternalMemory.OverheatTemp_write( 810 );
// Ports that are always on
ReefAngel.Relay.On( ReturnDCP );
ReefAngel.Relay.On( SalExp );
ReefAngel.Relay.On( QTFiltHeat );
ReefAngel.Relay.On( DimExp1 );
ReefAngel.Relay.On( DimExp2 );
ReefAngel.Relay.On( SE_600_48 );
// Ports that are always off
ReefAngel.Relay.Off( TopOff );
////// Place additional initialization code below here
ReefAngel.DCPump.DaylightChannel = Sync;
ReefAngel.DCPump.Daylight2Channel = AntiSync;
ReefAngel.DCPump.FeedingSpeed = 36;
ReefAngel.DCPump.WaterChangeSpeed = 0;
if ( InternalMemory.read(Mem_B_ResetMemory) ) init_memory();
////// Place additional initialization code above here
}
void loop()
{
ReefAngel.StandardHeater( T2_PROBE,Heater1,760,780 );
ReefAngel.StandardHeater( T2_PROBE,Heater2,750,780 );
ReefAngel.StandardHeater( T2_PROBE,Heater3,740,780 );
ReefAngel.Relay.DelayedOn( Skimmer );
boolean buzzer=false;
if ( ReefAngel.isOverheat() ) buzzer=true;
if ( ReefAngel.isBusLock() ) buzzer=true;
if ( buzzer ) ReefAngel.BuzzerOn(2); else ReefAngel.BuzzerOff();
// ATO/Water functions - Begin
if ( ( hour() == 6 ) && ( minute() >= 45 ) && ( hour() == 6 ) && ( minute() < 48 ) )
{
if ( ReefAngel.WaterLevel.GetLevel(2) <= 72 && ReefAngel.WaterLevel.GetLevel(2) >= 9 ) ReefAngel.Relay.On( TopOff );
if ( ReefAngel.WaterLevel.GetLevel(2) >= 81 || ReefAngel.WaterLevel.GetLevel(2) < 9 || ReefAngel.HighATO.IsActive() ) ReefAngel.Relay.Off( TopOff );
}
if ( ( hour() == 18 ) && ( minute() >= 45 ) && ( hour() == 18 ) && ( minute() < 48 ) )
{
if ( ReefAngel.WaterLevel.GetLevel(2) <= 72 && ReefAngel.WaterLevel.GetLevel(2) >= 9 ) ReefAngel.Relay.On( TopOff );
if ( ReefAngel.WaterLevel.GetLevel(2) >= 81 || ReefAngel.WaterLevel.GetLevel(2) < 9 || ReefAngel.HighATO.IsActive() ) ReefAngel.Relay.Off( TopOff );
}
if ( ReefAngel.WaterLevel.GetLevel(2) <= 36 ) ReefAngel.Relay.Off( ReturnDCP );
if ( ReefAngel.WaterLevel.GetLevel(2) >= 63 ) ReefAngel.Relay.On( ReturnDCP );
if ( ReefAngel.WaterLevel.GetLevel(2) >= 90 || ReefAngel.WaterLevel.GetLevel(1) >= 108 || ReefAngel.HighATO.IsActive() )
{
ReefAngel.Relay.Off( Skimmer );
ReefAngel.Relay.Off( TopOff );
}
// ATO/Water functions - End
if ( ReefAngel.WaterLevel.GetLevel(1) < 72 && ReefAngel.WaterLevel.GetLevel(1) >= 9 ) // Main Heater run dry protection
{
ReefAngel.Relay.Off( Heater1 );
ReefAngel.Relay.Off( Heater2 );
ReefAngel.Relay.Off( Heater3 );
}
if (ReefAngel.WaterLevel.GetLevel(3) < 90 && ReefAngel.WaterLevel.GetLevel(3) >= 9 ) // Quarantine tank run dry protection (no auto topoff)
{
ReefAngel.Relay.Off( QTFiltHeat );
// buzzer=true;
// if ( buzzer ) ReefAngel.BuzzerOn(2); else ReefAngel.BuzzerOff();
}
else ReefAngel.Relay.On( QTFiltHeat );
////// Place your custom code below here
// Gyre Pumps begin
ReefAngel.DCPump.UseMemory = false;
ReefAngel.DCPump.SetMode( Sine,99,63,45 ); // For Sine mode (Mode, Max speed, Cycle duration, Min speed [Threshold in App])
/// Random switching of Gyre directions - 18 % of time
if ( millis() - lastdircheck > 60000 ) // check for direction swicth every var/1000 seconds [currently once a minute]
{
lastdircheck = millis();
randNumber = random(101);
if ( randNumber < 18 )
{
ReefAngel.PWM.SetActinic(100); // Gyre 1 Reverse
ReefAngel.PWM.SetActinic2(0); // Gyre 2 Forward
}
else
{
ReefAngel.PWM.SetActinic(0); // Gyre 1 Forward
ReefAngel.PWM.SetActinic2(100); // Gyre 2 Reverse
}
}
// Gyre Pumps end
// Dosing pump code begin
ReefAngel.DosingPumpRepeat(EhiemFeed,420,720,30);
/*
Used for modified auto feeder
- Feeds at 7am (420 minutes offset from Midnight)
- Feeds at 7pm (720 minutes offset from last feed or feed every 12 hours)
- Feeds for 30 seconds
*/
// Dosing pump end
// 6 channelPWM testing
// for (int a=0;a<6;a++)
// {
// ReefAngel.PWM.SetChannel(a,3);
// }
// ReefAngel.PWM.SetChannel(now()%6,54);
// Lighting
Coralacclimation(); // add acclimation to Lights
int LEDgroupslvlaccl=LEDgroupslvl - Mem_B_AcclDay;
ReefAngel.PWM.SetChannelRaw( 0, PWMParabolaHighRes(7,0,23,0,3,81,1) ); // Blues
ReefAngel.PWM.SetChannelRaw( 1, PWMParabolaHighRes(14,30,22,30,9,63,0) ); // Cool White
ReefAngel.PWM.SetChannelRaw( 2, PWMParabolaHighRes(7,9,23,18,3,81,1) ); // UV Left
ReefAngel.PWM.SetChannelRaw( 3, PWMParabolaHighRes(7,9,23,18,3,81,1) ); // UV Right
ReefAngel.PWM.SetChannelRaw( 4, PWMSlopeHighRes(12,36,21,36,3,LEDgroupslvl,30,0) ); // LED Group 1 - B0
ReefAngel.PWM.SetChannelRaw( 5, PWMSlopeHighRes(12,45,21,45,3,LEDgroupslvl,30,0) ); // LED Group 2 - B1
////// Place your custom code above here
///// 16ch DImming using Cloud Wifi Hub Expansion code begin
// int Led16lvl=40.95*LEDgroupslvl;
// ReefAngel.PWM.Set16Channel( 0, PWMSlope(9,54,20,54,18,LEDgroupslvl,30,0) ); // LED Group 3 - B2
// ReefAngel.PWM.Set16Channel( 1, PWMSlope(10,3,21,3,18,LEDgroupslvl,30,0) ); // LED Group 4 - B3
// ReefAngel.PWM.Set16Channel( 2, PWMSlope(10,12,18,12,18,LEDgroupslvl,30,0) ); // LED Group 5 - C0
// ReefAngel.PWM.Set16Channel( 3, PWMSlope(10,21,21,21,18,LEDgroupslvl,30,0) ); // LED Group 6 - C1
// ReefAngel.PWM.Set16Channel( 4, PWMSlope(10,30,21,30,18,LEDgroupslvl,30,0) ); // LED Group 7 - C2
// ReefAngel.PWM.Set16Channel( 5, PWMSlope(10,39,21,39,18,LEDgroupslvl,30,0) ); // LED Group 8 - C3
// Normalized code for Lights across all groups
for (int z=0;z<6;z++)
{
ReefAngel.PWM.Set16Channel( z , PWMSlope(14,12,21,12,9,LEDgroupslvl,45,0) );
}
if (millis() - last16channelcheck > 1000 && ReefAngel.Network.IsMQTTConnected())
{
last16channelcheck = millis();
for (byte a = 0; a < 6; a++) // a < 16 has been Modified for 6ch Dimming module
{
if (ReefAngel.PWM.SIXTEENChExpansionChannel[a] != OldPercentage16[a])
{
if (a<10)
sprintf(buffer, "%s0%d:%d", "PWM16E", a, ReefAngel.PWM.SIXTEENChExpansionChannel[a]);
else
sprintf(buffer, "%s%d:%d", "PWM16E", a, ReefAngel.PWM.SIXTEENChExpansionChannel[a]);
Serial.println(buffer);
ReefAngel.Network.CloudPublish(buffer);
OldPercentage16[a] = ReefAngel.PWM.SIXTEENChExpansionChannel[a];
}
if (ReefAngel.PWM.SIXTEENChExpansionChannelOverride[a] != OldPercentage16Override[a])
{
if (a<10)
sprintf(buffer, "%s0%d:%d", "PWM16EO", a, ReefAngel.PWM.SIXTEENChExpansionChannelOverride[a]);
else
sprintf(buffer, "%s%d:%d", "PWM16EO", a, ReefAngel.PWM.SIXTEENChExpansionChannelOverride[a]);
Serial.println(buffer);
ReefAngel.Network.CloudPublish(buffer);
OldPercentage16Override[a] = ReefAngel.PWM.SIXTEENChExpansionChannelOverride[a];
}
}
}
///// 16ch DImming using Cloud Wifi Hub Expansion code end
ReefAngel.Network.Cloud();
// This should always be the last line
ReefAngel.ShowTouchInterface();
}
void Coralacclimation()
{
// Start acclimation foutine
byte acclDay=InternalMemory.read(Mem_B_AcclDay);
// See if acclimating Coral
static boolean acclCounterReady=false;
if (now()%SECS_PER_DAY!=0) acclCounterReady=true;
if (now()%SECS_PER_DAY==0 && acclCounterReady && acclDay>0)
{
acclDay--;
acclCounterReady=false;
InternalMemory.write(Mem_B_AcclDay,acclDay);
}
// End acclimation
}
// RA_STRING1=U2FsdGVkX19F8Kk0jJty8c49l7bZE9qgmvWmV0+hTN0=
// RA_STRING2=U2FsdGVkX1/DtmFyHppSDKW+4mDVsuaSdZnDAiMonRs=
// RA_STRING3=K2GVR
// RA_LABEL LABEL_ACTINIC=Gyre 1 Direction
// RA_LABEL LABEL_ACTINIC2=Gyre 2 Direction
// RA_LABEL LABEL_DAYLIGHT=Gyre 1 Speed
// RA_LABEL LABEL_DAYLIGHT2=Gyre 2 Speed
// RA_LABEL LABEL_PORT11=Heater 1
// RA_LABEL LABEL_PORT12=Return DCP-10000
// RA_LABEL LABEL_PORT13=Heater 2
// RA_LABEL LABEL_PORT14=ATO (Level 2)
// RA_LABEL LABEL_PORT15=Heater 3
// RA_LABEL LABEL_PORT16=Skimmer
// RA_LABEL LABEL_PORT17=Salinity expansion
// RA_LABEL LABEL_PORT18=QT heat/filter
// RA_LABEL LABEL_PORT21=Not Used
// RA_LABEL LABEL_PORT22=Dim Exp 1
// RA_LABEL LABEL_PORT23=Dim Exp 2
// RA_LABEL LABEL_PORT24=Not Used
// RA_LABEL LABEL_PORT25=Not Used
// RA_LABEL LABEL_PORT26=Not Used
// RA_LABEL LABEL_PORT27=Not Used
// RA_LABEL LABEL_PORT28=SE_600_48
// RA_LABEL LABEL_PORT31=Not Used