Page 1 of 1

Auto Calibrate Salinity Probe?

Posted: Mon Apr 12, 2021 7:33 am
by howaboutme
Kind of a weird request but any way we can have the controller automatically calibrate the salinity probe at a given time?

Thanks.

Re: Auto Calibrate Salinity Probe?

Posted: Mon Apr 12, 2021 1:04 pm
by binder
howaboutme wrote:Kind of a weird request but any way we can have the controller automatically calibrate the salinity probe at a given time?

Thanks.
well, you could easily trigger the calibration screen but it would still require your interaction.

I think it would require some thought to do an auto calibration without user interaction....probably custom code.

how would you get the probe in the reference solution? in essence you would be continuously calibrating it against the solution you are wanting to monitor unless you are always keeping it in a reference solution. I'm sure you probably have a reason but I'm just a little confused.

Sent from my Pixel 2 using Tapatalk

Re: Auto Calibrate Salinity Probe?

Posted: Mon Apr 12, 2021 1:35 pm
by howaboutme
binder wrote:
howaboutme wrote:Kind of a weird request but any way we can have the controller automatically calibrate the salinity probe at a given time?

Thanks.
well, you could easily trigger the calibration screen but it would still require your interaction.

I think it would require some thought to do an auto calibration without user interaction....probably custom code.

how would you get the probe in the reference solution? in essence you would be continuously calibrating it against the solution you are wanting to monitor unless you are always keeping it in a reference solution. I'm sure you probably have a reason but I'm just a little confused.

Sent from my Pixel 2 using Tapatalk
All good questions. I thought I should have included my rationale initially. Here goes.

I have the RA+ on my AIO nano including salinity module. I am currently running a skimmer in the evening to help maintain PH. Right now, the skimmer (still new) gives out plenty of microbubbles. As we are aware, that spells trouble for salinity readings as my probe is in the same compartment as the skimmer.

My thought is that when the skimmer turns off at X hour/minute, the controller executes the salinity calibration and confirmation automatically and without user interaction 30 minutes later. Essentially, my calibration solution is my tank.

Hope that makes sense. I assume it's some custom code. I'm currently using your android app to start the calibration process as needed.

Thoughts? Thanks!

Re: Auto Calibrate Salinity Probe?

Posted: Tue Apr 13, 2021 4:47 am
by binder
so to make sure I follow, you want the calibration to start and let that calibrate for 30 minutes?

Sent from my Pixel 2 using Tapatalk

Re: Auto Calibrate Salinity Probe?

Posted: Tue Apr 13, 2021 5:21 am
by howaboutme
binder wrote:so to make sure I follow, you want the calibration to start and let that calibrate for 30 minutes?

Sent from my Pixel 2 using Tapatalk
My apologies, I'm still thinking this through.

Example:

Skimmer off at 9 am. Then at 9:30am the controller performs an automatic salinity calibration using the tank water and with no user interaction. This occurs daily.

I know I'm stretching the concept a bit but thought I'd ask. :)

Thoughts?

Re: Auto Calibrate Salinity Probe?

Posted: Wed Apr 14, 2021 7:34 pm
by binder
I follow with what you are wanting to do. I will have to take a look at the libraries more closely and see what all can be done.
do you have a Star or Plus controller?

Sent from my Pixel 2 using Tapatalk

Re: Auto Calibrate Salinity Probe?

Posted: Thu Apr 15, 2021 4:53 am
by howaboutme
binder wrote:I follow with what you are wanting to do. I will have to take a look at the libraries more closely and see what all can be done.
do you have a Star or Plus controller?

Sent from my Pixel 2 using Tapatalk
Thanks Curt! I have a plus. Appreciate the help.

Re: Auto Calibrate Salinity Probe?

Posted: Sat Apr 24, 2021 4:54 am
by binder
just fyi, I haven't forgotten about this topic. I've been thinking about it and looking into the libraries at how it can work. I think I know how to do it but need to get some test code written.

Sent from my Pixel 2 using Tapatalk

Re: Auto Calibrate Salinity Probe?

Posted: Sat Apr 24, 2021 8:42 am
by howaboutme
binder wrote:just fyi, I haven't forgotten about this topic. I've been thinking about it and looking into the libraries at how it can work. I think I know how to do it but need to get some test code written.

Sent from my Pixel 2 using Tapatalk
No worries at all! I'm not in a hurry and know that this request is unique and probably a bit wack. :) Appreciate your help.

Re: Auto Calibrate Salinity Probe?

Posted: Sat Apr 24, 2021 12:37 pm
by binder
Alright, I've been able to do some testing and I think I have something for you. Mind you, I have tested this on a Plus but I do not have it connected to a salinity probe. I've just got it on my desk.

In this code, what we have going on is this:
  • at the specified time (24 hour time format), launch Salinity Calibration mode (ONLY if the controller is on the default menu / main menu, not feeding mode, water change mode, etc)
  • It runs for the specified amount of time
  • once the end time is reached, we are simulating a button press to end the mode (like pressing the joystick button). this ONLY happens if we are in the Salinity Calibration Mode. so if you exit it early, we won't trigger a button press and cause an undesirable response. NOTE: I have not tested that the value gets stored properly into memory but it should since the OK button is selected by default
There are a couple caveats:
  • If there's a power outage and the start time for the auto salinity calibration is missed, it will not trigger again until the next day
  • If you have the controller in feeding mode, water change mode, or are doing something else with it, it will not trigger the auto calibration. You MUST be on the main/home screen (which is what it is by default, even if the display is sleeping).
  • If you exit the auto calibration mode manually, the button press to end the auto calibration will not happen. this is to avoid any undesirable effects.
  • If there's a power failure and the controller reboots during the auto calibration mode, the values will not be saved and the auto calibration will not be re-run until the next day (see the first point listed above).
  • The start time is in 24 hour format.
  • The run time is in minutes.
  • The start time and run time in minutes is hard-coded in the code. This could be switched to use the internal memory locations but will require additional work. Super easy though, I do this for all my dosing times and volumes and can change/update/modify via my Android App using the Custom Memory locations.
Ok, with all this being said, here's the code.

Code: Select all

// THIS CODE GOES ABOVE THE setup() OR loop() functions....somewhere outside the functions

// Set to start at 1:45pm and run for 30 minutes
#define AUTO_SAL_START_HOUR     13
#define AUTO_SAL_START_MINUTE   45
#define AUTO_SAL_RUN_TIME          30

// THIS CODE GOES INSIDE THE loop() FUNCTION //
    // 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++;
      }
    }
Let me know if you have any other questions or want some help switching it over to using Internal Memory.

Re: Auto Calibrate Salinity Probe?

Posted: Sat Apr 24, 2021 1:29 pm
by howaboutme
Thanks Curt! I think I understand. I'll play with this the next few days and report back.

I hope I'm not shooting myself in the foot and defeating the purpose of monitoring salinity. I've been doing this manually and am confident in my ability to keep the tank stable in normal circumstances so I'm comfortable trying this out. We'll see. :)

Re: Auto Calibrate Salinity Probe?

Posted: Sun Apr 25, 2021 6:20 am
by howaboutme
Curt,

Can you check my code? I've adjusted the start time and run time. It compiles with no errors. I just want a 2nd eye before I load and test. Thanks!

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


Re: Auto Calibrate Salinity Probe?

Posted: Sun Apr 25, 2021 2:26 pm
by binder
looks ok. your changing of the time looks good and it appears that you just copied my code (which is expected).

Sent from my Pixel 2 using Tapatalk

Re: Auto Calibrate Salinity Probe?

Posted: Sun Apr 25, 2021 4:03 pm
by howaboutme
Thanks yes. I was more making sure I put your codes in the right place. Will report back.

Re: Auto Calibrate Salinity Probe?

Posted: Tue Apr 27, 2021 7:04 am
by howaboutme
this morning was the first scheduled auto calibration. looks like everything went smoothly. thank you!

Re: Auto Calibrate Salinity Probe?

Posted: Fri Apr 30, 2021 5:27 pm
by binder
howaboutme wrote:this morning was the first scheduled auto calibration. looks like everything went smoothly. thank you!
awesome!
glad to hear that everything appears to be going good.

Sent from my Pixel 2 using Tapatalk