Календарный таймер как упростить?

d_kin
Offline
Зарегистрирован: 07.12.2016

dimax пишет:

d_kin, вы для себя это колхозите? Если для организации, то лучше купить готовый промышленный астротаймер. В них используют GPS модуль, можно один раз запрограммировать и больше никогда не знать забот. Ну а если самому собирать "велосипед", то опять же удобнее на GPS.

Делаю для себя, все упирается в цену. В самодельном лучше гибкость настройки, можно использовать разное время для нескольких выходных реле. Про GPS думал, но там полуподвальное помещение, пока решил попробовать на модуле часов.

d_kin
Offline
Зарегистрирован: 07.12.2016

andriano пишет:

Что-то я не нашел, где Вы пишете о требуемой точности установки времени восхода/захода. А без этого ответить на вопрос "потянет или не потянет" невозможно, не говоря уже о конкретном алгоритме.

МК Ардуино Нано 3.0. В программе 7500 символов + библиотеки Time.h и DS1307RTC.h, я переживаю влезет в ардуино или нет? По точности хода там все заключается в том, что раз в час данные берутся из двух массивов по 365 трех-четырех значных чисел (рассвет и зкат) и 1 раз в минуту сравнивается время - больше ли оно чем время рассвета и меньше, чем время заката, полученное из массивов.

msng
Offline
Зарегистрирован: 07.06.2012

в еепром 0 - это 25 декабря самый короткий день, рассвет допустим в 7:00

следующий рассвет в 7:02 значит из еепром надо домтать сл ячейку в которой записана "1"

следущий рассвет 7:08 значит в еепром дб "4" т.е. к 7:00 прибавить 8 минут (4 из еепром *2)

как то так

можно конечно и просто в массив, но я бы сделал с еепром

d_kin
Offline
Зарегистрирован: 07.12.2016

msng пишет:

в еепром 0 - это 25 декабря самый короткий день, рассвет допустим в 7:00

следующий рассвет в 7:02 значит из еепром надо домтать сл ячейку в которой записана "1"

следущий рассвет 7:08 значит в еепром дб "4" т.е. к 7:00 прибавить 8 минут (4 из еепром *2)

как то так

можно конечно и просто в массив, но я бы сделал с еепром

 

Про еепром мне тут уже 3-ий раз говорят, но думаю моя голова не разберется. А в чем опасность массива, который я создал? Если он не превышает память ардуины, то будет работать.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

d_kin пишет:

andriano пишет:

Что-то я не нашел, где Вы пишете о требуемой точности установки времени восхода/захода. А без этого ответить на вопрос "потянет или не потянет" невозможно, не говоря уже о конкретном алгоритме.

МК Ардуино Нано 3.0. В программе 7500 символов + библиотеки Time.h и DS1307RTC.h, я переживаю влезет в ардуино или нет? По точности хода там все заключается в том, что раз в час данные берутся из двух массивов по 365 трех-четырех значных чисел (рассвет и зкат) и 1 раз в минуту сравнивается время - больше ли оно чем время рассвета и меньше, чем время заката, полученное из массивов.

d_kin, Вы ставите телегу впереди лошади: еще не определились с требуемой точностью, а уже приводите детали реализации.

Почему 7500 символов?

Почему массивы? Почему два? Почему 3-4-значные?

Чем отличается "раз в час" от "раза в минуту"?

 

К чему это я. Я Вам уже предлагал использовать аналитику вместо массивов. Это будет строчек 5 кода и ни одного длинного массива. Но эта простая аналитика не учитывает преломления света в атмосфере, приводящего к сдвижке моментов восхода и заката во времени. В зависимости от требуемой точности это можно либо вообще не учитывать, либо учитывать в той или иной степени приближения. От степени приближания, соответственно, зависит объем кода. Но в любом случае, думаю, до 7500 символов будет очень далеко.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016
andriano пишет:
Почему 7500 символов?
 
подумалось что nano на процессоре atmega8, но странно, там вроде 7168
 
andriano пишет:
Почему два?
 
восходы и закаты, тип int
 
И вообще. d_kin, почему бы не озвучить таблицы времени? А то какие-то сферические алгоритмы в вакууме. Вот int voshod [] = {0,555,554,554,553,... это что такое? Значит ли что 555=09:15, 553=09:13? Далее, нахер с какой целью в начале массива нули? Они что-нибудь делают, или просто для красоты?
d_kin
Offline
Зарегистрирован: 07.12.2016

Voodoo Doll пишет:

andriano пишет:
Почему 7500 символов?
 
подумалось что nano на процессоре atmega8, но странно, там вроде 7168
 
andriano пишет:
Почему два?
 
восходы и закаты, тип int
 
И вообще. d_kin, почему бы не озвучить таблицы времени? А то какие-то сферические алгоритмы в вакууме. Вот int voshod [] = {0,555,554,554,553,... это что такое? Значит ли что 555=09:15, 553=09:13? Далее, нахер с какой целью в начале массива нули? Они что-нибудь делают, или просто для красоты?

В описании Nano v.3

Флеш-память 32 Кб (ATmega328) при этом 2 Кб используются для загрузчика
ОЗУ 2 Кб (ATmega328)
EEPROM 1 Кб (ATmega328)

Я так понимаю программа заливается во флэш-память, это гораздо больше 7500 символов.

Правильно, 555 это время в минутах с начала суток, взяты с сайтов с данными восхода и захода солнца.

Массив начинается с нулевого значения, который я не использую. 1 января по моей формуле это 1 день года, поэтому нулевое значение масива я поставил нуль.

d_kin
Offline
Зарегистрирован: 07.12.2016

andriano пишет:

d_kin, Вы ставите телегу впереди лошади: еще не определились с требуемой точностью, а уже приводите детали реализации.

Чем отличается "раз в час" от "раза в минуту"?

Минута получается точность. Синусоиды строить не хочу, т.к. посмтотрел астрономические формулы, они меня напугали.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

d_kin пишет:

посмтотрел астрономические формулы, они меня напугали.

Пугливый какой!

А чего не скачать готовую программу расчёта? Этого добра в сети, благо, навалом.

d_kin
Offline
Зарегистрирован: 07.12.2016

ЕвгенийП пишет:

Пугливый какой!

А чего не скачать готовую программу расчёта? Этого добра в сети, благо, навалом.

Что мне даст эта программа? Сайтов с рачетами полно, из данных, полученных с них я построил массив, который Вы мне дали в пример. Как это все к синусоиде и дате привязать я не знаю, да и зачем, если масив будет работать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

d_kin пишет:

Что мне даст эта программа? 

Как что? Запихаете её в Ардуино и будете считать вместо того, чтобы массив хранить. Впрочем, дело Ваше, конечно.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

ЕвгенийП, вот не надо человеку сразу советовать эту функцию запихать в МК. Там 32х разрядная математика, ещё на стадии просто перевода исходника с чистого C на Wiring возникали тааааааааааакееееенные ошибки что ну его нахер. d_kin, от ардуины не убавится, если там будет конечная информация.

У меня тут была мысля на тему как оставить эту информацию во флеше, но не в виде таблицы:

d=0;
if(x==1||x==3||x==5||x==11||x==12||x==19||x==21||x==23||x==26) d=1;
if((x>=7&&x<=9)||(x>=14&&x<=17)||(x>=150&&x<=159)) d=1;
if(x==139||x==143||x==145||x==147||x==148||x==161||x==163||x==165) d=1;
if(x==13||x==18||x==20||x==22||x==24||x==25||(x>=27&&x<=55)) d=2;
if(x==40||x==44||x==47||x==49||x==52||x==54) d=3;
if((x>=56&&x<=86)||(x>=88&&x<=126)) d=3;
if(x==58||x==60||x==63||x==66||x==69||x==72||x==75||x==79||x==83||x==87) d=2;
if(x==90||x==94||x==97 x==100||x==103||x==106||x==108||x==110||x==112||x==114) d=2;
if(x==116||x==118||x==119||x==121||(x>=123&&x<=125)||(x>=140&&x<=142)) d=2;
if((x>=126&&x<=138)||x==144||x==146||x==149) d=2;
if(x==173||x==176||x==178||(x>=180&&x<=198) d=-1;
if(x==190||x==193||x==195||x==197) d=-2;
if(x>=199&&x<=336) d=-2;
if(x==202||x==207||x==333||(x>=346&&x<=351)) d=-1;
if(x==230||x==261||x==282||x==290||x==296||x==301||x==305||x==310||x==314||x==320) d=-3;
if(337||x==339||x==341||x==343||x==344||x==353||x==354||x==356||x==359) d=-1;

Это та самая таблица разниц. Это окончательная версия условий, создающих время рассвета. У нас есть исходное t=555. Пусть x - номер дня, d - delta, на которую надо изменить t. Это надо сделать x раз. Например, есть дата 5 февраля. Это 36й день. Надо:

присвоить t=555;

поместить все условия в функцию, параметром которой будет x;

запустить цикл for(i=1;i<=36;i++) f(x);, то есть функцию 36 раз со значениями от 1 до 36.

внутри функции должно быть изменение t=t+d;

В результате в t должна оказаться та цифра, которая была в массиве на 36м месте. Проверять было лень но оно работает.

Порядок строк в условиях изменять нельзя, т. к. некоторые интервалы они проходят для одного значения d, а следующие неучтённые, но находящиеся в том же интервале для другого значения d. Теоретически можно ещё это сжать, а также подвергнуть такому же сжатию сами номера в массиве, то есть в два прохода. Но мне лень, это во-первых, во-вторых в среднем в одной строке 11 условий, строк 16, итого 176, итого на ассемблере они займут чуть больше половины килобайта (если считать cmp breg,byte где breg - регистр величиной в 1 байт, то есть по 3 байта на условие).

Тащемта, применяя этот вариант, ничем не выигрываем т. к. скомпилированный байт-код (ассемблер, то что будет находиться в hex файле) с этими инструкциями в общей сложности занимает примерно столько же сколько таблица + инструкции, перемещающие информацию из флеша в ОЗУ (pgm_read_byte(), массив byte data[] PROGMEM).

d_kin
Offline
Зарегистрирован: 07.12.2016

Очень интересный подход, можно еще больше данных уместить с меньшей затратой памяти.

msng
Offline
Зарегистрирован: 07.06.2012

Тема поста "...как упростить" Вам показали куда идти... если Вы чего то не понимаете, - разбирайтесь... Не надо быть программистом чтоб написать Вашу программу,  в ардуино всё построено для школьника. Делайте и пользуйте как у Вас получится. То ваше устройство вам его и пользовать...

d_kin
Offline
Зарегистрирован: 07.12.2016

msng пишет:

Тема поста "...как упростить" Вам показали куда идти... если Вы чего то не понимаете, - разбирайтесь... Не надо быть программистом чтоб написать Вашу программу,  в ардуино всё построено для школьника. Делайте и пользуйте как у Вас получится. То ваше устройство вам его и пользовать...

Конечно, программу с помощью многих участвовавших здесь в обсуждении я уже написал, приедет ардуино, буду тестрировать. Результат обязательно напишу здесь.

d_kin
Offline
Зарегистрирован: 07.12.2016

Все проверил, работает, только на ардуино мега 2560, на ардуино нано не хватает памяти для переменных.

Ёж
Offline
Зарегистрирован: 19.10.2016

Все намного проще, восход и заход солнца в течение года эта чистая синусоида или косинус кому как удобненне.

 Полная амплидуда 366 дней для высокосного года и 365 обыного года

Определение высокосного года  - Число(Год) / 4, если деление без остатка тогда высокосный.

Часовой таймер, немного математики, и не каких массивов.

Удачи. 

   

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

d_kin пишет:

Все проверил, работает, только на ардуино мега 2560, на ардуино нано не хватает памяти для переменных.

d_kin,

я давно слежу за темой, но так и не понял, вот скажите, зачем Вам массив? Ну, вот правда, зачем? Тем более, что он вон в память не лезет.

Чем плохо воспользоваться библиотечной функцией расчёта времени восхода и заката, которая с некоторых версий есть прямо в бибилиотеках, поставяемых с IDE - даже скачивать ниоткуда не надо? Даёшь ей географические координаты и дату, а она спокойно возвращает время. Чем это для Вас плохо? Зачем такое дорогостоящее решение из-за которого даже плату менять пришлось?

Объясните, пожалуйста.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ёж пишет:

Определение высокосного года  - Число(Год) / 4, если деление без остатка тогда высокосный.

А 1900, или там 2100?

d_kin
Offline
Зарегистрирован: 07.12.2016

Когда я спрашивал, никто не подсказал, что есть готовая библиотека TimeLord, которая возвращает время восхода и захода солнца по координатам и часовому поясу местности. Все предлагали свой рассчет вести.

По массиву, я с ними не работал, мне интересно проверить было.

Также по готовым библиотекам есть нарекания на расчет на нескольких форумах по отзывам. В случае с массивом не будет никаких неточностей.

Ёж
Offline
Зарегистрирован: 19.10.2016

А 1900, или там 2100?

Так надо дожить еще))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Причём тут какой-то таймлорд? Я имею в виду штатную С-шную библиотеку, которая даже в стандарте языка описана. Впрочем, если Вам больше нравится массив - дело Ваше.

По поводу "никто не подсказал". Не скажу за всех, но почему я не подсказал, могу объяснить. Потому, что Вы не спрашивали. Вы с первого же поста спрашивали не "как узнать время восхода", а как организовать хранение в массиве и расчёт (перечитайте). Т.е. о чём Вы спросили, в том Вам и помогали. Спросили бы "как узнать время восхода", я бы Вам сказал ещё тогда. А так, я был уверен, что штатная библиотека Вам по каким-то причинам не подходит (ну, откуда мне знать, что Вы о ней просто не знаете - она существует уже лет тридцать - почти с тех пор как С появился)  и вот сегодня любопытство таки одолело и я просил "по каким".

Так что ... внимательно подходите к формулировке вопросов и ответы будут Вас чаще радовать.

d_kin
Offline
Зарегистрирован: 07.12.2016

А как эта библиотека называется, работает? Её не нужно дополнительно добавлять? Может и проблемы то не было )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как, это штатная библиотека языка С (правда с нашим IDE до недавних пор не поставлялась, однако в 1.8.1 точно есть).

Пишете в начале скетча 

#include <time.h>

а в скетче нужно задать свои координаты при помощи функции set_position

void set_position(int32_t latitude, int32_t longitude);
Координаты в секундах северной широты и восточной долготы (если долгота западная, то значение получится отрицательным). Для упрощения пересчёта градусов в секунды есть константа ONE_DEGREE
Например, для Нью-Йорка
set_position( 40.7142 * ONE_DEGREE, -74.0064 * ONE_DEGREE);

Ну, а дальше, восход

time_t sun_rise(const time_t * timer);

Параметр - дата в общем формате времени. Результат время (секунды от 01.01.2000 - в библиотеке есть функция, которая умеет их преобразовывать в впривычные форматы).

закат
time_t  sun_set(const time_t * timer);

Здесь всё также, как с восходом

 
Там ещё есть фаза Луны и до хрена чего.
 
А вообще, этой библиотеке лет 30. Забейте в гугле
 
"time.h" примеры использования
 
на Вас столько счастья сразу свалится :)
 
d_kin
Offline
Зарегистрирован: 07.12.2016

Спасибо!

Ёж
Offline
Зарегистрирован: 19.10.2016

d_kin пишет:

Когда я спрашивал, никто не подсказал, что есть готовая библиотека TimeLord, которая возвращает время восхода и захода солнца по координатам и часовому поясу местности. Все предлагали свой рассчет вести.

По массиву, я с ними не работал, мне интересно проверить было.

Также по готовым библиотекам есть нарекания на расчет на нескольких форумах по отзывам. В случае с массивом не будет никаких неточностей.

Про библиотеку я не знал. Я, программист из другой области, но работа с массивами и оптимизация кода это моя ежедненная работа, массив штука медленная и прожорливая. Если в массиве выявляется система, тогда лучше математика. 

То что солнце всходит и заходит- проверял сходится, и то что функция синуса одназначно,только для тех районов где есть белые ночи нужно делать срез синуса. А так длина синусойды нам известна - это дней в году. Условная ось "х" это время на день весенне осенненого равно действия.  Время на 21 июня и 21 декабря - это минимальная и максимальная амплитуда.

С философией закончил, если у Вас все работает раде бога не чего не трогайте.  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ёж пишет:

То что солнце всходит и заходит- проверял сходится, .... если у Вас все работает раде бога не чего не трогайте.  

Наш человек!!!!! :))))