Sunris/sunset detection.
This commit is contained in:
parent
0a1d04495d
commit
f74a45a33e
@ -305,6 +305,8 @@ void deserializeConfig() {
|
|||||||
CJSON(currentTimezone, if_ntp[F("tz")]);
|
CJSON(currentTimezone, if_ntp[F("tz")]);
|
||||||
CJSON(utcOffsetSecs, if_ntp[F("offset")]);
|
CJSON(utcOffsetSecs, if_ntp[F("offset")]);
|
||||||
CJSON(useAMPM, if_ntp[F("ampm")]);
|
CJSON(useAMPM, if_ntp[F("ampm")]);
|
||||||
|
CJSON(longitude, if_ntp[F("ln")]);
|
||||||
|
CJSON(latitude, if_ntp[F("lt")]);
|
||||||
|
|
||||||
JsonObject ol = doc[F("ol")];
|
JsonObject ol = doc[F("ol")];
|
||||||
CJSON(overlayDefault ,ol[F("clock")]); // 0
|
CJSON(overlayDefault ,ol[F("clock")]); // 0
|
||||||
@ -620,6 +622,8 @@ void serializeConfig() {
|
|||||||
if_ntp[F("tz")] = currentTimezone;
|
if_ntp[F("tz")] = currentTimezone;
|
||||||
if_ntp[F("offset")] = utcOffsetSecs;
|
if_ntp[F("offset")] = utcOffsetSecs;
|
||||||
if_ntp[F("ampm")] = useAMPM;
|
if_ntp[F("ampm")] = useAMPM;
|
||||||
|
if_ntp[F("ln")] = longitude;
|
||||||
|
if_ntp[F("lt")] = latitude;
|
||||||
|
|
||||||
JsonObject ol = doc.createNestedObject("ol");
|
JsonObject ol = doc.createNestedObject("ol");
|
||||||
ol[F("clock")] = overlayDefault;
|
ol[F("clock")] = overlayDefault;
|
||||||
|
@ -589,7 +589,7 @@ function populateInfo(i)
|
|||||||
${urows}
|
${urows}
|
||||||
${inforow("Build",i.vid)}
|
${inforow("Build",i.vid)}
|
||||||
${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
|
${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
|
||||||
${inforow("Uptime",getRuntimeStr(i.uptime))}
|
${inforow("Uptime",getRuntimeStr(i.uptime)," <span class='icons'>"+(i.isday?"":"")+"</span>")}
|
||||||
${inforow("Free heap",heap," kB")}
|
${inforow("Free heap",heap," kB")}
|
||||||
${inforow("Estimated current",pwru)}
|
${inforow("Estimated current",pwru)}
|
||||||
${inforow("Average FPS",i.leds.fps)}
|
${inforow("Average FPS",i.leds.fps)}
|
||||||
|
@ -113,7 +113,8 @@
|
|||||||
<option value="18">HST (Hawaii)</option>
|
<option value="18">HST (Hawaii)</option>
|
||||||
</select><br>
|
</select><br>
|
||||||
UTC offset: <input name="UO" type="number" min="-65500" max="65500" required> seconds (max. 18 hours)<br>
|
UTC offset: <input name="UO" type="number" min="-65500" max="65500" required> seconds (max. 18 hours)<br>
|
||||||
Current local time is <span class="times">unknown</span>.
|
Current local time is <span class="times">unknown</span>.<br>
|
||||||
|
Longitude: <input name="LN" type="number" min="-180" max="180" step="0.01"> Latitude: <input name="LT" type="number" min="-90" max="90" step="0.01">
|
||||||
<h3>Clock</h3>
|
<h3>Clock</h3>
|
||||||
Clock Overlay:
|
Clock Overlay:
|
||||||
<select name="OL" onchange="Cs()">
|
<select name="OL" onchange="Cs()">
|
||||||
|
@ -135,6 +135,7 @@ bool checkCountdown();
|
|||||||
void setCountdown();
|
void setCountdown();
|
||||||
byte weekdayMondayFirst();
|
byte weekdayMondayFirst();
|
||||||
void checkTimers();
|
void checkTimers();
|
||||||
|
bool isDayTime();
|
||||||
|
|
||||||
//overlay.cpp
|
//overlay.cpp
|
||||||
void initCronixie();
|
void initCronixie();
|
||||||
|
@ -316,7 +316,9 @@ US-MST/MDT</option><option value="7">US-AZ</option><option value="8">US-PST/PDT
|
|||||||
</option><option value="17">ACST/ACDT</option><option value="18">HST (Hawaii)
|
</option><option value="17">ACST/ACDT</option><option value="18">HST (Hawaii)
|
||||||
</option></select><br>UTC offset: <input name="UO" type="number" min="-65500"
|
</option></select><br>UTC offset: <input name="UO" type="number" min="-65500"
|
||||||
max="65500" required> seconds (max. 18 hours)<br>Current local time is <span
|
max="65500" required> seconds (max. 18 hours)<br>Current local time is <span
|
||||||
class="times">unknown</span>.<h3>Clock</h3>Clock Overlay: <select name="OL"
|
class="times">unknown</span>.<br>Longitude: <input name="LN" type="number"
|
||||||
|
min="-180" max="180" step="0.01"> Latitude: <input name="LT" type="number"
|
||||||
|
min="-90" max="90" step="0.01"><h3>Clock</h3>Clock Overlay: <select name="OL"
|
||||||
onchange="Cs()"><option value="0" id="cn" selected="selected">None</option>
|
onchange="Cs()"><option value="0" id="cn" selected="selected">None</option>
|
||||||
<option value="1" id="ca">Analog Clock</option><option value="2">
|
<option value="1" id="ca">Analog Clock</option><option value="2">
|
||||||
Single Digit Clock</option><option value="3" id="cc">Cronixie Clock</option>
|
Single Digit Clock</option><option value="3" id="cc">Cronixie Clock</option>
|
||||||
|
1587
wled00/html_ui.h
1587
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -509,6 +509,7 @@ void serializeInfo(JsonObject root)
|
|||||||
|
|
||||||
root[F("freeheap")] = ESP.getFreeHeap();
|
root[F("freeheap")] = ESP.getFreeHeap();
|
||||||
root[F("uptime")] = millis()/1000 + rolloverMillis*4294967;
|
root[F("uptime")] = millis()/1000 + rolloverMillis*4294967;
|
||||||
|
root[F("isday")] = daytime;
|
||||||
|
|
||||||
usermods.addToJsonInfo(root);
|
usermods.addToJsonInfo(root);
|
||||||
|
|
||||||
|
@ -263,6 +263,11 @@ void checkTimers()
|
|||||||
{
|
{
|
||||||
if (lastTimerMinute != minute(localTime)) //only check once a new minute begins
|
if (lastTimerMinute != minute(localTime)) //only check once a new minute begins
|
||||||
{
|
{
|
||||||
|
daytime = isDayTime();
|
||||||
|
if (prevDaytime != daytime) {
|
||||||
|
// sunrise or sunset
|
||||||
|
DEBUG_PRINTLN(daytime?F("Sunrise"):F("Sunset"));
|
||||||
|
}
|
||||||
lastTimerMinute = minute(localTime);
|
lastTimerMinute = minute(localTime);
|
||||||
for (uint8_t i = 0; i < 8; i++)
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
@ -277,3 +282,52 @@ void checkTimers()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This program calculates solar positions as a function of location, date, and time.
|
||||||
|
* The equations are from Jean Meeus, Astronomical Algorithms, Willmann-Bell, Inc., Richmond, VA
|
||||||
|
* (C) 2015, David Brooks, Institute for Earth Science Research and Education.
|
||||||
|
* http://www.instesre.org/ArduinoUnoSolarCalculations.pdf
|
||||||
|
*/
|
||||||
|
//#define DEG_TO_RAD 0.01745329
|
||||||
|
//#define PI 3.141592654
|
||||||
|
#define TWOPI 6.28318531
|
||||||
|
|
||||||
|
long JulianDate(int year, int month, int day) {
|
||||||
|
if (month<=2) {
|
||||||
|
year--; month+=12;
|
||||||
|
}
|
||||||
|
int A=year/100;
|
||||||
|
int B=2-A+A/4;
|
||||||
|
return (long)(365.25*(year + 4716)) + (int)(30.6001*(month + 1)) + day + B - 1524;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isDayTime() {
|
||||||
|
float JD_frac,T,L0,M,C,L_true,GrHrAngle,Obl,RA,Decl,HrAngle,elev;
|
||||||
|
long JD_whole,JDx;
|
||||||
|
|
||||||
|
float Lon = longitude*DEG_TO_RAD;
|
||||||
|
float Lat = latitude*DEG_TO_RAD;
|
||||||
|
|
||||||
|
// calculate elevation of the sun (>0 daytime, <0 nighttime)
|
||||||
|
JD_whole = JulianDate(year(localTime), month(localTime), day(localTime));
|
||||||
|
JD_frac = (hour(localTime) + minute(localTime)/60. + second(localTime)/3600.)/24. - .5;
|
||||||
|
JDx = JD_whole - 2451545;
|
||||||
|
T = (JDx + JD_frac)/36525.;
|
||||||
|
L0 = DEG_TO_RAD*fmod(280.46645 + 36000.76983*T, 360);
|
||||||
|
M = DEG_TO_RAD*fmod(357.5291 + 35999.0503*T, 360);
|
||||||
|
C = DEG_TO_RAD*((1.9146-0.004847*T)*sin(M) + (0.019993-0.000101*T)*sin(2*M) + 0.00029*sin(3*M));
|
||||||
|
Obl = DEG_TO_RAD*(23 + 26/60. + 21.448/3600. - 46.815/3600*T);
|
||||||
|
GrHrAngle = 280.46061837 + (360*JDx)%360 + .98564736629*JDx + 360.98564736629*JD_frac;
|
||||||
|
GrHrAngle = fmod(GrHrAngle, 360.);
|
||||||
|
L_true = fmod(C + L0, TWOPI);
|
||||||
|
RA = atan2(sin(L_true)*cos(Obl), cos(L_true));
|
||||||
|
Decl = asin(sin(Obl)*sin(L_true));
|
||||||
|
HrAngle = DEG_TO_RAD*GrHrAngle + Lon - RA;
|
||||||
|
|
||||||
|
elev = asin(sin(Lat)*sin(Decl) + cos(Lat)*(cos(Decl)*cos(HrAngle)));
|
||||||
|
// Azimuth measured eastward from north.
|
||||||
|
// azimuth = PI+atan2(sin(HrAngle),cos(HrAngle)*sin(Lat)-tan(Decl)*cos(Lat));
|
||||||
|
|
||||||
|
return elev > 0.; // if elevation is gt 0 then it is a day
|
||||||
|
}
|
||||||
|
@ -294,6 +294,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
|
|
||||||
//start ntp if not already connected
|
//start ntp if not already connected
|
||||||
if (ntpEnabled && WLED_CONNECTED && !ntpConnected) ntpConnected = ntpUdp.begin(ntpLocalPort);
|
if (ntpEnabled && WLED_CONNECTED && !ntpConnected) ntpConnected = ntpUdp.begin(ntpLocalPort);
|
||||||
|
longitude = request->arg(F("LN")).toFloat();
|
||||||
|
latitude = request->arg(F("LT")).toFloat();
|
||||||
|
|
||||||
if (request->hasArg(F("OL"))) {
|
if (request->hasArg(F("OL"))) {
|
||||||
overlayDefault = request->arg(F("OL")).toInt();
|
overlayDefault = request->arg(F("OL")).toInt();
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// version code in format yymmddb (b = daily build)
|
// version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 2103050
|
#define VERSION 2103051
|
||||||
|
|
||||||
//uncomment this if you have a "my_config.h" file you'd like to use
|
//uncomment this if you have a "my_config.h" file you'd like to use
|
||||||
//#define WLED_USE_MY_CONFIG
|
//#define WLED_USE_MY_CONFIG
|
||||||
@ -515,6 +515,10 @@ WLED_GLOBAL unsigned long ntpPacketSentTime _INIT(999000000L);
|
|||||||
WLED_GLOBAL IPAddress ntpServerIP;
|
WLED_GLOBAL IPAddress ntpServerIP;
|
||||||
WLED_GLOBAL uint16_t ntpLocalPort _INIT(2390);
|
WLED_GLOBAL uint16_t ntpLocalPort _INIT(2390);
|
||||||
WLED_GLOBAL uint16_t rolloverMillis _INIT(0);
|
WLED_GLOBAL uint16_t rolloverMillis _INIT(0);
|
||||||
|
WLED_GLOBAL bool daytime _INIT(false);
|
||||||
|
WLED_GLOBAL bool prevDaytime _INIT(false);
|
||||||
|
WLED_GLOBAL float longitude _INIT(0.0);
|
||||||
|
WLED_GLOBAL float latitude _INIT(0.0);
|
||||||
|
|
||||||
// Temp buffer
|
// Temp buffer
|
||||||
WLED_GLOBAL char* obuf;
|
WLED_GLOBAL char* obuf;
|
||||||
|
@ -448,6 +448,10 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('i',SET_F("TZ"),currentTimezone);
|
sappend('i',SET_F("TZ"),currentTimezone);
|
||||||
sappend('v',SET_F("UO"),utcOffsetSecs);
|
sappend('v',SET_F("UO"),utcOffsetSecs);
|
||||||
char tm[32];
|
char tm[32];
|
||||||
|
dtostrf(longitude,5,2,tm);
|
||||||
|
sappends('s',SET_F("LN"),tm);
|
||||||
|
dtostrf(latitude,5,2,tm);
|
||||||
|
sappends('s',SET_F("LT"),tm);
|
||||||
getTimeString(tm);
|
getTimeString(tm);
|
||||||
sappends('m',SET_F("(\"times\")[0]"),tm);
|
sappends('m',SET_F("(\"times\")[0]"),tm);
|
||||||
sappend('i',SET_F("OL"),overlayCurrent);
|
sappend('i',SET_F("OL"),overlayCurrent);
|
||||||
|
Loading…
Reference in New Issue
Block a user