Точный таймер
- Войдите на сайт для отправки комментариев
Ср, 16/10/2013 - 22:32
Имеется Arduino Uno.
Задача - каждые ровные(!) 5 минут опрашивать датчики и отправлять данные - т.е. данные должны уйти например в 9:00, 9:05, 9:10 и т.д.
Логично предлположить, что delay(300000) нам не подойдет - проблематика в том, что опрос датчиков и отправка данных занимают время, и, самое главное, время всегда разное.
Как решаются такие задачи? И решаются ли без датчиков точного времени (NtpClient?)?
Если не требуется секундной точности, то можно попробовать RTC
да, я в последнем сообщении указал, можно ли обойтись без него, например, используя NtpClient?
А почему нельзя? Надо только подобрать интервал синхронизации
Вот только для NtpClient нужен открытый порт на роутере, а хотелось бы полностью независимое универсальное решение...
"полностью независимое универсальное решение" - это считать время самому контроллеру (если его погрешность не критична)
Так, хорошо, а при использовании RTC и без NTP реально привязаться к точным отрезкам 09:00:00, 09:05:00..?
myagi, можно перед опросом датчиков взглянуть на часы (t1), и после опроса тоже (t2). Длительнocть большой паузы вычислить 300000-(t2-t1). И, вероятно, обойтись без RTC и NTP.
Я сделал немного по другому.
Дуина с ethernet-шилдом в режиме сервера с датчиками сидит и ждет из сети HTTP GET-запрос.
Сам сервер где копятся все данные и идет их обработка и анализ (ПК на Ubuntu server) генерит этот GET запрос каждые 300 секунд (5 минут) по таймеру синхронизированому раз в сутки по NTP.
Дуина при получении запроса делает все свои замеры и формирует ответ на этот запрос. При этом неважно сколько длится процес измерения дуиной своих датчиков 0,7мс или 3 минуты, сервер на базе ПК все равно сгенерит следующий GET запрос точно через 300 секунд.
все верно, у меня сейчас также.
но хочется перейти на новый уровень, сделать модульную систему:
1) во-первых, если дуинка за роутером, то надо прокидывать порт на роутере + не факт что роутер имеет внешний IP, а это танцы с dyndns;
2) во-вторых, если добавляется новая дуина, то вмешательство в сервер (крон) хочется исключить.
Как мне кажется, ситуация, когда дуина - клиент, а не сервер, решает эти 2 вопроса.
Задача - каждые ровные(!) 5 минут опрашивать датчики и отправлять данные - т.е. данные должны уйти например в 9:00, 9:05, 9:10 и т.д. Логично предлположить, что delay(300000) нам не подойдет - проблематика в том, что опрос датчиков и отправка данных занимают время, и, самое главное, время всегда разное. Как решаются такие задачи? И решаются ли без датчиков точного времени (NtpClient?)?
Если "данные должны уйти" - то задача, из-за возможных задержек передачи, неразрешима в принципе. Но есть другой вариант: включать в данные - точное время измерения. Либо, все-таки, смириться с тем, что будет разброс в несколько секунд...
Чем вам mills() не подходит? Она считает тики времени независимо (условно) от хода программы и в отличие от delay дает предсказуемые интервалы
точность хода mills определяется точностью хода основного кварца.
если она не устраивает, настраивайте режим асинхронного таймера и тактируйте его или от часового кварца или от более точного внешнего генератора, пишите свою версию mills для работы по этому ассинхронному таймеру
это если вам нужны точные интервалы времени. А вот если вам надо запускаться в точные моменты времени (как написано - в 9:00, 9:05 и тд), то это другая задача. Здесь надо брать RTC и делать им периодическую синхронизацию имеющимися способами - например по ntp или gps
Так, хорошо, а при использовании RTC и без NTP реально привязаться к точным отрезкам 09:00:00, 09:05:00..?
Да. И без использования RTC/NTP тоже вполне реально
Да. И без использования RTC/NTP тоже вполне реально
Как?) Как в дуинке привязаться к 09:00:00 без RTC/NTP?
а) при запуске ардуины выставляем точное время (например, по Serial)
б) в процессе работы считаем время, посекундно. Это время можно переводить либо в стандартную форму hh:mm:ss, либо пользоваться интервалами (например, 5 минут = 300 секунд).
Если не требуется привязки именно к времени (т.е. если нет необходимости знать, что событие произошло именно в 9:00, а не в 9:05) , то проще пользоваться интервалами (и по истечению интервала что-то делать)
а) при запуске ардуины выставляем точное время (например, по Serial)
А если дуина не подлючена к сериалу? Например, питается от БП и включена в сеть?
Тогда выставлять иным образом - dip-переключателями, кнопками, etc.
Т.е. на базе ардуины делается будильник, у которого в момент срабатывания меняется время "звонка" на "+5 минут" (или на "+N минут", в зависимости от потребностей)