Custom Dosing

Do you have a question on how to do something.
Ask in here.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Custom Dosing

Post by chachew »

Im needing to Dose Alk, Mag and Cal on three different pumps for various seconds per day.

For Example:
6am - Pump(Box1_Port1) comes on for 12 seconds
7am - Pump(Box1_Port2) comes on for 9 seconds
8am - Pump(Box1_Port3) comes on for 2 seconds

I would ideally like to have this in a custom menu that i can change on the fly from the reef controller menu but if i can hard code it for now that would be the easiest and the fastest. I need a bullet prof way of doing it so i dont over dose the tank and eff it up :(

I was thinking something like:

Code: Select all

    if( (hour() == 6) && (minute() == 00) )
      ReefAngel.Relay.On(Box1_Port1);
    else
      ReefAngel.Relay.Off(Box1_Port1);

What are your suggestions?
Last edited by chachew on Wed Feb 27, 2013 4:12 pm, edited 1 time in total.
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Do you have wifi? You can set the values in a memory location and change them on fly...
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Easiest function to use would be this...


void ReefAngelClass::DosingPump ( byte DPRelay,
byte OnHour,
byte OnMinute,
int RunTime
)


So...

DosingPump(Box1_Port1, 6, 0, 12);
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Lnevo, i do have the wifi attachment. How do i know the memory location of specific ports? Also, the above function would go in the setup() or loop() section of the code?
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

loop()

To put it into a memory location you would change the seconds to be a function call

InternalMemory.read(100);

Then in memory location 100 you would put 12...

To do that you'd do the following http://reefangelwifi:2000/mb100,12

To check the location, just leave off the ,12

Global memory locations start at 200 using locations sorting at 100 should be fine. Each pump would have a separate location.

There are predefined variables for dosing pump 1 and 2 that you could use also and ones for the onhour and onminute.. Take a look at Globals/Globals.h in the libraries file to see all the definitions...

If you set these up you can just define dosing pump 1 and 2 to use memory for everything...

DosingPump1(Box1_Port1); and the rest would come from memory...same for pump 2.

Only pump 3 would need the custom memory locations..

Also, you should be able to set the dosing pump 1 and 2 locations in the InternalMemory locations in the portal...
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

So in my loop() section i would add:

Code: Select all

void ReefAngelClass::DosingPump(Box1_Port1, 6, 0, InternalMemory.read(100));
void ReefAngelClass::DosingPump(Box1_Port2, 7, 0, InternalMemory.read(101));
void ReefAngelClass::DosingPump(Box1_Port3, 8, 0, InternalMemory.read(102));
And then Add the seconds to each memory location as follows:

Code: Select all

http://reefangelwifi:2000/mb100,12
http://reefangelwifi:2000/mb101,9
http://reefangelwifi:2000/mb102,2
That way i can easily change the run time of each pump via the portal or my android app correct?
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

You don't need the void ReefAngelClass: part...but yeah, sounds like you got it.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Awesome, ill try it here shortly. Thanks for the help
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

So will this work?

Code: Select all

    ReefAngel.DosingPump(Box1_Port1, InternalMemory.read(100), InternalMemory.read(101), InternalMemory.read(102));
    ReefAngel.DosingPump(Box1_Port2, InternalMemory.read(103), InternalMemory.read(104), InternalMemory.read(105));
    ReefAngel.DosingPump(Box1_Port3, InternalMemory.read(106), InternalMemory.read(107), InternalMemory.read(108));
Seems like it errors unless i use:

Code: Select all

    ReefAngel.DosingPumpRepeat(Box1_Port1, InternalMemory.read(100), InternalMemory.read(101), InternalMemory.read(102));
    ReefAngel.DosingPumpRepeat(Box1_Port2, InternalMemory.read(103), InternalMemory.read(104), InternalMemory.read(105));
    ReefAngel.DosingPumpRepeat(Box1_Port3, InternalMemory.read(106), InternalMemory.read(107), InternalMemory.read(108));
Also are the memory locations suppose to be byte or int?
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Runtime needs to be an int from what it looks like. You have the concept down. Keep in mind there are already mem locations defined for dosing pump 1 and 2 you can use and modify through the portal interface, but your way will work too.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

So does this function work? I seem to always get an error when it tries to compile the code when this function is used

Code: Select all

void ReefAngel.DosingPump( byte DPRelay, byte DPTimer, byte OnHour, byte OnMinute, int RunTime )
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Re: Custom Dosing

Post by lnevo »

What is the error you are getting? Can you paste it...

You should be doing something like this... no "void"

ReefAngel.DosingPump(Relay, Timer, OnHour, OnMinute, Runtime);

where all those are variables or values. If variables they should all be byte except for Runtime.

There is also another function that leaves off the Timer... I think that's the one you should use...

ReefAngel.DosingPump(Relay, OnHour, OnMinute, Runtime);

Easiest way is to use the following as a test

ReefAngel.DosingPump(Port1,6,0,30);

Does that compile for you?
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Code: Select all

NewCodeWithEXP2_26_13.cpp.o: In function `loop':
C:\Users\Matt\AppData\Local\Temp\build9212269777689315176.tmp/NewCodeWithEXP2_26_13.cpp:89: undefined reference to `ReefAngelClass::DosingPump(unsigned char, unsigned char, unsigned char, int)'
I get this error when trying to upload: ReefAngel.DosingPump(Port1,6,0,30);
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Hmmm... Something is odd for sure. It compiles without it? I guess we need Roberto to confirm the syntax...maybe I'm missing something.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Yea without it it compiles perfectly. :(
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Re: Custom Dosing

Post by lnevo »

Ok, I found the issue... the function is declared but never defined which is why it doesn't fail immediately when compiling...

So, this function does not exist...

ReefAngel.DosingPump(Relay, OnHour, OnMinute, Runtime);

You need to use this one as you mentioned...

ReefAngel.DosingPump(Relay, Timer, OnHour, OnMinute, Runtime);

So, the following should compile for you..

ReefAngel.DosingPump(Port1,1,6,0,30);

Where 1 is the timer we are going to use.. I believe the ReefAngel class has 4 defined and 4 is used for Portal. Not sure, but some people (like me..) use 1 for other things...like my Vortech modes. so use what works for you, just don't use 4 :)
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Re: Custom Dosing

Post by lnevo »

The ReefAngel class has 6 built in timers 0-5...

They are defined as follows

#define FEEDING_TIMER 0
#define LCD_TIMER 3
#define PORTAL_TIMER 4
#define STORE_PARAMS_TIMER 5

According to the declaration also, they are defined as such

Timers:
0 - Feeding Mode timer
1 - Wavemaker 1 or Dosing Pump 1
2 - Wavemaker 2 or Dosing Pump 2
3 - Backlight timer / Sleep timer
4 - Portal
5 - Store params to eeprom
*/

So really 1 and 2 should be reserved for WaveMaker or DosingPumps... you don't need multiple for your purposes though..

We should probably have users (like myself...) not use the ReefAngel.Timer[] timers... I should change my code and declare my own Timer for future... just seems like a bad habit to get people into..

Lee
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Re: Custom Dosing

Post by lnevo »

:( Actually the way DosingPump() works, the DPTimer should be one of the 0-5 timers that are defined int the ReefAngel class...

Since it's called with the following..

Timer[DPTimer].SetInterval(RunTime);
Timer[DPTimer].Start();

where DPTimer is the timer number you pass in the function... so stick with 1 or 2 and like I said...

We may need Roberto to comment further since you need 3.. if the same one can be used each time (your declaring the runtime each time anyway...)
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

So since not more than 1 dosing pump will ever be running at the same time, then i can use the same timer for all three dosers correct?
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Potentially...but i'd like to hear from roberto on the topic...
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom Dosing

Post by rimai »

Yes, you can use same timer for all 3 as long as they are not simultaneously turning on.
Roberto.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Well i just tried it and it looks like it fails. The first doser fires as it should but the other two do not :(

EDIT: Actually i had something set wrong...it appears to be working but not exactly. The first relay to use the timer works flawlessly, the second and third relay turn on but NEVER turn off
Last edited by chachew on Thu Feb 28, 2013 7:34 pm, edited 1 time in total.
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

:(
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

Try using 1 and 2.. See if youd get 2/3 working..
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom Dosing

Post by rimai »

Yeah... It won't work... :( Sorry
Try this:

Code: Select all

ReefAngel.Relay.Set(Port1,hour()=6 && minute()=0 && second()<30);
Roberto.
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

I edited my above post for my findings. Is there no other way to have 3 dosing timers? :(
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

Ill try your code above Rimai, is that as reliable as the other function?
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Custom Dosing

Post by rimai »

Basically the same code, except the code above will only let you run the doser for a max of 60s as opposed to the other that would let you run for more than 60s.
Roberto.
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Custom Dosing

Post by lnevo »

If you did need more than 60s you could just do the same command with minute==1 and continue where you left off...
User avatar
chachew
Posts: 84
Joined: Sat Aug 04, 2012 11:52 pm
Location: Pearland, TX

Re: Custom Dosing

Post by chachew »

rimai wrote:Yeah... It won't work... :( Sorry
Try this:

Code: Select all

ReefAngel.Relay.Set(Port1,hour()=6 && minute()=0 && second()<30);

Code: Select all

NewCodeWithEXP2_26_13.cpp: In function 'void loop()':
NewCodeWithEXP2_26_13:77: error: lvalue required as left operand of assignment
I get this error on compile
Post Reply