Восход солнца

Обсуждение программ nnCron и nnCron LITE

Восход солнца

Postby BlackWarrior » Sun, 20 Jan 2013, 11:25

А как организовать запуск задачи по восходу солнца?
BlackWarrior
 
Posts: 12
Joined: Wed, 01 Dec 2010, 07:35

Re: Восход солнца

Postby VoidVolker » Sun, 20 Jan 2013, 12:25

Поставить запуск задачи каждую минуту в диапазоне восхода солнца для всего года в своем часовом поясе. Далее в задаче проверять совпадает ли текущее время (т.е. время запуска задачи) с временем восхода солнца для текущей даты.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2937
Joined: Tue, 25 Apr 2006, 17:56

Re: Восход солнца

Postby Aveiro » Sun, 20 Jan 2013, 12:35

Вроде как чуднАя задача с первого взгляда. :)
Хотя может какие-то датчики задействованы, отключения освещения и т.п.
Есть же таблицы время восхода для каждого дня для региона,вот и запускать задачу исходя из дня года.
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Восход солнца

Postby BlackWarrior » Mon, 21 Jan 2013, 10:17

VoidVolker wrote:Поставить запуск задачи каждую минуту в диапазоне восхода солнца для всего года в своем часовом поясе. Далее в задаче проверять совпадает ли текущее время (т.е. время запуска задачи) с временем восхода солнца для текущей даты.

А таблицу восхода/захода руками вбивать?
BlackWarrior
 
Posts: 12
Joined: Wed, 01 Dec 2010, 07:35

Re: Восход солнца

Postby Morituruz » Mon, 21 Jan 2013, 13:14

BlackWarrior wrote:А таблицу восхода/захода руками вбивать?

Насколько я знаю, готового алгоритма в nncron не предусмотрено, но вы можете написать свой :-), т.к. информации в сети хватает. Например:
http://williams.best.vwh.net/sunrise_su ... orithm.htm

Или, как вариант, найти подходящий веб-сайт, выдающий такую информацию, и скачивать его страничку через HTTP-GET, после чего вытаскивать оттуда нужную информацию.
User avatar
Morituruz
 
Posts: 729
Joined: Sun, 14 Oct 2007, 01:51

Re: Восход солнца

Postby VoidVolker » Mon, 21 Jan 2013, 13:47

BlackWarrior wrote:А таблицу восхода/захода руками вбивать?

Либо взять готовую таблицу из сети, либо сделать расчет траектории.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2937
Joined: Tue, 25 Apr 2006, 17:56

Re: Восход солнца

Postby AlikasS » Mon, 14 Jan 2019, 05:45

покажите код, если кто-нибудь реализовал ))
User avatar
AlikasS
 
Posts: 1463
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Восход солнца

Postby ascerdfg1 » Sun, 20 Jan 2019, 18:37

Фотодиод в LPT-порт и читать порт, только в x64 я не знаю как.
nncron.exe v 1.93b10 Build 1141
tm.exe v 1.93b10 Build 569
Windows XP (5.1.2600) SP3
Комп без nnCron - груда металла!
User avatar
ascerdfg1
 
Posts: 565
Joined: Thu, 29 Nov 2007, 02:45
Location: г. Алексин

Re: Восход солнца

Postby AlikasS » Mon, 21 Jan 2019, 02:47

нет. интересен сам расчет.
алгоритм нашел, сделать пока некогда.
User avatar
AlikasS
 
Posts: 1463
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Восход солнца

Postby dothen » Sat, 02 Feb 2019, 20:39

BlackWarrior wrote:А как организовать ЗАПУСК ЗАДАЧИ по восходу солнца?

SunCalc: https://habr.com/ru/post/127101/

Файл suncalc.js (без луны):
Spoiler: show
Code: Select all
/*
 (c) 2011-2015, Vladimir Agafonkin
 SunCalc is a JavaScript library for calculating sun/moon position and light phases.
 https://github.com/mourner/suncalc
*/


// shortcuts for easier to read formulas

var PI   = Math.PI,
    sin  = Math.sin,
    cos  = Math.cos,
    tan  = Math.tan,
    asin = Math.asin,
    atan = Math.atan2,
    acos = Math.acos,
    rad  = PI / 180;

// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas


// date/time constants and conversions

var dayMs = 1000 * 60 * 60 * 24,
    J1970 = 2440588,
    J2000 = 2451545;

function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
function fromJulian(j)  { return new Date((j + 0.5 - J1970) * dayMs); }
function toDays(date)   { return toJulian(date) - J2000; }


// general calculations for position

var e = rad * 23.4397; // obliquity of the Earth

function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
function declination(l, b)    { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }

function azimuth(H, phi, dec)  { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }

function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }

function astroRefraction(h) {
    if (h < 0) // the following formula works for positive altitudes only.
        h = 0; // if h = -0.08901179 a div/0 would occur.

    // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
    // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
    return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
}

// general sun calculations

function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }

function eclipticLongitude(M) {

    var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
        P = rad * 102.9372; // perihelion of the Earth

    return M + C + P + PI;
}

function sunCoords(d) {

    var M = solarMeanAnomaly(d),
        L = eclipticLongitude(M);

    return {
        dec: declination(L, 0),
        ra: rightAscension(L, 0)
    };
}


var SunCalc = {};


// calculates sun position for a given date and latitude/longitude

SunCalc.getPosition = function (date, lat, lng) {

    var lw  = rad * -lng,
        phi = rad * lat,
        d   = toDays(date),

        c  = sunCoords(d),
        H  = siderealTime(d, lw) - c.ra;

    return {
        azimuth: azimuth(H, phi, c.dec),
        altitude: altitude(H, phi, c.dec)
    };
};


// sun times configuration (angle, morning name, evening name)

var times = SunCalc.times = [
    [-0.833, 'sunrise',       'sunset'      ],
    [  -0.3, 'sunriseEnd',    'sunsetStart' ],
    [    -6, 'dawn',          'dusk'        ],
    [   -12, 'nauticalDawn',  'nauticalDusk'],
    [   -18, 'nightEnd',      'night'       ],
    [     6, 'goldenHourEnd', 'goldenHour'  ]
];

// adds a custom time to the times config

SunCalc.addTime = function (angle, riseName, setName) {
    times.push([angle, riseName, setName]);
};


// calculations for sun times

var J0 = 0.0009;

function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }

function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
function solarTransitJ(ds, M, L)  { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }

function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }

// returns set time for the given sun altitude
function getSetJ(h, lw, phi, dec, n, M, L) {

    var w = hourAngle(h, phi, dec),
        a = approxTransit(w, lw, n);
    return solarTransitJ(a, M, L);
}


// calculates sun times for a given date and latitude/longitude

SunCalc.getTimes = function (date, lat, lng) {

    var lw = rad * -lng,
        phi = rad * lat,

        d = toDays(date),
        n = julianCycle(d, lw),
        ds = approxTransit(0, lw, n),

        M = solarMeanAnomaly(ds),
        L = eclipticLongitude(M),
        dec = declination(L, 0),

        Jnoon = solarTransitJ(ds, M, L),

        i, len, time, Jset, Jrise;


    var result = {
        solarNoon: fromJulian(Jnoon),
        nadir: fromJulian(Jnoon - 0.5)
    };

    for (i = 0, len = times.length; i < len; i += 1) {
        time = times[i];

        Jset = getSetJ(time[0] * rad, lw, phi, dec, n, M, L);
        Jrise = Jnoon - (Jset - Jnoon);

        result[time[1]] = fromJulian(Jrise);
        result[time[2]] = fromJulian(Jset);
    }

    return result;
};





// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
//  Вставьте свои широту, долготу и путь к файлу sunrise.txt
    var times = SunCalc.getTimes(new Date(), 55.45, 37.37); // (дата, широта, долгота)
    var FSO,File,TempStr;
    FSO = WScript.CreateObject("Scripting.FileSystemObject");
    File = FSO.OpenTextFile("D:\\Program\\nnCron\\sunrise.txt", 2);
    File.Write(times.sunrise.getHours() + ':' + times.sunrise.getMinutes());
    File.Close();


Файл suncalc.js надо скопировать в папку nnCron и вставить свои широту, долготу и путь к файлу sunrise.txt

Задача:
Code: Select all
#( task_sunrise
\ NoActive

: sunrise ( -- a u ) S" sunrise.txt" +ModuleDirName ;
: suncalc ( -- a u ) S" suncalc.js" +ModuleDirName ;

: cron-min!  ( u -- ) 0 MAX 59 MIN N>S CUR-NODE CRON-TIME-LIST @ CRON-MIN @ PLACE ;
: cron-hour! ( u -- ) 0 MAX 23 MIN N>S CUR-NODE CRON-TIME-LIST @ CRON-HOUR @ PLACE ;

: SetTimeSunrise ( -- )
    sunrise EXIST? 0= IF sunrise FCREATE THEN
    suncalc START-APPW
    sunrise FILE SHH:MM cron-min! cron-hour!
;

: sunrise? ( -- ? )
    sunrise FILE SHH:MM Min@ = SWAP Hour@ = AND
;

Time: START-TIME
Time: 30 0 * * * *   \ Получить время восхода и подставить в структуру /CRON-TIME.
Time: 10 10 * * * *  \ Заготовка для восхода.


Action:
    SetTimeSunrise
    sunrise? 0= IF EXIT THEN

    QUERY: "You a vampire?"
    DROP S" Sunrise!" MsgBox
)#


dothen
 
Posts: 205
Joined: Mon, 16 Mar 2015, 04:58

Re: Восход солнца

Postby AlikasS » Wed, 13 Feb 2019, 10:54

отлично. спасибо ))
при необходимости можно избавиться от файла suncalc.js с помощью
Code: Select all
<JScript> </SCRIPT>

Spoiler: show
Code: Select all
#( jscript-calc
NoActive
Action:
    <JScript>
/*
 (c) 2011-2015, Vladimir Agafonkin
 SunCalc is a JavaScript library for calculating sun/moon position and light phases.
 https://github.com/mourner/suncalc
*/


// shortcuts for easier to read formulas

var PI   = Math.PI,
    sin  = Math.sin,
    cos  = Math.cos,
    tan  = Math.tan,
    asin = Math.asin,
    atan = Math.atan2,
    acos = Math.acos,
    rad  = PI / 180;

// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas


// date/time constants and conversions

var dayMs = 1000 * 60 * 60 * 24,
    J1970 = 2440588,
    J2000 = 2451545;

function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
function fromJulian(j)  { return new Date((j + 0.5 - J1970) * dayMs); }
function toDays(date)   { return toJulian(date) - J2000; }


// general calculations for position

var e = rad * 23.4397; // obliquity of the Earth

function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
function declination(l, b)    { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }

function azimuth(H, phi, dec)  { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }

function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }

function astroRefraction(h) {
    if (h < 0) // the following formula works for positive altitudes only.
        h = 0; // if h = -0.08901179 a div/0 would occur.

    // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
    // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
    return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
}

// general sun calculations

function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }

function eclipticLongitude(M) {

    var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
        P = rad * 102.9372; // perihelion of the Earth

    return M + C + P + PI;
}

function sunCoords(d) {

    var M = solarMeanAnomaly(d),
        L = eclipticLongitude(M);

    return {
        dec: declination(L, 0),
        ra: rightAscension(L, 0)
    };
}


var SunCalc = {};


// calculates sun position for a given date and latitude/longitude

SunCalc.getPosition = function (date, lat, lng) {

    var lw  = rad * -lng,
        phi = rad * lat,
        d   = toDays(date),

        c  = sunCoords(d),
        H  = siderealTime(d, lw) - c.ra;

    return {
        azimuth: azimuth(H, phi, c.dec),
        altitude: altitude(H, phi, c.dec)
    };
};


// sun times configuration (angle, morning name, evening name)

var times = SunCalc.times = [
    [-0.833, 'sunrise',       'sunset'      ],
    [  -0.3, 'sunriseEnd',    'sunsetStart' ],
    [    -6, 'dawn',          'dusk'        ],
    [   -12, 'nauticalDawn',  'nauticalDusk'],
    [   -18, 'nightEnd',      'night'       ],
    [     6, 'goldenHourEnd', 'goldenHour'  ]
];

// adds a custom time to the times config

SunCalc.addTime = function (angle, riseName, setName) {
    times.push([angle, riseName, setName]);
};


// calculations for sun times

var J0 = 0.0009;

function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }

function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
function solarTransitJ(ds, M, L)  { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }

function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }

// returns set time for the given sun altitude
function getSetJ(h, lw, phi, dec, n, M, L) {

    var w = hourAngle(h, phi, dec),
        a = approxTransit(w, lw, n);
    return solarTransitJ(a, M, L);
}


// calculates sun times for a given date and latitude/longitude

SunCalc.getTimes = function (date, lat, lng) {

    var lw = rad * -lng,
        phi = rad * lat,

        d = toDays(date),
        n = julianCycle(d, lw),
        ds = approxTransit(0, lw, n),

        M = solarMeanAnomaly(ds),
        L = eclipticLongitude(M),
        dec = declination(L, 0),

        Jnoon = solarTransitJ(ds, M, L),

        i, len, time, Jset, Jrise;


    var result = {
        solarNoon: fromJulian(Jnoon),
        nadir: fromJulian(Jnoon - 0.5)
    };

    for (i = 0, len = times.length; i < len; i += 1) {
        time = times[i];

        Jset = getSetJ(time[0] * rad, lw, phi, dec, n, M, L);
        Jrise = Jnoon - (Jset - Jnoon);

        result[time[1]] = fromJulian(Jrise);
        result[time[2]] = fromJulian(Jset);
    }

    return result;
};





// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
//  Вставьте свои широту, долготу и путь к файлу sunrise.txt
    var times = SunCalc.getTimes(new Date(), 48.51, 135.10); // (дата, широта, долгота)
    var FSO,File,TempStr;
    FSO = WScript.CreateObject("Scripting.FileSystemObject");
    File = FSO.OpenTextFile("C:\\Users\\it\\AppData\\Roaming\\nnCron\\sunrise.txt", 2);
    File.Write('sunrise ' + ('00' + times.sunrise.getHours()).slice(-2) + ' ' + ('00' + times.sunrise.getMinutes()).slice(-2) + '\n');
    File.Write('sunset ' + ('00' + times.sunset.getHours()).slice(-2) + ' ' + ('00' + times.sunset.getMinutes()).slice(-2));
    File.Close();



    </SCRIPT>
)#
User avatar
AlikasS
 
Posts: 1463
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Восход солнца

Postby AleXH » Sat, 18 May 2019, 08:53

Кто бы уточнил (объяснил) использованную систему указания местоположения в js - глядя на
Code: Select all
(new Date(), 48.51, 135.10); // (дата, широта, долгота)
видно, что это нечто десятичное - десятичные градусы? Если указать пункт (город), для которого приведены координаты, то разобраться проще.
AleXH
 
Posts: 48
Joined: Sun, 31 Mar 2013, 10:23

Re: Восход солнца

Postby AlikasS » Mon, 20 May 2019, 01:58

AleXH wrote:Кто бы уточнил (объяснил) использованную систему указания местоположения в js - глядя на
Code: Select all
(new Date(), 48.51, 135.10); // (дата, широта, долгота)
видно, что это нечто десятичное - десятичные градусы? Если указать пункт (город), для которого приведены координаты, то разобраться проще.

там же расшифровка есть
Code: Select all
(new Date(), 48.51, 135.10); // (дата, широта, долгота)

48.51 - широта
135.10 - долгота
конкретно эти координаты - г.Хабаровск
User avatar
AlikasS
 
Posts: 1463
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Восход солнца

Postby AleXH » Mon, 20 May 2019, 08:15

Географические координаты Хабаровска (в скобках — в градусах и десятичных минутах) 48° 27’ 46" (48° 27’ 85) северной широты 135° 5’ 1" (135° 5’ 2) восточной долготы;
Координаты в десятичных градусах широта 48.48272 долгота 135.08379

Источник: http://obzorurokov.ru/rossiya/koordinat ... ovska.html


- Видите в чём соль? Из комментария ясно, что это широта и долгота, но в какой "системе" - непонятно. Если бы это было указано, либо указан населённый пункт для которого приведены координаты (легко найти в гугле по "координаты Хабаровска"), то вопроса бы не возникло.

UP. Как оказалось, и гугл и яндекс по запросу "48.51,135.10" возвращают страницу с ссылками на Хабаровск - не знал, что так можно искать по координатам.
AleXH
 
Posts: 48
Joined: Sun, 31 Mar 2013, 10:23


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests

cron