Циклический таймер и часы реального времени

Nurbol
Offline
Зарегистрирован: 15.07.2013

Здравствуйте, Ардуинеры

При применений таймера с выдержкой на 0,5-2 часа, объязателен ли RTC shield, у меня лежит UNO, можно ли справится без RTC шиелда?

Заранее блогадарен всем.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Конечно же нет. Ведь милис придумали для красоты

Nurbol
Offline
Зарегистрирован: 15.07.2013

конечно же нет? не справится UNO или не объязателен RTC shield.

axill
Offline
Зарегистрирован: 05.09.2011

Зависит от того какая точность вам нужна, если не страшно ошибиться на несколько десятков секунд на ваших 0.5-2 часах, то RTC явно лишний

Nurbol
Offline
Зарегистрирован: 15.07.2013

а есть функция работы с минутами, например delay и millis только не мсек а мин, а то delay(3600000) как то не то.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я видел библиотеку RTC где в качестве источника времени можно исользовать millis:

////////////////////////////////////////////////////////////////////////////////
// RTC_Millis implementation

long RTC_Millis::offset = 0;

void RTC_Millis::adjust(const DateTime& dt) {
    offset = dt.unixtime() - millis() / 1000;
	ok = 1;
}

DateTime RTC_Millis::now() {
  return DateTime((uint32_t)(offset + millis() / 1000));
}

uint8_t RTC_Millis::isrunning(void){
  return ok;
}
uint8_t RTC_Millis::begin()
{
  ok = 0;
  return 1;
}
////////////////////////////////////////////////////////////////////////////////

этот код уже есть в библиотеке по ссылке.

Время естественно нужно настраивать при каждом сбросе МК, можно добавить в setup

rtc.adjust(DateTime(__DATE__, __TIME__));

тогда оно будет установлено временем последней прошивки.

Код выполняет преобразование millis в unixtime. Выполняется правда долго.

axill
Offline
Зарегистрирован: 05.09.2011

Nurbol пишет:

а есть функция работы с минутами, например delay и millis только не мсек а мин, а то delay(3600000) как то не то.

delay это "не правильная" функция. Ей проще пользоваться с точки зрения логики, но она по сути заставляет МК работать в холостую заданное время

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

http://playground.arduino.cc/Main/MsTimer2

http://www.arduino.cc/playground/Code/Metro

MsTimer2 вызовет функция по истечении заданного времени в милисекундах. Это по-моему наиболее правильный способ работы с временем. А то, что время надо задавать как 3600000 так что такого? Можете сделать свою функцию или макрос, например:

#define time_to_mills(h, m) (h * 60 * 60 * 1000 + m * 60 * 1000)

....
void call_in_hour() {
.....
}
......
MsTimer2::set(time_to_mills(1, 0), call_in_hour); 
......

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

У Leshak на блогспоте ( жалко что  он его забросил) http://alxarduino.blogspot.com/2013/09/ComfortablyBlinkWithoutDelay.html

есть https://bitbucket.org/alxarduino/leshakutils/downloads

#define _SEC_(sec) 1000UL*sec
#define _MIN_(mn)  _SEC_(60*mn)
#define _HR_(h)  _MIN_(60*h)
#define _DAY_(d) _HR(24*d)


 

Nurbol
Offline
Зарегистрирован: 15.07.2013

Я не совсем понял, в MsTimer2 задается период или длительность выполнения?