From dca9d96957a9c0156224ef9e84a152462e5b78e2 Mon Sep 17 00:00:00 2001 From: norbert-walter Date: Fri, 1 Apr 2022 17:44:39 +0200 Subject: [PATCH] Implementation of sunrise and sunset --- ...0ExtensionPort.cpp => OBP60Extensions.cpp} | 49 ++++++++++++++- ...OBP60ExtensionPort.h => OBP60Extensions.h} | 2 + lib/obp60task/OBPSensorTask.cpp | 61 +------------------ lib/obp60task/PageApparentWind.cpp | 2 +- lib/obp60task/PageBME280.cpp | 2 +- lib/obp60task/PageBattery.cpp | 2 +- lib/obp60task/PageBattery2.cpp | 2 +- lib/obp60task/PageClock.cpp | 52 +++++++--------- lib/obp60task/PageDST810.cpp | 2 +- lib/obp60task/PageFourValues.cpp | 2 +- lib/obp60task/PageFourValues2.cpp | 2 +- lib/obp60task/PageKeelPosition.cpp | 2 +- lib/obp60task/PageOneValue.cpp | 2 +- lib/obp60task/PageRudderPosition.cpp | 2 +- lib/obp60task/PageThreeValues.cpp | 2 +- lib/obp60task/PageTwoValues.cpp | 2 +- lib/obp60task/PageVoltage.cpp | 2 +- lib/obp60task/PageWhite.cpp | 2 +- lib/obp60task/PageWindRose.cpp | 2 +- lib/obp60task/config.json | 24 ++++---- lib/obp60task/obp60task.cpp | 17 +++++- 21 files changed, 118 insertions(+), 117 deletions(-) rename lib/obp60task/{OBP60ExtensionPort.cpp => OBP60Extensions.cpp} (78%) rename lib/obp60task/{OBP60ExtensionPort.h => OBP60Extensions.h} (92%) diff --git a/lib/obp60task/OBP60ExtensionPort.cpp b/lib/obp60task/OBP60Extensions.cpp similarity index 78% rename from lib/obp60task/OBP60ExtensionPort.cpp rename to lib/obp60task/OBP60Extensions.cpp index 661a8c7..dff6ef5 100644 --- a/lib/obp60task/OBP60ExtensionPort.cpp +++ b/lib/obp60task/OBP60Extensions.cpp @@ -1,9 +1,10 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include +#include "SunRise.h" // Lib for sunrise and sunset calculation #include "Pagedata.h" #include "OBP60Hardware.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" // Please dont forget to declarate the fonts in OBP60ExtensionPort.h #include "Ubuntu_Bold8pt7b.h" @@ -121,6 +122,7 @@ void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color){ display.fillTriangle(x, y, x+size*2, y, x+size, y+size*2, color); } +// Show header informations void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time){ static bool heartbeat = false; @@ -217,4 +219,49 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa } } +// Sunset und sunrise calculation +SensorData calcSunsetSunrise(double time, double date, double latitude, double longitude, double timezone){ + SensorData returnset; + SunRise sr; + int secPerHour = 3600; + int secPerYear = 86400; + sr.hasRise = false; + sr.hasSet = false; + time_t sunR = 0; + time_t sunS = 0; + int inthrSR = 0; + int intminSR = 0; + int inthrSS = 0; + int intminSS = 0; + + // Calculate local time + time_t t = (date * secPerYear) + (time + int(timezone * secPerHour)); + +// api->getLogger()->logDebug(GwLog::DEBUG,"... PageClock: Lat %f, Lon %f, at: %d, next SR: %d (%s), next SS: %d (%s)", latitude, longitude, t, sunR, sSunR, sunS, sSunS); + + if (!isnan(time) && !isnan(date) && !isnan(latitude) && !isnan(longitude) && !isnan(timezone)) { + sr.calculate(latitude, longitude, t); // LAT, LON, EPOCH + // Sunrise + if (sr.hasRise) { + sunR = (sr.riseTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes + inthrSR = int (sunR / secPerHour); + intminSR = int((sunR - inthrSR * secPerHour)/60); + } + // Sunset + if (sr.hasSet) { + sunS = (sr.setTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes + inthrSS = int (sunS / secPerHour); + intminSS = int((sunS - inthrSS * secPerHour)/60); + } + } + // Return values + returnset.sunsetHour = inthrSS; + returnset.sunsetMinute = intminSS; + returnset.sunriseHour = inthrSR; + returnset.sunriseMinute = intminSR; + +// api->getLogger()->logDebug(GwLog::DEBUG,"... PageClock: at t: %d, hasRise: %d, next SR: %d '%s', hasSet: %d, next SS: %d '%s'\n", t, sr.hasRise, sr.riseTime, sSunR, sr.hasSet, sr.setTime, sSunS); + return returnset; +} + #endif \ No newline at end of file diff --git a/lib/obp60task/OBP60ExtensionPort.h b/lib/obp60task/OBP60Extensions.h similarity index 92% rename from lib/obp60task/OBP60ExtensionPort.h rename to lib/obp60task/OBP60Extensions.h index 10090b2..c6a30b6 100644 --- a/lib/obp60task/OBP60ExtensionPort.h +++ b/lib/obp60task/OBP60Extensions.h @@ -42,4 +42,6 @@ void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color); void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time); // Draw display header +SensorData calcSunsetSunrise(double time, double date, double latitude, double longitude, double timezone); // Calulate sunset and sunrise + #endif \ No newline at end of file diff --git a/lib/obp60task/OBPSensorTask.cpp b/lib/obp60task/OBPSensorTask.cpp index c67ca56..748cfbc 100644 --- a/lib/obp60task/OBPSensorTask.cpp +++ b/lib/obp60task/OBPSensorTask.cpp @@ -12,9 +12,8 @@ #include "N2kMessages.h" #include "NMEA0183.h" #include "ObpNmea0183.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" #include "movingAvg.h" // Lib for moving average building -#include "SunRise.h" // Lib for sunrise and sunset calculation // Timer Interrupts for hardware functions void underVoltageDetection(); @@ -53,50 +52,6 @@ void underVoltageDetection(){ undervoltage = false; } } -/* -SensorData calcSunsetSunrise(double time, double date, double latitude, double longitude, int timezone){ - SensorData returnset; - SunRise sr; - int secPerHour = 3600; - int secPerYear = 86400; - sr.hasRise = false; - sr.hasSet = false; - time_t sunR = 0; - time_t sunS = 0; - int inthrSR = 0; - int intminSR = 0; - int inthrSS = 0; - int intminSS = 0; - - // Calculate local time - time_t t = (date * secPerYear) + (time + int(timezone * secPerHour)); - -// api->getLogger()->logDebug(GwLog::DEBUG,"... PageClock: Lat %f, Lon %f, at: %d, next SR: %d (%s), next SS: %d (%s)", latitude, longitude, t, sunR, sSunR, sunS, sSunS); - - if (!isnan(time) && !isnan(date) && !isnan(latitude) && !isnan(longitude) && !isnan(timezone)) { - sr.calculate(latitude, longitude, t); // LAT, LON, EPOCH - // Sunrise - if (sr.hasRise) { - sunR = (sr.riseTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes - inthrSR = int (sunR / secPerHour); - intminSR = int((sunR - inthrSR * secPerHour)/60); - } - // Sunset - if (sr.hasSet) { - sunS = (sr.setTime + int(timezone * secPerHour) + 30) % secPerYear; // add 30 seconds: round to minutes - inthrSS = int (sunS / secPerHour); - intminSS = int((sunS - inthrSS * secPerHour)/60); - } - } - // Return values - returnset.sunsetHour = inthrSS; - returnset.sunsetMinute = intminSS; - returnset.sunriseHour = inthrSR; - returnset.sunriseMinute = intminSR; -// api->getLogger()->logDebug(GwLog::DEBUG,"... PageClock: at t: %d, hasRise: %d, next SR: %d '%s', hasSet: %d, next SS: %d '%s'\n", t, sr.hasRise, sr.riseTime, sSunR, sr.hasSet, sr.setTime, sSunS); - return returnset; -} -*/ // Initialization for all sensors (RS232, I2C, 1Wire, IOs) //#################################################################################### @@ -140,17 +95,7 @@ void sensorTask(void *param){ Timer1.start(); // Start Timer1 for undervoltage detection } Timer2.start(); // Start Timer2 for blinking LED -/* - // Calculate sunset and sunrise at start time - double actTime = 0; - double actDate = 0; - double actLatitude = 53.23; - double actLongitude = 9.16; - int actTimeZone = api->getConfig()->getConfigItem(api->getConfig()->timeZone, true)->asInt(); -// GwApi::BoatValue *date = boatValues.findValueOrCreate("GPSD"); // Load GpsDate -// GwApi::BoatValue *time = boatValues.findValueOrCreate("GPST"); // Load GpsTime - sensors = calcSunsetSunrise(actTime, actDate, actLatitude, actLongitude, actTimeZone); // copy sunrise and sunset to sensor data -*/ + // Settings for NMEA0183 String nmea0183Mode = api->getConfig()->getConfigItem(api->getConfig()->serialDirection, true)->asString(); api->getLogger()->logDebug(GwLog::LOG, "NMEA0183 Mode is: %s", nmea0183Mode); @@ -285,7 +230,7 @@ void sensorTask(void *param){ else{ api->getLogger()->logDebug(GwLog::LOG,"Modul 1 INA226 found"); shuntResistor = SHUNT_VOLTAGE / float(shunt1.toInt()); // Calculate shunt resisitor for max. shunt voltage 75mV - maxCurrent = float(shunt1.toInt()); + maxCurrent = shunt1.toFloat(); api->getLogger()->logDebug(GwLog::LOG,"Calibation INA226, Imax:%3.0fA Rs:%7.5fOhm Us:%5.3f", maxCurrent, shuntResistor, SHUNT_VOLTAGE); // ina226_1.setMaxCurrentShunt(maxCurrent, shuntResistor); ina226_1.setMaxCurrentShunt(10, 0.01); // Calibration with fix values (because the original values outer range) diff --git a/lib/obp60task/PageApparentWind.cpp b/lib/obp60task/PageApparentWind.cpp index cb94b43..6cba2d8 100644 --- a/lib/obp60task/PageApparentWind.cpp +++ b/lib/obp60task/PageApparentWind.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageApparentWind : public Page { diff --git a/lib/obp60task/PageBME280.cpp b/lib/obp60task/PageBME280.cpp index a0f1fe4..4d19b87 100644 --- a/lib/obp60task/PageBME280.cpp +++ b/lib/obp60task/PageBME280.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageBME280 : public Page { diff --git a/lib/obp60task/PageBattery.cpp b/lib/obp60task/PageBattery.cpp index e6a312d..ff6e6a7 100644 --- a/lib/obp60task/PageBattery.cpp +++ b/lib/obp60task/PageBattery.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageBattery : public Page { diff --git a/lib/obp60task/PageBattery2.cpp b/lib/obp60task/PageBattery2.cpp index b9ec80b..467e0d9 100644 --- a/lib/obp60task/PageBattery2.cpp +++ b/lib/obp60task/PageBattery2.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageBattery2 : public Page { diff --git a/lib/obp60task/PageClock.cpp b/lib/obp60task/PageClock.cpp index 8222a2a..6ab6f2d 100644 --- a/lib/obp60task/PageClock.cpp +++ b/lib/obp60task/PageClock.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageClock : public Page { @@ -147,45 +147,39 @@ public: } // Show values sunrise - display.setTextColor(textcolor); - if(holdvalues == false){ - display.setFont(&Ubuntu_Bold8pt7b); - display.setCursor(335, 65); - display.print("06:32"); // Value - display.setFont(&Ubuntu_Bold12pt7b); - display.setCursor(335, 95); - display.print("SunR"); // Name + String sunrise = ""; + if(valid1 == true && valid2 == true){ + sunrise = String(commonData.data.sunriseHour) + ":" + String(commonData.data.sunriseMinute); } else{ - display.setFont(&Ubuntu_Bold8pt7b); - display.setCursor(335, 65); - display.print("06:32"); // Value - display.setFont(&Ubuntu_Bold12pt7b); - display.setCursor(335, 95); - display.print("SunR"); // Name + sunrise = "---"; } + display.setTextColor(textcolor); + display.setFont(&Ubuntu_Bold8pt7b); + display.setCursor(335, 65); + display.print(sunrise); // Value + display.setFont(&Ubuntu_Bold12pt7b); + display.setCursor(335, 95); + display.print("SunR"); // Name // Horizintal separator right display.fillRect(340, 149, 80, 3, pixelcolor); // Show values sunset - display.setTextColor(textcolor); - if(holdvalues == false){ - display.setFont(&Ubuntu_Bold8pt7b); - display.setCursor(335, 250); - display.print("18:22"); // Value - display.setFont(&Ubuntu_Bold12pt7b); - display.setCursor(335, 220); - display.print("SunS"); // Name + String sunset = ""; + if(valid1 == true && valid2 == true){ + sunset= String(commonData.data.sunsetHour) + ":" + String(commonData.data.sunsetMinute); } else{ - display.setFont(&Ubuntu_Bold8pt7b); - display.setCursor(335, 250); - display.print("18:22"); // Value - display.setFont(&Ubuntu_Bold12pt7b); - display.setCursor(335, 220); - display.print("SunS"); // Name + sunset = "---"; } + display.setTextColor(textcolor); + display.setFont(&Ubuntu_Bold8pt7b); + display.setCursor(335, 250); + display.print(sunset); // Value + display.setFont(&Ubuntu_Bold12pt7b); + display.setCursor(335, 220); + display.print("SunS"); // Name //******************************************************************************************* diff --git a/lib/obp60task/PageDST810.cpp b/lib/obp60task/PageDST810.cpp index cab1a59..7a9c596 100644 --- a/lib/obp60task/PageDST810.cpp +++ b/lib/obp60task/PageDST810.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageDST810 : public Page { diff --git a/lib/obp60task/PageFourValues.cpp b/lib/obp60task/PageFourValues.cpp index e5841fd..4b4cf58 100644 --- a/lib/obp60task/PageFourValues.cpp +++ b/lib/obp60task/PageFourValues.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageFourValues : public Page { diff --git a/lib/obp60task/PageFourValues2.cpp b/lib/obp60task/PageFourValues2.cpp index 4a3680b..a036631 100644 --- a/lib/obp60task/PageFourValues2.cpp +++ b/lib/obp60task/PageFourValues2.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageFourValues2 : public Page { diff --git a/lib/obp60task/PageKeelPosition.cpp b/lib/obp60task/PageKeelPosition.cpp index 816fbda..3d56cca 100644 --- a/lib/obp60task/PageKeelPosition.cpp +++ b/lib/obp60task/PageKeelPosition.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageKeelPosition : public Page { diff --git a/lib/obp60task/PageOneValue.cpp b/lib/obp60task/PageOneValue.cpp index 59a927f..643afba 100644 --- a/lib/obp60task/PageOneValue.cpp +++ b/lib/obp60task/PageOneValue.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageOneValue : public Page{ bool keylock = false; // Keylock diff --git a/lib/obp60task/PageRudderPosition.cpp b/lib/obp60task/PageRudderPosition.cpp index c3985ed..a301cc8 100644 --- a/lib/obp60task/PageRudderPosition.cpp +++ b/lib/obp60task/PageRudderPosition.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageRudderPosition : public Page { diff --git a/lib/obp60task/PageThreeValues.cpp b/lib/obp60task/PageThreeValues.cpp index 16e0c08..0f02c4f 100644 --- a/lib/obp60task/PageThreeValues.cpp +++ b/lib/obp60task/PageThreeValues.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageThreeValues : public Page { diff --git a/lib/obp60task/PageTwoValues.cpp b/lib/obp60task/PageTwoValues.cpp index 31c1048..86f3ec5 100644 --- a/lib/obp60task/PageTwoValues.cpp +++ b/lib/obp60task/PageTwoValues.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageTwoValues : public Page { diff --git a/lib/obp60task/PageVoltage.cpp b/lib/obp60task/PageVoltage.cpp index 936b37d..a55739d 100644 --- a/lib/obp60task/PageVoltage.cpp +++ b/lib/obp60task/PageVoltage.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" #include "movingAvg.h" // Lib for moving average building class PageVoltage : public Page diff --git a/lib/obp60task/PageWhite.cpp b/lib/obp60task/PageWhite.cpp index 3f312f8..4aa5b17 100644 --- a/lib/obp60task/PageWhite.cpp +++ b/lib/obp60task/PageWhite.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageWhite : public Page{ bool keylock = false; // Keylock diff --git a/lib/obp60task/PageWindRose.cpp b/lib/obp60task/PageWindRose.cpp index 2296ef3..ae1e199 100644 --- a/lib/obp60task/PageWindRose.cpp +++ b/lib/obp60task/PageWindRose.cpp @@ -1,7 +1,7 @@ #ifdef BOARD_NODEMCU32S_OBP60 #include "Pagedata.h" -#include "OBP60ExtensionPort.h" +#include "OBP60Extensions.h" class PageWindRose : public Page { diff --git a/lib/obp60task/config.json b/lib/obp60task/config.json index b479cee..c047774 100644 --- a/lib/obp60task/config.json +++ b/lib/obp60task/config.json @@ -3,10 +3,10 @@ "name": "timeZone", "label": "Time Zone", "type": "number", - "default": "0", + "default": "0.00", "check": "checkMinMax", - "min": -12, - "max": 14, + "min": -12.00, + "max": 14.00, "description": "Time zone [UTC -12...+14]", "category": "OBP60 Settings", "capabilities": { @@ -17,10 +17,10 @@ "name": "draft", "label": "Boat Draft [m]", "type": "number", - "default": "0", + "default": "0.00", "check": "checkMinMax", - "min": 0, - "max": 10, + "min": 0.00, + "max": 10.00, "description": "The draft of the boat [0...10m]", "category": "OBP60 Settings", "capabilities": { @@ -45,10 +45,10 @@ "name": "fuelConsumption", "label": "Fuel Consuption [l/h]", "type": "number", - "default": "0", + "default": "0.00", "check": "checkMinMax", - "min": 0, - "max": 1000, + "min": 0.00, + "max": 1000.00, "description": "Medium fuel consumption [0...1000l/h]", "category": "OBP60 Settings", "capabilities": { @@ -119,10 +119,10 @@ "name": "batteryCapacity", "label": "Battery Capacity [Ah]", "type": "number", - "default": "0", + "default": "0.0", "check": "checkMinMax", - "min": 0, - "max": 10000, + "min": 0.0, + "max": 10000.0, "description": "Battery capacity [0...10000Ah]", "category": "OBP60 Settings", "capabilities": { diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index de606fe..ca31fa9 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -10,7 +10,7 @@ #include #include #include // GxEPD lib for E-Ink displays -#include "OBP60ExtensionPort.h" // Functions lib for extension board +#include "OBP60Extensions.h" // Functions lib for extension board #include "OBP60Keypad.h" // Functions for keypad // True type character sets includes @@ -63,6 +63,7 @@ void OBP60Init(GwApi *api){ if(String(ledMode) == "Off"){ setBlinkingLED(false); } + // Marker for init complete // Used in OBP60Task() initComplete = true; @@ -338,6 +339,8 @@ void OBP60Task(GwApi *api){ // Configuration values for main loop String gpsFix = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString(); String backlight = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString(); + String gpsOn=api->getConfig()->getConfigItem(api->getConfig()->useGPS,true)->asString(); + String tz = api->getConfig()->getConfigItem(api->getConfig()->timeZone,true)->asString(); // refreshmode defined in init section // displaycolor defined in init section @@ -346,9 +349,10 @@ void OBP60Task(GwApi *api){ // bgcolor defined in init section // Boat values for main loop - GwApi::BoatValue *hdop = boatValues.findValueOrCreate("HDOP"); // Load HDOP GwApi::BoatValue *date = boatValues.findValueOrCreate("GPSD"); // Load GpsDate GwApi::BoatValue *time = boatValues.findValueOrCreate("GPST"); // Load GpsTime + GwApi::BoatValue *lat = boatValues.findValueOrCreate("LAT"); // Load GpsLatitude + GwApi::BoatValue *lon = boatValues.findValueOrCreate("LON"); // Load GpsLongitude LOG_DEBUG(GwLog::LOG,"obp60task: start mainloop"); int pageNumber=0; @@ -363,6 +367,7 @@ void OBP60Task(GwApi *api){ long starttime2 = millis(); // Full display refresh after 5 min long starttime3 = millis(); // Display update all 1s long starttime4 = millis(); // Delayed display update after 4s when select a new page + long starttime5 = millis(); // Calculate sunrise and sunset all 1s // Main loop runs with 100ms @@ -436,6 +441,14 @@ void OBP60Task(GwApi *api){ LOG_DEBUG(GwLog::LOG,"set pagenumber to %d",pageNumber); } + // Calculate sunrise and sunset all 1s + if(millis() > starttime5 + 1000){ + starttime5 = millis(); + if(time->valid == true && date->valid == true && lat->valid == true && lon->valid == true){ + commonData.data = calcSunsetSunrise(time->value , date->value, lat->value, lon->value, tz.toDouble()); + } + } + // Full display update afer a new selected page and 4s wait time if(millis() > starttime4 + 4000 && delayedDisplayUpdate == true){ display.update(); // Full update