A A A A Автор Тема: Расчет гражданский сумерек  (Прочитано 13260 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #40 : 19 Мая 2009 [22:11:18] »
Взять, например, SunPoz():
У Вас обязательно произойдет потеря значащих цифр еще при хранении MD. Это критично.
А далее у Вас вычисляется T0. Смотрите: вычитая значение и затем деля вы еще больше теряете значащие разряды и получаете неверное значение
Попробуйте вывести координаты солнца на выходе этой функции и сравнить их со справочными.
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #41 : 19 Мая 2009 [22:23:32] »
В это месте:
float MJdata(int Year1, char Mon1, char Day1, float UT)
{
  if (Mon1 <= 2)
  {
    Mon1 = Mon1 + 12;
    Year1 = Year1 - 1;
  }       
  VarD2 = Year1/400 - Year1/100 + Year1/4;
  VarD1 = 365. * Year1 - 679004.;
  return VarD1 + VarD2 + 306001 * (Mon1 + 1)/10000 + Day1 + UT / 24 ;
}

 компилятор пишет: Warning: D:\Radio\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for AVR\Auto_Light_ATM8_PCF8583\sunrise.c(80), included from: ast_ds_004.c: overflow is possible in 16 bit addition, casting to 'long' may be required
и
Warning: D:\Radio\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for AVR\Auto_Light_ATM8_PCF8583\sunrise.c(82), included from: ast_ds_004.c: overflow is possible in 8 bit addition, casting to 'int' may be required

Правильно пишет.
Возможно переполнение и оно советует взять тип данных больших размеров
Могу Вас "утешить", что если float у Вас имеет всего 4 значащих цифры, то эту функции можете выкинуть.
В общем, если Вы не ошиблись с размерами то потребуется серьезная переделка программы
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #42 : 19 Мая 2009 [23:05:13] »
Здесь float MJdata(int Year1, char Mon1, char Day1, float UT) я сам ответил себе.
Поменял char на int
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #43 : 19 Мая 2009 [23:16:32] »
Госпожа Tau!
У Вас в программе есть место определения даты перевода на зимнее и летнее время. Подскажите, пожалуйста, какая переменная показывает, что дата зимняя или летняя. Мне необходимо переводить в эту дату системные часы (RTC). У меня такая функция написана, но если она есть у Вас, мне лучше воспользоваться ей.
Мой код:
.......
char Get_Day(int _day, int _month)//возвращает значение дня недли, начиная с 0-ВС 1-пн ...
{
  int a, y, m;
  a = (14 - _month) / 12;
  y = Y - a;
  m = _month + 12 * a - 2;
  return (7000 + (_day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
};

void get_chg_day(void)
{
  for (C0 = 25; C0 < 32; C0++)
  {
    if (Get_Day(C0,10)==0) {date_octb=C0;};
    if (Get_Day(C0, 3)==0) {date_mart=C0;};
  }
}
.......
void select_zone(void)
{
  get_chg_day();   
  if ((M==3) && (day>=date_mart)) {.......} else   //если месяц март и день больше даты перевода часов - переводим часы назад
  if ((M>3) && (M<10)) {........} else //если месяц больше марта, но меньше октября - прибавляем час
  if ((M==10) && (day<date_octb)) {cor_H = H + 1;}; //если месяц октябрь, но дата меньше перевода часов - поправка 1
  //остальное время коррекция часов не нужна
}

В остальном все прекрасно работает, огромное Вам Тау и Вам елVIс спасибо. Наилучшие Вам пожелания и успехов
« Последнее редактирование: 19 Мая 2009 [23:19:52] от IOPA4 »
Глаза боятся - руки делают

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #44 : 20 Мая 2009 [00:09:58] »
Рад, что заработало,
мне все-таки интересно - не ошиблись ли Вы с определением значащих цифр float?
Очень уж мало. На 4байта должно быть не менее 6 значащих цифр
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #45 : 20 Мая 2009 [00:52:09] »
В процедуре UniversalTime_MD есть строчка
if ((var1 > var4) && (var1 < Var5))  {dTime = dTime - 1;}
которая учитывает летнее время. Если вы заметили, расчет ведется во всемирной шкале (UT):  сначала мы переходим от местного времени к UT и  юлианской дате, вычисляем время сумерек во всемирном времени и переходим обратно к местному времени. dTime - Это разница между местным временем и всемирным. Выполнение условия if ((var1 > var4) && (var1 < Var5))  является признаком летнего времени.
Если ваши системные часы по умолчанию выставлены на зимнее время, то добавьте, например, переменную SummerTime, которую и прибавляйте к системному времени.
If var1 > var4 and var1 < Var5 then
 dTime = dTime - 1
 SummerTime=1
else
 SummerTime=0
end if

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #46 : 20 Мая 2009 [02:39:14] »
Тау!
Большое спасибо за консультации, Ваша программа работает. В "железе" тоже все готово, осталось дописать небольшие фукции и прошить!
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #47 : 20 Мая 2009 [03:16:57] »
8 мая на вашей широте полярного дня еще нет. Солнце будет заходить и восходить, но гражданские сумерки будут длиться  всю ночь, то есть будет "белая ночь". Надпись Polar Day некорректна, но это уже ваш выбор.
Большое пожалуйста. Я рада, что заработало.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #48 : 21 Мая 2009 [09:50:04] »
Здравствуйте!
Если эта задача из разряда астрономии:
Помогите пожалуйста еще и с логикой - есть 3 времени:
time_up (время восхода) 05:00
time_now (текущее время) 16:00
time_dn (время захода) 23:00 
Должно работать по логике:
if ((time_now>time_up) && (time_now<time_dn)) {lignt_off;} - свет выключен.
if ((time_now<time_up) && (time_now>time_dn)) {lignt_on;} - свет включен.

- с верхним примером все работает.
Ну, а если варианты:
05:00 23:00 01:00
или
05:00 00:30 01:00
« Последнее редактирование: 21 Мая 2009 [09:53:56] от IOPA4 »
Глаза боятся - руки делают

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #49 : 21 Мая 2009 [10:46:59] »
01:00 - это время захода?

Тогда

if (time_dn<time_up)   time_dn+=24:00;
У вас заход случился на следующие сутки

Во втором случае чуток посложнее. Придется отдельно запоминать день. Затем если он изменился - к текущему  времени прибавлять 24 часа.
Логически это наиболее простой путь. Можно попытаться обойтись без слежения за датой, тогда, как говаривал один профессор, придется "гусарствовать" с логикой.

Скажем, так:
if ( (time_dn<time_up)&&(time_now<time_dn))  time_now+=24:00;
if (time_dn<time_up)   time_dn+=24:00;

Но тогда тут тонкость: пересчет новых time_dn и time_up нужно производить только спустя достижения time_now времени time_dn. Точнее, не просто достижения, а взять запас минут пятнадцать. т.е. после достижения time_dn + 15 минут.  Чтобы исключить проблемы, когда день увеличивается - иначе на эти пару минут вы опять попадете в ситуацию
if ( (time_dn<time_up)&&(time_now<time_dn))  time_now+=24:00;
и еще раз прибавите 24 часа.
« Последнее редактирование: 21 Мая 2009 [11:20:31] от елVIс »
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #50 : 21 Мая 2009 [10:50:24] »
Да, 01:00 время захода.
Это все из-за полярных широт. Для средней полосы все работает на ура, а вот для Мурманска - одни проблемы. ???
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #51 : 21 Мая 2009 [10:53:08] »
01:00 - это время захода?

Тогда

if (time_dn<time_up) time_dn+=24;

У вас заход случился на следующие сутки

Тогда последнее выражение будет работать? Время примет вид:
05:00 00:30 25:00
Глаза боятся - руки делают

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #52 : 21 Мая 2009 [11:21:22] »
не ожидал, что вы быстро ответите - смотрите мой исправленный пост
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #53 : 21 Мая 2009 [11:42:52] »
1. Расчет времени восхода и захода происходит 1 раз в сутки на время 24:00(00:00) и заносится в переменные HH[] и MM[], значение 66 - солнце не восходит и 99 - не заходит.
2. Слежение за состоянием света происходит ежеминутно:
 void on_off_led(void)
  { 
    int time_dn, time_up, time_now;//чтобы каждый раз коррекция не вносила свою лепту
    if ((HH[0] != 66) || (HH[0] != 99))
    {
      time_up=(HH[0]*60 + MM[0]);//время вкл
      time_dn=(HH[1]*60 + MM[1]);//время выкл
      time_now=(int)Hour*60 + Mins;
      if ((time_up>time_dn) && (time_now>time_dn)) {time_dn=time_dn+24*60;};
    }
    if (HH[0]==66) {on_state();} else //если полярный ночь
    if (HH[0]==99) { off_state();} else  //если полярный день
    if ((time_now>=time_up) && (time_now<=time_dn)) {off_state();} else
    if ((time_now>time_dn) && (time_now<time_up)) {on_state();};
}
« Последнее редактирование: 21 Мая 2009 [20:03:43] от IOPA4 »
Глаза боятся - руки делают

Оффлайн esdees

  • Новичок
  • *
  • Сообщений: 12
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от esdees
Re: Расчет гражданский сумерек
« Ответ #54 : 10 Апр 2011 [22:30:37] »
IOPA , TAU

У вас в программе ошибка. При  20/03/ любого года на любые координаты.
Напр.
Долгота:33.0       
Широта: 69.0

расчет даёт:
Восход = 16:52
Заход = 23:03
 
Начало утренних сумерек = 16:23
Конец вечерних сумерек = 23:32

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #55 : 10 Апр 2011 [22:59:39] »
И что за крики в похороненной теме? :) Переход через ноль по прямому восхождению не обработан. Типичный случай раздолбайства рассеянности.

Оффлайн esdees

  • Новичок
  • *
  • Сообщений: 12
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от esdees
Re: Расчет гражданский сумерек
« Ответ #56 : 11 Апр 2011 [10:37:43] »
Спасибо за такую оперативность, честно говоря не ожидал.
Прошу прощения, вы не поможете исправить? Или хотя бы научите в какой переменной искать та?
Для меня это сейчас актуально (важно на С, но и для проверки на бейсик тоже).

Оффлайн esdees

  • Новичок
  • *
  • Сообщений: 12
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от esdees
Re: Расчет гражданский сумерек
« Ответ #57 : 11 Апр 2011 [21:09:41] »
HLP PLS!
Помогите, пожалуйста,прошу вас!

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #58 : 11 Апр 2011 [21:37:10] »
Найдите в коде вот эту строку (вычисление средней скорости изменения прямого восхождения Солнца внутри суток):
var1 = (RaSun[1] - RaSun[0]) / 24; // dra=var1и перед ней напишите строку:
if RaSun(1) < RaSun(0) then RaSun(1)=RaSun(1)+360 или  (если RaSun в радианах)
if RaSun(1) < RaSun(0) then RaSun(1)=RaSun(1)+2*PIСинтаксис бейсиковский, сами поправите на СИ.

Маринер-9

  • Гость
Re: Расчет гражданский сумерек
« Ответ #59 : 11 Апр 2011 [22:57:29] »
Найдите в коде вот эту строку (вычисление средней скорости изменения прямого восхождения Солнца внутри суток):
  Странно, у меня никогда таких проблем не было, даже когда программировал на приставке с процессором 8080 (подключаемой к телевизору) и оперативной памятью 32 килобайта.. Вот что значит самому алгоритмы придумывать...