Moon rise/set implementation
Re: Moon rise/set implementation
17:13 to 5:29 for today's schedule...
looks good so far
looks good so far
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
Not sure if you had updated the code attached. The isRise was true outside the rise to set time range. I tried to figure out what is going on, but I got lost quickly with the code as I could not figure out the meaning of the variables. So I went ahead and use a PMWParabola function with the rise and set times, which is working so far... Do you have an updated code file?
Re: Moon rise/set implementation
The isRise variable I believe is only used during the test_moon() function. This is why I stopped using it also and did the same thing as you. The issue though, I don't know if the parabola works properly when spanning over midnight. I used a previously published PWMSlopeOvernight which I have modified to work either overnight or not overnight. It should end up in the libraries next update I believe. Is the parabola working properly for you?
Re: Moon rise/set implementation
Btw, the last code I posted has been updated to the latest and is complete. I haven't done any work on it and it looks like it's working properly. The time is 3 hours off from the coordinates that I am testing with but it could be because we do not really do any time zone on the RA. and the place I have is -3 from GMT... anyway, please test and if you have improvements, I'm all for it. I don't know enough of what's going on and spent like 3 days reading the code to really start tinkering and changing it around. I now have a variable rise/set that matches a moon cylce so I'm happy
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
I'd just like to understand the variable names and what it all means. I haven't seen the PWMSlopeOvernight function, but I wrote this to drive my moon lights.
My question is around MoonPhase and if I am using it right. It appears the value is an index or in this case 0 - 100, so when it returns 1, I should have the lowest value (dimmest light). Knowing that my MeanWell drivers don't turn on until a value of 11 is sent to them. I adjusted the index according (hence the adding of 11).
Code: Select all
byte moonPhase = MoonPhase();
byte moonPWM = 0;
if(moonPhase > 0)
moonPWM = PWMParabola(Moon.riseH, Moon.riseM, Moon.setH, Moon.setM, 10, ((moonPhase / 10) + 11), 0);
Re: Moon rise/set implementation
Yeah. I just don't know that the PWMParabola function will work properly when PM -> AM versus AM->PM. There was an issue with this in the PWMSlope and so a PWMSlopeOVernight was written. Moving forward there will be one PWMSlope function, but again, not sure on the parabola.
You have the moonphase and params correct it looks like.
You have the moonphase and params correct it looks like.
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
I think this should do it:
I'll let you know in a few days.
Code: Select all
byte PWMParabolaOvernight(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte oldValue)
{
unsigned long Start = previousMidnight(now())+((unsigned long)NumMins(startHour, startMinute)*60);
unsigned long End = nextMidnight(now())+((unsigned long)NumMins(endHour, endMinute)*60);
boolean isOvernight=NumMins(startHour,startMinute)>NumMins(endHour,endMinute);
int Now = NumMins(hour(), minute());
if (hour()<startHour && isOvernight) Start-=86400;
if (hour()<startHour || !isOvernight) End-=86400;
byte PWMDelta = endPWM-startPWM;
byte ParabolaPhase=constrain(map(Now,Start,End,0,180),0,180);
if ( Now <= Start || Now >= End)
return oldValue;
else
{
return startPWM+(PWMDelta*sin(radians(ParabolaPhase)));
}
}
Re: Moon rise/set implementation
Let me find you the thread that I posted the overnight/non-overnight code. You should test with that because moonrise could be within the same day or be an overnight event...
Re: Moon rise/set implementation
Original PWMSlopeOvernight
http://forum.reefangel.com/viewtopic.php?p=11781#p11781
My Modification to make it universal
http://forum.reefangel.com/viewtopic.php?p=22384#p22384
Lol nevermind... just read your code... looks like you got my changes
Roberto.. if this works, both fixes should go in together
http://forum.reefangel.com/viewtopic.php?p=11781#p11781
My Modification to make it universal
http://forum.reefangel.com/viewtopic.php?p=22384#p22384
Lol nevermind... just read your code... looks like you got my changes
Roberto.. if this works, both fixes should go in together
Re: Moon rise/set implementation
The slope one is already merged in the dev branch
I'll check out the parabola.
I'll check out the parabola.
Roberto.
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
So the function did not work. So I tweaked it to this:
This is outputting during a normal non-over midnight. I wish there was a good way to Unit Test Arduino to validate over midnight.
Code: Select all
byte PWMParabolaOvernight(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte oldValue)
{
int start = NumMins(startHour, startMinute);
int end = NumMins(endHour, endMinute);
if (start < end)
{
//Example: 2300hrs to 0200hrs
if (hour() < endHour) start -= 1440; //past midnight
if (hour() > startHour) end += 1440; //before midnight
}
int current = NumMins(hour(), minute());
byte pwmDelta = endPWM - startPWM;
byte parabolaPhase = constrain(map(current, start, end, 0, 180), 0, 180);
if ( current <= start || current >= end)
return oldValue;
else
{
return startPWM + (pwmDelta * sin(radians(parabolaPhase)));
}
}
Re: Moon rise/set implementation
You can, but you will need to modify the libraries.
Would you like to do that?
Would you like to do that?
Roberto.
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
I was thinking of using Visual Studio for Unit Testing and even building sketches. Visual Micro for Visual Studio actually allows for step through debugging via the serial port. I am not sure how tweaking the libraries would help here, I just want to run the code out side of the controller
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
Wow... That was easy.
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
Here is the function PWMParabolaOvernight. I have been testing it for over a week and it seems to be behaving properly.
Code: Select all
byte PWMParabolaOvernight(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte oldValue)
{
int start = NumMins(startHour, startMinute);
int end = NumMins(endHour, endMinute);
if (start > end) //Start is greater than End so its over midnight
{
//Example: 2300hrs to 0200hrs
if (hour() < endHour) start -= 1440; //past midnight
if (hour() > startHour) end += 1440; //before midnight
}
int current = NumMins(hour(), minute());
byte pwmDelta = endPWM - startPWM;
byte parabolaPhase = constrain(map(current, start, end, 0, 180), 0, 180);
if ( current <= start || current >= end)
return oldValue;
else
{
return startPWM + (pwmDelta * sin(radians(parabolaPhase)));
}
}
Re: Moon rise/set implementation
Thanks!!!
But it is not working
I tested PWMParabolaOvernight(23,0,8,0,10,90,5) and got this:
then I went and tested PWMParabolaOvernight(22,0,8,0,10,90,5) and got this:
Looks like it is missing the starting hour completely.
Here is the test code I used:
The only thing is that you will need to change the libraries to perform this test....
You need to change ReefAngel.cpp
From
To
Or the clock will keep syncing with the RTC.
But it is not working
I tested PWMParabolaOvernight(23,0,8,0,10,90,5) and got this:
Code: Select all
23 0 5
23 1 5
23 2 5
23 3 5
23 4 5
23 5 5
23 6 5
23 7 5
23 8 5
23 9 5
23 10 5
23 11 5
23 12 5
23 13 5
23 14 5
23 15 5
23 16 5
23 17 5
23 18 5
23 19 5
23 20 5
23 21 5
23 22 5
23 23 5
23 24 5
23 25 5
23 26 5
23 27 5
23 28 5
23 29 5
23 30 5
23 31 5
23 32 5
23 33 5
23 34 5
23 35 5
23 36 5
23 37 5
23 38 5
23 39 5
23 40 5
23 41 5
23 42 5
23 43 5
23 44 5
23 45 5
23 46 5
23 47 5
23 48 5
23 49 5
23 50 5
23 51 5
23 52 5
23 53 5
23 54 5
23 55 5
23 56 5
23 57 5
23 58 5
23 59 5
0 0 37
0 1 37
0 2 37
0 3 38
0 4 38
0 5 38
0 6 39
0 7 39
0 8 39
0 9 41
0 10 41
0 11 41
0 12 42
0 13 42
0 14 42
0 15 43
0 16 43
0 17 43
0 18 45
0 19 45
0 20 45
0 21 46
0 22 46
0 23 46
0 24 47
0 25 47
0 26 47
0 27 48
0 28 48
0 29 48
0 30 50
0 31 50
0 32 50
0 33 51
0 34 51
0 35 51
0 36 52
0 37 52
0 38 52
0 39 53
0 40 53
0 41 53
0 42 54
0 43 54
0 44 54
0 45 55
0 46 55
0 47 55
0 48 57
0 49 57
0 50 57
0 51 58
0 52 58
0 53 58
0 54 59
0 55 59
0 56 59
0 57 60
0 58 60
0 59 60
Code: Select all
22 0 5
22 1 5
22 2 5
22 3 5
22 4 5
22 5 5
22 6 5
22 7 5
22 8 5
22 9 5
22 10 5
22 11 5
22 12 5
22 13 5
22 14 5
22 15 5
22 16 5
22 17 5
22 18 5
22 19 5
22 20 5
22 21 5
22 22 5
22 23 5
22 24 5
22 25 5
22 26 5
22 27 5
22 28 5
22 29 5
22 30 5
22 31 5
22 32 5
22 33 5
22 34 5
22 35 5
22 36 5
22 37 5
22 38 5
22 39 5
22 40 5
22 41 5
22 42 5
22 43 5
22 44 5
22 45 5
22 46 5
22 47 5
22 48 5
22 49 5
22 50 5
22 51 5
22 52 5
22 53 5
22 54 5
22 55 5
22 56 5
22 57 5
22 58 5
22 59 5
23 0 34
23 1 34
23 2 34
23 3 34
23 4 36
23 5 36
23 6 36
23 7 37
23 8 37
23 9 37
23 10 38
23 11 38
23 12 38
23 13 38
23 14 39
23 15 39
23 16 39
23 17 41
23 18 41
23 19 41
23 20 42
23 21 42
23 22 42
23 23 42
23 24 43
23 25 43
23 26 43
23 27 45
23 28 45
23 29 45
23 30 46
23 31 46
23 32 46
23 33 46
23 34 47
23 35 47
23 36 47
23 37 48
23 38 48
23 39 48
23 40 50
23 41 50
23 42 50
23 43 50
23 44 51
23 45 51
23 46 51
23 47 52
23 48 52
23 49 52
23 50 53
23 51 53
23 52 53
23 53 53
23 54 54
23 55 54
23 56 54
23 57 55
23 58 55
23 59 55
0 0 57
0 1 57
0 2 57
0 3 57
0 4 58
0 5 58
0 6 58
0 7 59
0 8 59
0 9 59
0 10 60
0 11 60
0 12 60
0 13 60
0 14 61
0 15 61
0 16 61
0 17 62
0 18 62
0 19 62
0 20 63
0 21 63
0 22 63
0 23 63
0 24 64
0 25 64
0 26 64
0 27 65
0 28 65
0 29 65
0 30 66
0 31 66
0 32 66
0 33 66
0 34 67
0 35 67
0 36 67
0 37 68
0 38 68
0 39 68
0 40 69
0 41 69
0 42 69
0 43 69
0 44 70
0 45 70
0 46 70
0 47 71
0 48 71
0 49 71
0 50 72
0 51 72
0 52 72
0 53 72
0 54 73
0 55 73
0 56 73
0 57 73
0 58 73
0 59 73
Here is the test code I used:
Code: Select all
#include <Salinity.h>
#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 <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>
int test=0;
void setup()
{
ReefAngel.Init();
}
void loop()
{
wdt_reset();
adjustTime(60);
Serial.print(hour());
Serial.print("\t");
Serial.print(minute());
Serial.print("\t");
Serial.println(PWMParabolaOvernight(22,0,8,0,10,90,5));
delay(10);
if (test++>2500)
while(1) wdt_reset();
}
byte PWMParabolaOvernight(byte startHour, byte startMinute, byte endHour,
byte endMinute, byte startPWM, byte endPWM, byte oldValue)
{
int start = NumMins(startHour, startMinute);
int end = NumMins(endHour, endMinute);
if (start > end) //Start is greater than End so its over midnight
{
//Example: 2300hrs to 0200hrs
if (hour() < endHour) start -= 1440; //past midnight
if (hour() > startHour) end += 1440; //before midnight
}
int current = NumMins(hour(), minute());
byte pwmDelta = endPWM - startPWM;
byte parabolaPhase = constrain(map(current, start, end, 0, 180), 0, 180);
if ( current <= start || current >= end)
return oldValue;
else
{
return startPWM + (pwmDelta * sin(radians(parabolaPhase)));
}
}
You need to change ReefAngel.cpp
From
Code: Select all
setSyncInterval(SECS_PER_HOUR*6); // Changed to sync every 6 hours.
Code: Select all
setSyncInterval(SECS_PER_HOUR*6000); // Changed to sync every 6 hours.
Roberto.
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
I was just testing if you were actually paying attention....
I think my problem is this line:
Change it to this
I think my problem is this line:
Code: Select all
if (hour() > startHour) end += 1440; //before midnight
Code: Select all
if (hour() >= startHour) end += 1440; //before midnight
Re: Moon rise/set implementation
Fantastic.. now both the slope and parabola functions will work am-pm or pm-am
-
- Posts: 137
- Joined: Sat Feb 16, 2013 7:44 am
Re: Moon rise/set implementation
Here is the code for the slope. its based off of Parabola
Code: Select all
byte PWMSlopeOvernight(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte Duration, byte oldValue)
{
int start = NumMins(startHour, startMinute);
int end = NumMins(endHour, endMinute);
if (start > end) //Start is greater than End so its over midnight
{
//Example: 2300hrs to 0200hrs
if (hour() < endHour) start -= 1440; //past midnight
if (hour() >= startHour) end += 1440; //before midnight
}
int current = NumMins(hour(), minute());
int startD = start + Duration;
int stopD = end - Duration;
if ( current >= start && current <= startD )
return constrain(map(current, start, startD, startPWM, endPWM),startPWM, endPWM);
else if ( current >= stopD && current <= end )
{
byte v = constrain(map(current, stopD, end, startPWM, endPWM),startPWM, endPWM);
return endPWM - v + startPWM;
}
else if ( current > startD && current < stopD )
return endPWM;
// lastly return the existing value
return oldValue;
}
Moon rise/set implementation
If the logic works then yeah. This matches the parabola logic and looks more like the original code than the original overnight that I started from...
Moon rise/set implementation
The only con I see is the logic to add/subtract time only focuses on hours...if someone were to use it for a slope with less time or if someone wanted a slope/parabola from 11:55pm - 11:05pm...it might have an issue..maybe not... That would be the only point to check IMO.
Moon rise/set implementation
I think actually it may be fine after reading it again...
Re: Moon rise/set implementation
Hello
I just signed up for this forum today to seek help with the moon.h library.
and as I am apparently too new to send a PM I shall post here. Hopefully this thread is not dead yet.
I am attempting to implement my own arduino tank controller, nothing fancy tank wise just my little 29 planted tank.
I started to learn the arduino in November for this purpose and have come a long way in the short about of time I have been chugging along and learning a lot in the process. =)
So I stumbled across this thread and the moon.h library, and real moon times is something i would really like to implement.
This might sound pathetic... but i am stuck on step 2
I have put
and the ide recognizes that as a valid library
no complaints their
But when I put
into the program, is complains
I have tried putting it elsewhere in the setup loop, outside theloop, different places within the loop. going as far as to delete everything else, except the necessary libraries wire.h, time.h, DS1307RTC.h.
Do you guys have any ideas as to why this would not be working? I am at a complete loss.
I am appreciative of any assistance offered.
-Jay
I just signed up for this forum today to seek help with the moon.h library.
and as I am apparently too new to send a PM I shall post here. Hopefully this thread is not dead yet.
I am attempting to implement my own arduino tank controller, nothing fancy tank wise just my little 29 planted tank.
I started to learn the arduino in November for this purpose and have come a long way in the short about of time I have been chugging along and learning a lot in the process. =)
So I stumbled across this thread and the moon.h library, and real moon times is something i would really like to implement.
This might sound pathetic... but i am stuck on step 2
I have put
Code: Select all
#included moon.h
no complaints their
But when I put
Code: Select all
moon_init(21,-73);
into the program, is complains
Code: Select all
moon_test.ino: In function 'void loop()':
moon_test:26: error: 'moon_init' was not declared in this scope
Do you guys have any ideas as to why this would not be working? I am at a complete loss.
I am appreciative of any assistance offered.
-Jay
Re: Moon rise/set implementation
Welcome and good luck. Try this instead..Aemornion wrote:
I have putCode: Select all
#included moon.h
Code: Select all
#include "moon.h"
Re: Moon rise/set implementation
Thanks for the reply and assistance lnevo. =)
Alrght, so I made an error in my above statement, When i was
doing
I was actually doing
Which is what i do with all my other libraries standard with no issue.
Last night I did run through other iterations, such as using "" as you suggest which are outlined below.
Doing
yields an error of
(hence why i starting making <> standard a while ago)
and when i try
yields an error of
However the moon library is available under the arduino ide, being in the contributed section of the
sketch->importlibrary drop down menu, and when i select it to re import it, it tells me that their is already an moon library.
I should also note that these errors were acquired with the
code removed.
Here is my total code with all the fat trimmed off.
I left the RTC stuff in their because I am assuming that the moon.h library needs it at some point.
Thank you for any help,
=Jay
Alrght, so I made an error in my above statement, When i was
doing
Code: Select all
#included moon.h
Code: Select all
#included <moon.h>
Last night I did run through other iterations, such as using "" as you suggest which are outlined below.
Doing
Code: Select all
#included moon.h
Code: Select all
moon_test.ino:5:10: error: #include expects "FILENAME" or <FILENAME>
and when i try
Code: Select all
#include "moon.h"
Code: Select all
moon_test.ino:5:18: error: moon.h: No such file or directory
sketch->importlibrary drop down menu, and when i select it to re import it, it tells me that their is already an moon library.
I should also note that these errors were acquired with the
Code: Select all
moon_init(21,-73);
code removed.
Here is my total code with all the fat trimmed off.
Code: Select all
/////////moon.h test Program//////////
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <moon.h>
void setup()
{
//moon_init(21,-73);
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop()
{
//moon_init(21,-73);
}
Thank you for any help,
=Jay