Как правильно обрабатывать в программе переход через ПОЛНОЧЬ

Draghkon
Offline
Зарегистрирован: 17.09.2013

Столкнулся с проблемой: как сказать ардуине что между 23ч и 02ч, разница 3 часа, а не 21 час?

В целом задача такая: есть список настроек которые должны активироваться в определенное время. Нужно выбрать ту настройку которая соответствует текущему времени. 

Настройки храняться в массиве ввиде значений времени (пока планировалось ввиде кол-ва секунд с полуночи). 

Проблема начинается когда мы сравниваем время срабатывания настройки с текущим. 

К примеру, есть всего 2 набора настроек, один активируеся в 23-00, другой в 07-00.

Допустим ардуина потеряла питание и включилась в 03-00.

Значит должен активироваться набор настроек для 23-00, ведь мы понимаем что сутки движутся неприрывно и полночь 00часов, больше чем 23часа но меньше чем 07-00.

Вопрос: Как объяснить это Ардуине?

Каким должен быть единый алгоритм определения для случаев  23ч и 07ч и к примеру 15ч и 16ч ?

maksim
Offline
Зарегистрирован: 12.02.2012

Алгоритм этот называется календарем. 

Draghkon
Offline
Зарегистрирован: 17.09.2013

Ну календарь есть встроенный в RTC-tiny, только не понимаю как это применить.

Время выводится как:

RTC.read(time);

byte h=time.Hour; //часы

byte m=time.Munute; //минуты

byte s time.Second; //секунды

//можно было бы получать еще и число и месяц

int T=((h*60+m)*60+s) //переводим все в секунды - получим число секунд с полуночи

 

Как здесь увязать календарь?

vdk
Offline
Зарегистрирован: 14.04.2013

Переводить "обычное" время в unixtime

 

Draghkon
Offline
Зарегистрирован: 17.09.2013

Спасибо, Можно и так на ближайшие годы должно хватить 4х байт Long

Draghkon
Offline
Зарегистрирован: 17.09.2013

Как следствие возник вопрос: а есть ли библиотека для перевода даты\времени в unixtime и обратно?

vdk
Offline
Зарегистрирован: 14.04.2013

Перевод в unixtime есть в RTClib

Draghkon
Offline
Зарегистрирован: 17.09.2013

Да, пробовал её использовать но она не компилится (примеры компилятся, а в составе программы нет) - жалуется на ошибки в RTClib.h

 

vdk
Offline
Зарегистрирован: 14.04.2013

если лень разбираться, почему возникают ошибки, можно из нее к себе нужный код выдрать

Draghkon
Offline
Зарегистрирован: 17.09.2013

Если кому-то нужно, вот код выдающий unixtimestamp, Предполагается наличие RTC выдающего часы минусы секунды, число, месяц, год.

#define SECONDS_FROM_1970_TO_2000 946684800
const uint8_t daysInMonth [] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//число дней в месяцах

static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { //пересчет дней и времени в секунды
    return ((days * 24L + h) * 60 + m) * 60 + s;
}

static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { //перевод даты (год, месяц, день) в дни
    if (y >= 2000)
        y -= 2000;
    uint16_t days = d;
    for (uint8_t i = 1; i < m; ++i)
        days += pgm_read_byte(daysInMonth + i - 1);
    if (m > 2 && y % 4 == 0)
        ++days;
    return days + 365 * y + (y + 3) / 4 - 1;
}

long unixTime(int y, int m, int d, int hh, int mm, int ss ) { //расчет unixtime timestamp
  long t;
  uint16_t days = date2days(y, m, d);
  t = time2long(days, hh, mm, ss);
  t += SECONDS_FROM_1970_TO_2000;  // seconds from 1970 to 2000

  return t;
}


//вызов выглядит так
long setTime=unixTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second); //переводим в unixtimestamp

 

 

Но проблему свою я так и не решил((

Дело в том что юникстайм помогает, если я учитываю в настройках дату, т.е. 23:00 03.02.2014 и 07:00 04.02.2014 - тогда по юникс тайму можно понять что произошел переход через 00 часов и 07-00 - это больше, чем 23-00.

НО мне нужно установить СУТОЧНЫЙ таймер, т.е. чтобы можно было задать настройку к примеру  на 23-00 и 07-00 НЕ ЗАВИСИМО ОТ ДАТЫ!

И я что-то никак не соображу как это сделать?!

Draghkon
Offline
Зарегистрирован: 17.09.2013

Придумал таки алгоритм как обойтись без Unix timestamp и правильно обрабатывать суточный таймер, без учета даты вообще.) Если надо, выложу код). Всем спасибо)