Easyelectronics.ru

Электроника для всех
Текущее время: 19 июл 2018, 22:37

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 06:22 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
Доброго времени суток. Подскажите следующий момент, думаю кто-то, уже не раз сталкивался с подобной проблемой, а я весь мозг уже себе поломал.
Суть: алгоритм переключения день/ночь по заданным пользователем границам.
Моя заготовка кода, которая, само собой, работает криво:

Код:
void Heater::DayToNightChanger(){
   currentHour         =   ( (currentHourBCD/(uint8_t)16*(uint8_t)10) + (currentHourBCD%(uint8_t)16)); // это просто получение времени
   currentMinute      =   ( (currentMinuteBCD/(uint8_t)16*(uint8_t)10) + (currentMinuteBCD%(uint8_t)16)); // Формула значения не имеет.

   if (time == DAY ){
      if((currentHour>=timeOfNight_hours))
         if(currentMinute>=timeOfNight_minutes)
            time=NIGHT;}
      else{
      if((currentHour>=timeOfDay_hours))
         if(currentMinute>=timeOfDay_minutes)
            time= DAY;}
}


Задача - переключать флаг time, в зависимости от текущего времени суток. Данные уже переведены в бинарный формат. Есть идеи?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 09:22 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2470
Откуда: Санкт-Петербург
Раз уж у вас время в BCD - просто возьмите часы-минуты вместе: uint16_t time = ((uint16_t)currentHourBCD<<8) + currentMinuteBCD и сравнивайте с аналогичными значениями границ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 10:16 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
aamonster писал(а):
Раз уж у вас время в BCD - просто возьмите часы-минуты вместе: uint16_t time = ((uint16_t)currentHourBCD<<8) + currentMinuteBCD и сравнивайте с аналогичными значениями границ.

Как это поможет? Если девайс включили в произвольное время суток, то как определить какая сейчас граница?
А то, что там BCD или не BCD на данный момент не важно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 10:53 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Как можно определить день/ночь, не зная даты и широты?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:06 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3136
Eddy_Em писал(а):
Как можно определить день/ночь, не зная даты и широты?


Сразу видно астроном :)
Полагаю так как чиновники определяют рабочий день или часовой пояс, с потолка.
С 6 до 18 день остальное ночь :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:17 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
fr0ster писал(а):
С 6 до 18 день остальное ночь :)

У колхозников летом день начинается часа в 4, а во время уборки так вообще круглосуточно работают, пока погода есть! А в каких-нибудь москвабадах в 9 утра хрен в какую организацию пробьешься: то с 10, то вообще с 11 работать начинают!

Как-то это все-таки неправильно — определять день/ночь по времени. Разве что стоит задача, скажем, открывать/закрывать шторы, тогда действительно можно один раз ввести: будни — такое-то время, выходные — такое-то (но, опять же, придется вести учет и календаря помимо времени + иметь корректируемый список праздничных дней, чтобы все эти байрамы и прочие хануки пользователь мог заранее вводить).

А по поводу ТС, время лучше выразить в минутах с начала суток.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:20 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Dan_ex писал(а):
Если девайс включили в произвольное время суток, то как определить какая сейчас граница?

Элементарно во время инита.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:48 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
Eddy_Em писал(а):
Dan_ex писал(а):
Если девайс включили в произвольное время суток, то как определить какая сейчас граница?

Элементарно во время инита.

Ваш Кэп? Или по делу что-то будет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:52 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
У ТСа видимо время в системе считается с 0 до 12ти а не с 0 до 24, как во всем остальном мире. Не?

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:58 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
Eddy_Em писал(а):
fr0ster писал(а):
С 6 до 18 день остальное ночь :)

А по поводу ТС, время лучше выразить в минутах с начала суток.

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

Я когда вопрос писал, думал, может кто в курсе как это по простому сделать. А набыдлокодить я в любой момент успею.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:58 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Dan_ex писал(а):
Или по делу что-то будет?

Это и есть по делу. В чем проблема текущее состояние КА во время инита устанавливать? Обычно так и делается. А дальше уже периодически проверяем, да меняем состояние по необходимости.
Понятно, что в ините проверка, подобная приведенному куску кода, не пойдет: надо проверить именно интервалы. Т.е. если время >= "утро" и <= "вечер", ставим состояние в "день", иначе ставим состояние в "ночь".
А дальше и эта проверка справится со своей задачей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 11:59 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
MasterAlexei писал(а):
У ТСа видимо время в системе считается с 0 до 12ти а не с 0 до 24, как во всем остальном мире. Не?

С чего вы это решили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 12:04 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2510
Откуда: КЧР, поселок Нижний Архыз
Dan_ex писал(а):
2 произвольных границы, которые нужно хитрым образом принять во внимание

Вот не пойму, откуда здесь сложность может возникнуть?
Пользователь задает переменные morning_time и evening_time, которые хранятся в EEPROM или флеш (смотря что за МК). Дальше — все, как я выше описал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 12:07 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
Dan_ex писал(а):
MasterAlexei писал(а):
У ТСа видимо время в системе считается с 0 до 12ти а не с 0 до 24, как во всем остальном мире. Не?

С чего вы это решили?


С того, что вы по времени пытаетесь определить, день сейчас или ночь. По вашим же словам: "Если девайс включили в произвольное время суток".
Вам уже тут сказали, что примерно с 7 утра до 18 вечера - день, все остальное ночь. Ну или по заданным пользователем границам.

Или же у вас вопрос состоит вообще в другом - как узнать, сколько сейчас времени вообще?
Тогда либо ждать, когда пользователь сам введет текущее время, либо использовать синхронизацию с внешними источниками (Езернет, DCF77....).

Вот вообще не вижу проблемы в вашем случае.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 12:20 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 553
Откуда: Германия
Код:
void Heater::DayToNightChanger(){
   uint16_t t = (uint16_t)currentHour*60 + currentMinute;
   uint16_t b = (uint16_t)timeOfDay_hours*60 + timeOfDay_minutes;
   uint16_t e = (uint16_t)timeOfNight_hours*60 + timeOfNight_minutes;

   time = (t >= b && t < e) ? DAY : NIGHT;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преключение день/ночь
СообщениеДобавлено: 11 окт 2017, 12:31 
Заглядывает иногда

Зарегистрирован: 06 июн 2011, 10:55
Сообщения: 40
Откуда: Иркутск
Задача решена.
Eddy_Em, dev - спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB