From: Arjen Baart Date: Fri, 3 Apr 2020 06:19:40 +0000 (+0200) Subject: Separate functions to calculate sunrise and sunset X-Git-Url: http://www.andromeda.nl/gitweb/?a=commitdiff_plain;h=c6ca2ac390f3cfb7bed0202aeca3facd611a59ea;p=wakeup.git Separate functions to calculate sunrise and sunset --- diff --git a/src/Makefile.am b/src/Makefile.am index 702824d..ebf5eb9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = wakeup pwm curtain lightcontrol sunrise read_serial +bin_PROGRAMS = wakeup pwm curtain lightcontrol read_serial wakeup_SOURCES = wakeup.cpp event.cpp pwm_SOURCES = pwm.c diff --git a/src/sunrise.cpp b/src/sunrise.cpp index bfd4346..65b943f 100644 --- a/src/sunrise.cpp +++ b/src/sunrise.cpp @@ -4,50 +4,69 @@ #include #include -int main() +// Calculate the time of sunrise in timezone UTC. + +hour calculate_sunrise(double latitude, double longitude, date when) { - // Hardinxveld: - double latitude = 51.821366; - double longitude = 4.844401; - double labda_y = latitude * M_PI / 180.0; + float Declanation; + float solaroffset; + float h0; - hour utctime = now(false); - hour localtime = now(true); + hour midday(12, 0, 0); + + double labda_y = latitude * M_PI / 180.0; // Declanation of the sun as determined by the tilt of the earth's axis. - float Declanation; - Declanation = -23.44 * cos(2 * M_PI * (today(false).YearDay() + 10) / 365); - //delta_s = math.radians (Declanation) - std::cout << "Solar declanation: " << Declanation << "\n"; + Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365); // The earth rotates 15 degrees in 1 hour - float solaroffset; solaroffset = longitude / 15.0 * 3600; // In seconds - std::cout << "Solar offset = " << solaroffset << " seconds.\n"; - - float h0; - h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0))); - std::cout << " h0 = " << h0 << " h0 hours = " << h0 * 12 / M_PI << "\n"; - long sunseconds = h0 * 12.0 / M_PI * 3600; hour sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60); - // Calculate the times of sunrise and sunset + // Calculate the time of sunrise + + hour sunrise = midday - sunseconds; + sunrise = sunrise - hour(long(solaroffset)); + return sunrise; + +} + +// Calculate the time of sunset in timezone UTC. + +hour calculate_sunset(double latitude, double longitude, date when) +{ + float Declanation; + float solaroffset; + float h0; hour midday(12, 0, 0); - hour sunrise = midday - sunseconds; - sunrise = sunrise - hour(long(solaroffset)) + (localtime - utctime); - std::cout << "Sunrise at " << sunrise << "\n"; + double labda_y = latitude * M_PI / 180.0; + + // Declanation of the sun as determined by the tilt of the earth's axis. + + Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365); + + // The earth rotates 15 degrees in 1 hour + + solaroffset = longitude / 15.0 * 3600; // In seconds + + h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0))); + + long sunseconds = h0 * 12.0 / M_PI * 3600; + hour sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60); + + // Calculate the time of sunset hour sunset = midday + sunseconds; - sunset = sunset - hour(long(solaroffset)) + (localtime - utctime); - std::cout << "Sunset at " << sunset << "\n"; + sunset = sunset - hour(long(solaroffset)); + return sunset; } diff --git a/test/Makefile.am b/test/Makefile.am index f1a54f3..e1a2aa4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2,6 +2,7 @@ TESTS = lightctrl lightctrl-oor lightctrl-fade $(check_PROGRAMS) check_output AM_CPPFLAGS = -I../src LDADD = -lTachyon -lACL -check_PROGRAMS = wakeup_load_events +check_PROGRAMS = wakeup_load_events sunrise_test wakeup_load_events_SOURCES = wakeup_load_events.cpp ../src/event.cpp +sunrise_test_SOURCES = sunrise_test.cpp ../src/sunrise.cpp diff --git a/test/sunrise_test.cpp b/test/sunrise_test.cpp new file mode 100644 index 0000000..5f00e82 --- /dev/null +++ b/test/sunrise_test.cpp @@ -0,0 +1,40 @@ +/* + * test sunrise and sunset functions. + */ + +#include + +#include + +// Hardinxveld: +const double latitude = 51.821366; +const double longitude = 4.844401; + +extern hour calculate_sunrise(double latitude, double longtitude, date when); +extern hour calculate_sunset(double latitude, double longtitude, date when); + +int main() +{ + date when; + hour sunrise_at, sunset_at; + + when = date(1, 1, 2020); + + std::cout << "On the date " << when << ":\n"; + sunrise_at = calculate_sunrise(latitude, longitude, when); + std::cout << "Sunrise : " << sunrise_at << " UTC.\n"; + sunset_at = calculate_sunset(latitude, longitude, when); + std::cout << "Sunset : " << sunset_at << " UTC.\n"; + assert(sunrise_at == hour(7, 51, 29)); + assert(sunset_at == hour(15, 29, 47)); + + when = date(30, 6, 2020); + + std::cout << "On the date " << when << ":\n"; + sunrise_at = calculate_sunrise(latitude, longitude, when); + std::cout << "Sunrise : " << sunrise_at << " UTC.\n"; + sunset_at = calculate_sunset(latitude, longitude, when); + std::cout << "Sunset : " << sunset_at << " UTC.\n"; + assert(sunrise_at == hour(3, 29, 3)); + assert(sunset_at == hour(19, 52, 13)); +} diff --git a/test/sunrise_test.exp b/test/sunrise_test.exp new file mode 100644 index 0000000..410989f --- /dev/null +++ b/test/sunrise_test.exp @@ -0,0 +1,7 @@ +On the date 01-01-2020: +Sunrise : 07:51:29 UTC. +Sunset : 15:29:47 UTC. +On the date 30-06-2020: +Sunrise : 03:29:03 UTC. +Sunset : 19:52:13 UTC. +PASS sunrise_test (exit status: 0)