Moon rise/set implementation

Share you PDE file with our community

Posts: 137
Joined: Sat Feb 16, 2013 7:44 am
PostPosted: Wed Apr 03, 2013 10:57 am
So the function did not work. So I tweaked it to this:

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


This is outputting during a normal non-over midnight. I wish there was a good way to Unit Test Arduino to validate over midnight.

Posts: 12327
Joined: Fri Mar 18, 2011 6:47 pm
PostPosted: Wed Apr 03, 2013 11:40 am
You can, but you will need to modify the libraries.
Would you like to do that?
Roberto.

Posts: 137
Joined: Sat Feb 16, 2013 7:44 am
PostPosted: Wed Apr 03, 2013 11:44 am
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: 12327
Joined: Fri Mar 18, 2011 6:47 pm
PostPosted: Wed Apr 03, 2013 11:47 am
I used VS with RA just fine :)
Roberto.

Posts: 137
Joined: Sat Feb 16, 2013 7:44 am
PostPosted: Wed Apr 03, 2013 12:29 pm
Wow... That was easy.

Posts: 137
Joined: Sat Feb 16, 2013 7:44 am
PostPosted: Mon Apr 15, 2013 12:07 am
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)));
  }
}
User avatar
Posts: 5362
Joined: Fri Jul 20, 2012 9:42 am
PostPosted: Mon Apr 15, 2013 6:29 am
Awesome!

Posts: 12327
Joined: Fri Mar 18, 2011 6:47 pm
PostPosted: Mon Apr 15, 2013 8:32 am
Thanks!!!
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


then I went and tested PWMParabolaOvernight(22,0,8,0,10,90,5) and got this:
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

Looks like it is missing the starting hour completely.
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)));
  }
}


The only thing is that you will need to change the libraries to perform this test.... :(
You need to change ReefAngel.cpp
From
Code: Select all
   setSyncInterval(SECS_PER_HOUR*6);  // Changed to sync every 6 hours.

To
Code: Select all
   setSyncInterval(SECS_PER_HOUR*6000);  // Changed to sync every 6 hours.

Or the clock will keep syncing with the RTC.
Roberto.

Posts: 137
Joined: Sat Feb 16, 2013 7:44 am
PostPosted: Mon Apr 15, 2013 4:42 pm
I was just testing if you were actually paying attention.... :D

I think my problem is this line:
Code: Select all
if (hour() > startHour) end += 1440; //before midnight


Change it to this
Code: Select all
if (hour() >= startHour) end += 1440; //before midnight

Posts: 12327
Joined: Fri Mar 18, 2011 6:47 pm
PostPosted: Tue Apr 16, 2013 8:33 am
Awesome!!!
I'll include in the next update :)
Roberto.
PreviousNext

Return to My PDE/INO file

Who is online

Users browsing this forum: No registered users and 1 guest

cron