Howaboutme's Code

Share you PDE file with our community
Post Reply
howaboutme
Posts: 245
Joined: Tue Jan 28, 2014 11:10 am
Location: Northern VA

Howaboutme's Code

Post by howaboutme »

For the record and so I can link to this on threads.

The below is for a now broken down tank:

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 <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
            ReefAngel.Use2014Screen();  // Let's use 2014 Screen
            // Ports toggled in Feeding Mode
            ReefAngel.FeedingModePorts = Port1Bit | Port5Bit;
            // Ports toggled in Water Change Mode
            ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port5Bit | Port6Bit | Port8Bit;
            // Ports toggled when Lights On / Off menu entry selected
            ReefAngel.LightsOnPorts = Port3Bit | Port4Bit;
            // Ports turned off when Overheat temperature exceeded
            ReefAngel.OverheatShutoffPorts = Port8Bit;
            // Use T1 probe as temperature and overheat functions
            ReefAngel.TempProbe = T1_PROBE;
            ReefAngel.OverheatProbe = T1_PROBE;

            // Feeeding and Water Change mode speed
            ReefAngel.DCPump.FeedingSpeed=0;
            ReefAngel.DCPump.WaterChangeSpeed=0;
           

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

            ////// Place additional initialization code below here
                   
        ReefAngel.CustomLabels[0]="ATO Pump"; 
        ReefAngel.CustomLabels[1]="Skimmer"; 
        ReefAngel.CustomLabels[2]="LEDWhite"; 
        ReefAngel.CustomLabels[3]="LEDBlue"; 
        ReefAngel.CustomLabels[4]="WP25"; 
        ReefAngel.CustomLabels[5]="DoserAlk"; 
        ReefAngel.CustomLabels[6]="Unused"; 
        ReefAngel.CustomLabels[7]="Heater";  

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

        void loop()
        {
            ReefAngel.SingleATOLow( Port1 );
            ReefAngel.DayLights( Port3 );
            ReefAngel.ActinicLights( Port4 );
            ReefAngel.Relay.DelayedOn( Port5 );
            ReefAngel.DosingPumpRepeat1( Port6 );
            ReefAngel.StandardHeater( Port8 );
            ReefAngel.DCPump.UseMemory = true;
            ReefAngel.DCPump.DaylightChannel = None;
            ReefAngel.DCPump.ActinicChannel = Sync;
            ////// Place your custom code below here
            if (ReefAngel.DCPump.Mode==Custom)
              {
              if ( (now()%SECS_PER_DAY >= 77400) || (now()%SECS_PER_DAY<= 34200) )
              {
                ReefAngel.PWM.SetActinic(32); // Constant at 32% on sync mode
              }
              else if ( (now()%SECS_PER_DAY >= 34200) && (now()%SECS_PER_DAY<= 48600) )
              {
                ReefAngel.PWM.SetActinic(36); // Constant at 36% on sync mode
              }
              else if ( (now()%SECS_PER_DAY >= 48600) && (now()%SECS_PER_DAY<= 77400) )
              {
                ReefAngel.PWM.SetActinic( ElseMode(41,8,true));   // Else on sync mode, 41 +/- 8%
              }
            }
            
            ////DoserAlk Schedule
              if ((hour() > 10) && (hour() < 22)) { // Between 10am and 10pm we will disable Port 6
              ReefAngel.Relay.Off(Port6);
            }
            ////Water change delay for Port 1
          static time_t wcTimer;
          if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
          if (now()-wcTimer > 0 && now()-wcTimer < 600) {
          ReefAngel.Relay.Off(Port1);
          }
          else {ReefAngel.SingleATOLow (Port1 );
          }

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

            // This should always be the last line
            ReefAngel.Portal( "howaboutme" );
            ReefAngel.ShowInterface();
       }

        byte ElseMode( byte MidPoint, byte Offset, boolean WaveSync )
        {
          // Static's only initialize the first time they are called
          static unsigned long LastChange=millis();        // Set the inital time that the last change occurred
          static int Delay = random( 500, 3000);           // Set the initial delay
          static int NewSpeed = MidPoint;                  // Set the initial speed
          static int AntiSpeed = MidPoint;                 // Set the initial anti sync speed
          if ((millis()-LastChange) > Delay)               // Check if the delay has elapsed
          {
            Delay=random(500,5000);                        // If so, come up with a new delay
            int ChangeUp = random(Offset);                 // Amount to go up or down
            if (random(100)<50)                            // 50/50 chance of speed going up or going down
            {
              NewSpeed = MidPoint - ChangeUp;
              AntiSpeed = MidPoint + ChangeUp;
            }
            else
            {
              NewSpeed = MidPoint + ChangeUp;
              AntiSpeed = MidPoint - ChangeUp;
            }
            LastChange=millis();                           // Reset the time of the last change
          }
          if (WaveSync)
          {
            return NewSpeed;
          }
          else
          {
            return AntiSpeed;
          }
        }

Key Attributes
- Able to control pump settings via portal
- When in "custom mode": WP-25 is in else mode between 1:30pm and 9:30pm, constant mode at 32% between 9:30pm and 9:30am and 36% between 9:30am and 1:30pm.
- Doses Alk 12 times a day, once per hour between 10:00pm and 10:00am, controlled via portal
- Added ATO Low code to support my Avast ATO.

This one is for the current tank for record:

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 <ReefAngel.h>

////// Place global variable code below here

// Set to start at 9:45am and run for 10 minutes
    #define AUTO_SAL_START_HOUR     9
    #define AUTO_SAL_START_MINUTE   45
    #define AUTO_SAL_RUN_TIME       10

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


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Use2014Screen();  // Let's use 2014 Screen 
    ReefAngel.AddSalinityExpansion();  // Salinity Expansion Module
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port5Bit;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port5Bit | Port8Bit;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port2Bit | Port3Bit | Port8Bit;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Salinity Temp Compensation
    ReefAngel.Salinity.SetCompensation(0);

    // Ports that are always on
    ReefAngel.Relay.On( Port3 );
    ReefAngel.Relay.On( Port4 );
    ReefAngel.Relay.On( Port5 );

    ////// Place additional initialization code below here
    
        ReefAngel.CustomLabels[0]="ATO Pump"; 
        ReefAngel.CustomLabels[1]="Skimmer"; 
        ReefAngel.CustomLabels[2]="Light"; 
        ReefAngel.CustomLabels[3]="Nero3"; 
        ReefAngel.CustomLabels[4]="Return Pump"; 
        ReefAngel.CustomLabels[5]="Unused"; 
        ReefAngel.CustomLabels[6]="Unused"; 
        ReefAngel.CustomLabels[7]="Heater"; 

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

void loop()
{  
    ReefAngel.SingleATOLow( Port1 );
    ReefAngel.StandardLights( Port2 ); // putting skimmer on timer
    ReefAngel.StandardHeater( Port8 );
    
    ////// Place your custom code below here
    
     // First 10 minutes after WC disable ATO for port 1
          static time_t wcTimer;
          if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
          if (now()-wcTimer > 0 && now()-wcTimer < 600) {
          ReefAngel.Relay.Off(Port1);
          }
          else {ReefAngel.SingleATOLow (Port1 );
          }

    // Compute the current time
    int CurrentTime = NumMins(hour(), minute());
    // Compute the starting time for the auto salinity calibration
    int AutoSalStartTime = NumMins(AUTO_SAL_START_HOUR, AUTO_SAL_START_MINUTE);
    // Compute the ending time for the auto salinity calibration by adding in the run time
    int AutoSalEndTime = AutoSalStartTime + AUTO_SAL_RUN_TIME;

    // Check if it's time to start the auto salinity calibration
    if (  AutoSalStartTime == CurrentTime ) {
      // Switch to Salinity Calibration ONLY if we are on the main / default menu
      // Don't switch to the calibration menu if we are doing something else (water change, feeding, etc)
      if ( (ReefAngel.DisplayedMenu == DEFAULT_MENU) || (ReefAngel.DisplayedMenu == MAIN_MENU) ) {
        ReefAngel.ChangeMode = SAL_CALIBRATE_MENU;
      }
    }
    // Check if we are at the end of the Run Time for the auto salinity calibration
    if ( AutoSalEndTime == CurrentTime ) {
      // Simulate a button press ONLY if we are still on the Salinity Calibration menu screen
      if (ReefAngel.DisplayedMenu == SAL_CALIBRATE_MENU) {
        ButtonPress++;
      }
    }
    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "howaboutme" );
    ReefAngel.ShowInterface();
}
Key attributes:
- Water change pump delay
- Salinity temp compensation
- Put skimmer on timer by setting it to daylight and controlled via portal
- Auto calibrate salinity probe to compensate for having the skimmer on overnight

This one's for my new UNS 75s tank:

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 <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
    ReefAngel.Use2014Screen();  // Let's use 2014 Screen 
    ReefAngel.AddSalinityExpansion();  // Salinity Expansion Module
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port1Bit | Port2Bit | Port5Bit;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port8Bit;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port2Bit | Port8Bit;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Salinity Temp Compensation
    ReefAngel.Salinity.SetCompensation(0);

    // Ports that are always on
    ReefAngel.Relay.On( Port3 );
    ReefAngel.Relay.On( Port4 );
    ReefAngel.Relay.On( Port5 );
    ReefAngel.Relay.On( Port8 );

    ////// Place additional initialization code below here
    
        ReefAngel.CustomLabels[0]="ATO Pump"; 
        ReefAngel.CustomLabels[1]="Skimmer"; 
        ReefAngel.CustomLabels[2]="MP10 Left"; 
        ReefAngel.CustomLabels[3]="MP 10 Right"; 
        ReefAngel.CustomLabels[4]="Return Pump"; 
        ReefAngel.CustomLabels[5]="Doser Alk"; 
        ReefAngel.CustomLabels[6]="Unused"; 
        ReefAngel.CustomLabels[7]="Inkbird"; 

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

void loop()
{  
    ReefAngel.SingleATOLow( Port1 );
    ReefAngel.StandardLights( Port2 ); // putting skimmer on timer
    ReefAngel.Relay.DelayedOn(Port3 );
    ReefAngel.Relay.DelayedOn(Port4 );
    ReefAngel.DosingPumpRepeat1( Port6 )
    
    ////// Place your custom code below here
    
     //DoserAlk Schedule
              ;if ((hour() > 10) && (hour() < 22)) { // Between 10am and 10pm we will disable Port 6
              ReefAngel.Relay.Off(Port6);
            }    
     // First 10 minutes after WC disable ATO for port 1
          static time_t wcTimer;
          if (ReefAngel.DisplayedMenu == WATERCHANGE_MODE) wcTimer=now();
          if (now()-wcTimer > 0 && now()-wcTimer < 600) {
          ReefAngel.Relay.Off(Port1);
          }
          else {ReefAngel.SingleATOLow (Port1 );
          }
    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "howaboutme" );
    ReefAngel.ShowInterface();
}
Key attributes:
- Water change pump delay
- Salinity temp compensation
- Put skimmer on timer by setting it to daylight and controlled via portal
Last edited by howaboutme on Fri Oct 28, 2022 2:16 pm, edited 19 times in total.
Jack
Ridwaan
Posts: 32
Joined: Thu Apr 03, 2014 11:37 pm

Re: Howaboutme's Code

Post by Ridwaan »

howaboutme wrote:For the record and so I can link to this on threads.

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 <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
            ReefAngel.Use2014Screen();  // Let's use 2014 Screen
            // Ports toggled in Feeding Mode
            ReefAngel.FeedingModePorts = Port5Bit;
            // Ports toggled in Water Change Mode
            ReefAngel.WaterChangePorts = Port2Bit | Port5Bit | Port6Bit | Port8Bit;
            // Ports toggled when Lights On / Off menu entry selected
            ReefAngel.LightsOnPorts = Port3Bit | Port4Bit;
            // Ports turned off when Overheat temperature exceeded
            ReefAngel.OverheatShutoffPorts = Port8Bit;
            // Use T1 probe as temperature and overheat functions
            ReefAngel.TempProbe = T1_PROBE;
            ReefAngel.OverheatProbe = T1_PROBE;

            // Feeeding and Water Change mode speed
            ReefAngel.DCPump.FeedingSpeed=0;
            ReefAngel.DCPump.WaterChangeSpeed=0;
           

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

            ////// Place additional initialization code below here
                   
        ReefAngel.CustomLabels[0]="Unused"; 
        ReefAngel.CustomLabels[1]="Skimmer"; 
        ReefAngel.CustomLabels[2]="LEDWhite"; 
        ReefAngel.CustomLabels[3]="LEDBlue"; 
        ReefAngel.CustomLabels[4]="WP25"; 
        ReefAngel.CustomLabels[5]="DoserAlk"; 
        ReefAngel.CustomLabels[6]="Unused"; 
        ReefAngel.CustomLabels[7]="Heater";  

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

        void loop()
        {
            ReefAngel.DayLights( Port3 );
            ReefAngel.ActinicLights( Port4 );
            ReefAngel.Relay.DelayedOn( Port5 );
            ReefAngel.DosingPumpRepeat1( Port6 );
            ReefAngel.StandardHeater( Port8 );
            ReefAngel.DCPump.UseMemory = true;
            ReefAngel.DCPump.DaylightChannel = None;
            ReefAngel.DCPump.ActinicChannel = Sync;
            ////// Place your custom code below here
            if (ReefAngel.DCPump.Mode==Custom)
              {
              if ( (now()%SECS_PER_DAY >= 77400) || (now()%SECS_PER_DAY<= 34200) )
              {
                ReefAngel.PWM.SetActinic(32); // Constant at 32% on sync mode
              }
              else if ( (now()%SECS_PER_DAY >= 34200) && (now()%SECS_PER_DAY<= 48600) )
              {
                ReefAngel.PWM.SetActinic(36); // Constant at 36% on sync mode
              }
              else if ( (now()%SECS_PER_DAY >= 48600) && (now()%SECS_PER_DAY<= 77400) )
              {
                ReefAngel.PWM.SetActinic( ElseMode(41,8,true));   // Else on sync mode, 41 +/- 8%
              }
            }
            
            ////DoserAlk Schedule
              if ((hour() > 10) && (hour() < 22)) { // Between 10am and 10pm we will disable Port 6
              ReefAngel.Relay.Off(Port6);
            }

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

            // This should always be the last line
            ReefAngel.Portal( "howaboutme" );
            ReefAngel.ShowInterface();
       }

        byte ElseMode( byte MidPoint, byte Offset, boolean WaveSync )
        {
          // Static's only initialize the first time they are called
          static unsigned long LastChange=millis();        // Set the inital time that the last change occurred
          static int Delay = random( 500, 3000);           // Set the initial delay
          static int NewSpeed = MidPoint;                  // Set the initial speed
          static int AntiSpeed = MidPoint;                 // Set the initial anti sync speed
          if ((millis()-LastChange) > Delay)               // Check if the delay has elapsed
          {
            Delay=random(500,5000);                        // If so, come up with a new delay
            int ChangeUp = random(Offset);                 // Amount to go up or down
            if (random(100)<50)                            // 50/50 chance of speed going up or going down
            {
              NewSpeed = MidPoint - ChangeUp;
              AntiSpeed = MidPoint + ChangeUp;
            }
            else
            {
              NewSpeed = MidPoint + ChangeUp;
              AntiSpeed = MidPoint - ChangeUp;
            }
            LastChange=millis();                           // Reset the time of the last change
          }
          if (WaveSync)
          {
            return NewSpeed;
          }
          else
          {
            return AntiSpeed;
          }
        }
Key Attributes
- Able to control pump settings via portal
- When in "custom mode": WP-25 is in else mode between 1:30pm and 9:30pm, constant mode at 32% between 9:30pm and 9:30am and 36% between 9:30am and 1:30pm.
- Doses Alk 12 times a day, once per hour between 10:00pm and 10:00am, controlled via portal
WOW, thanks
Ive got it now...
Post Reply