Точный таймер

myagi
Offline
Зарегистрирован: 02.07.2012

Имеется Arduino Uno.

Задача - каждые ровные(!) 5 минут опрашивать датчики и отправлять данные - т.е. данные должны уйти например в 9:00, 9:05, 9:10 и т.д.

Логично предлположить, что delay(300000) нам не подойдет - проблематика в том, что опрос датчиков и отправка данных занимают время, и, самое главное, время всегда разное.

Как решаются такие задачи? И решаются ли без датчиков точного времени (NtpClient?)?

 

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

Если не требуется секундной точности, то можно попробовать RTC

myagi
Offline
Зарегистрирован: 02.07.2012

да, я в последнем сообщении указал, можно ли обойтись без него, например, используя NtpClient?

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

А почему нельзя? Надо только подобрать интервал синхронизации

myagi
Offline
Зарегистрирован: 02.07.2012

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

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

"полностью независимое универсальное решение" - это считать время самому контроллеру (если его погрешность не критична)

myagi
Offline
Зарегистрирован: 02.07.2012

Так, хорошо, а при использовании RTC и без NTP реально привязаться к точным отрезкам 09:00:00, 09:05:00..?

toc
Offline
Зарегистрирован: 09.02.2013

myagi, можно перед опросом датчиков взглянуть на часы (t1), и после опроса тоже (t2). Длительнocть большой паузы вычислить 300000-(t2-t1). И, вероятно, обойтись без RTC  и NTP. 

dmw
Offline
Зарегистрирован: 24.03.2013

Я сделал немного по другому.

Дуина с ethernet-шилдом в режиме сервера с датчиками сидит и ждет из сети HTTP GET-запрос.

Сам сервер где копятся все данные и идет их обработка и анализ (ПК на Ubuntu server) генерит этот GET запрос каждые 300 секунд (5 минут) по таймеру синхронизированому раз в сутки по NTP.

Дуина при получении запроса делает все свои замеры и формирует ответ на этот запрос. При этом неважно сколько длится процес измерения дуиной своих датчиков 0,7мс или 3 минуты, сервер на базе ПК все равно сгенерит следующий GET запрос точно через 300 секунд.

myagi
Offline
Зарегистрирован: 02.07.2012

все верно, у меня сейчас также.

но хочется перейти на новый уровень, сделать модульную систему:

1) во-первых, если дуинка за роутером, то надо прокидывать порт на роутере + не факт что роутер имеет внешний IP, а это танцы с dyndns;

2) во-вторых, если добавляется новая дуина, то вмешательство в сервер (крон) хочется исключить.

Как мне кажется, ситуация, когда дуина - клиент, а не сервер, решает эти 2 вопроса.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

myagi пишет:

Задача - каждые ровные(!) 5 минут опрашивать датчики и отправлять данные - т.е. данные должны уйти например в 9:00, 9:05, 9:10 и т.д. Логично предлположить, что delay(300000) нам не подойдет - проблематика в том, что опрос датчиков и отправка данных занимают время, и, самое главное, время всегда разное. Как решаются такие задачи? И решаются ли без датчиков точного времени (NtpClient?)?

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

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

Чем вам mills() не подходит? Она считает тики времени независимо (условно) от хода программы и в отличие от delay дает предсказуемые интервалы

точность хода mills определяется точностью хода основного кварца.

если она не устраивает, настраивайте режим асинхронного таймера и тактируйте его или от часового кварца или от более точного внешнего генератора, пишите свою версию mills для работы по этому ассинхронному таймеру

это если вам нужны точные интервалы времени. А вот если вам надо запускаться в точные моменты времени (как написано - в 9:00, 9:05 и тд), то это другая задача. Здесь надо брать RTC и делать им периодическую синхронизацию имеющимися способами - например по ntp или gps

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

myagi пишет:

Так, хорошо, а при использовании RTC и без NTP реально привязаться к точным отрезкам 09:00:00, 09:05:00..?

Да. И без использования RTC/NTP тоже вполне реально

myagi
Offline
Зарегистрирован: 02.07.2012

vdk пишет:

Да. И без использования RTC/NTP тоже вполне реально

Как?) Как в дуинке привязаться к 09:00:00 без RTC/NTP?

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

а) при запуске ардуины выставляем точное время (например, по Serial)

б) в процессе работы считаем время, посекундно. Это время можно переводить либо в стандартную форму hh:mm:ss, либо пользоваться интервалами (например, 5 минут = 300 секунд).

Если не требуется привязки именно к времени (т.е. если нет необходимости знать, что событие произошло именно в 9:00, а не в 9:05) , то проще пользоваться интервалами (и по истечению интервала что-то делать)

 

myagi
Offline
Зарегистрирован: 02.07.2012

vdk пишет:

а) при запуске ардуины выставляем точное время (например, по Serial)

А если дуина не подлючена к сериалу? Например, питается от БП и включена в сеть?

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

Тогда выставлять иным образом - dip-переключателями, кнопками, etc.

Т.е. на базе ардуины делается будильник, у которого в момент срабатывания меняется время "звонка" на "+5 минут" (или на "+N минут", в зависимости от потребностей)