Понятно, что ключевая функция часов — измерение времени (кто бы подумал, да?). И делать это желательно максимально точно, здесь есть несколько вариантов и подводных камней.
Итак, какие доступные в «железе» способы измерения времени мы можем использовать?
Встроенный RC-генератор процессора
Самая простая идея, которая может придти в голову — это просто настроить программный таймер, и им отсчитывать секунды. Так вот, эта идея никуда не годится. Часы-то работать конечно будут, только вот точность встроенного генератора никак не регламентируется, и может «плавать» в пределах 10% от номинала. Вряд ли кому-то нужны часы, уходящие в месяц на 15 минут.
Модуль реального времени DS1307
Более правильный вариант, он же использующийся в большинстве «народных» изделий — это часы реального времени. Микросхема обменивается с микроконтроллером по I2C, требует минимума обвязки (кварц и пара резисторов). Цена вопроса около 100р за микросхему, или около 1$ на ебее за готовую плату с микросхемой, модулем памяти и разъемом для батарейки.
Схема из даташита:
Что не менее важно, микросхема выпускается в DIP-корпусе, значит припаять ее может любой начинающий радиолюбитель. Встроенная батарейка обеспечивает работу часов, даже если питание было отключено.
Казалось бы, все хорошо, если бы не одна проблема — невысокая точность. Примерная точность часовых кварцев — 20-30ppm. Обозначение ppm — parts per million, показывает число миллионных долей. Казалось бы, 20миллионных — это супер, однако для частоты в 32768Гц получается 20*32768/1000000 = ±0,65536Гц, т.е. уже полгерца. Путем несложных подсчетов видно, что генератор с такой разницей за сутки «натикает» лишних (или недостающих) 56тыс тактов, что соответствует 2 секундам в день. Кварцы бывают разные, некоторые пользователи писали и об ошибке в 5 секунд в день. Как-то не очень точно — за месяц такие часы уйдут как минимум, на минуту. Это уже приличная разница, заметная невооруженным глазом (когда любимый сериал бабушки начинается в 11.00, а часы показывают 11.05, разработчику таких часов перед родственниками будет неудобно).
Впрочем, поскольку температура в помещении более-менее стабильна, и частота кварца не будет сильно меняться, можно добавить программную коррекцию. Другой совет, даваемый на форумах, использовать часовой кварц от старых материнских плат, по отзывам, они там довольно точные.
Модуль реального времени DS3231
Мы не первые, кто задался вопросом точности, и компания Dallas пойдя навстречу пожеланиям, выпустила более совершенный модуль — DS3231. Он называется «Extremely Accurate Real Time Clock», имеет встроенный генератор с температурной коррекцией. Точность в 10 раз выше, и составляет 2ppm. Цена вопроса чуть повыше, но корпус микросхемы рассчитан под SMD-монтаж, паять не так удобно, зато можно купить на ебее готовую плату.
(фото с сайта продавца)
Точность в 6 секунд в месяц, это уже неплохой результат. Но мы пойдем дальше — в идеале, часы в 21 веке вообще не нужно подстраивать.
Радиомодуль DCF-77
Метод скорее экзотический, но для полноты картины его нельзя не упомянуть. Немногие знают, но сигналы точного времени передаются по радио еще с 70х годов. Передатчик DCF-77 расположен в Германии недалеко от Франкфурта, и на СДВ-частоте 77.5КГц передаются метки точного времени (да, у них уже 20 лет назад были настенные и настольные часы, которые не надо подстраивать).
Способ хорош тем, что схема имеет малое энергопотребление, так что сейчас производятся даже наручные часы с такой технологией. Готовую плату приема DCF-77 можно купить на ebay, цена вопроса 20$.
Многие часы и метеостанции имеют возможность приема DCF-77, проблема лишь в том, что до России сигнал практически не доходит. Карта покрытия с Википедии:
Как можно видеть, лишь Москва и Питер находятся на границе зоны приема. По отзывам владельцев, лишь иногда сигнал удается принять, что для практического применения конечно, не годится.
GPS-модуль
Если часы будут стоять недалеко от окна, то вполне реальный метод получения точного времени — GPS-модуль. Эти модули можно недорого купить на ebay (цена вопроса 10-15$). Например, Ublox NEO-6M, подключается напрямую к serial-пинам процессора, и выдает строки NMEA на скорости 9600.
Данные приходят примерно в таком формате " $GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A", и распарсить их даже для слабой Arduino труда не составляет. Патриоты кстати, могут приобрести более дорогой модуль Ublox NEO-7N, поддерживающий (по отзывам) как GPS так и «Глонасс».
Очевидно, что про разные часовые пояса GPS-модуль ничего не знает, так что их вычисление и смену летнего/зимнего времени, разработчику придется продумать самому. Другой минус использования GPS — относительно высокое энергопотребление (впрочем, некоторые модули можно отдельными командами переводить в «спящий режим»).
Wi-Fi
И наконец, последний (и самый очевидный на сегодняшний момент), способ получения точного времени — это брать его из Интернета. Здесь есть два подхода. Первый, и наиболее простой — использовать в качестве платы часов что-то типа Raspberry PI с Линуксом, тогда делать ничего не надо, все будет работать «из коробки». Если же хочется «экзотики» — то самым интересным вариантом является модуль esp8266.
Это недорогой (цена вопроса около 200р на ebay) WiFi-модуль может обмениваться с сервером по serial-порту процессора, при желании его можно также перепрошить (сторонних прошивок довольно много), и часть логики (например опрос сервера времени) сделать в самом модуле. Сторонними прошивками поддерживается куча всего, от Lua до C++, так что вариантов «размять мозги» вполне достаточно.
На этом тему измерения времени наверно можно закрыть. В следующей части мы поподробнее рассмотрим процессоры, и способы вывода времени.
Комментарии (33)
eta4ever
20.08.2015 13:15+1Еще в некоторых микроконтроллерах свой блок RTC есть, в STM32 не самых младших, например.
eta4ever
20.08.2015 13:20Также, извращенный вариант, но если GSM-модуль в конструкции уже предусмотрен…
Kidar
20.08.2015 14:05Являюсь владельцем часов с DCF77. Куплены в далеком 2000 году в Германии, предназначались для крепления в салоне автомобиля, что очень удобно в эксплуатации. Но как замечено в статье, не ловят они сигнал с родины в нашей стране. В Казани бывает лишь несколько раз в год что-то поймают в период весеннего прохождения и синхронизируются. Обычное их состояние — ожидание сигнала.
В итоге, сделал часы на GPS, которым не требуется ни кварц, ни батарейка для модуля реального времени. Поймали сигнал и точное время пошло. Смещение для своего часового пояса устанавливается при первом включении и сохраняется в дальнейшем. Если кому интересно, то вся документация в статье наХабре, оказывается — перекинули на GT.
Фото обоих часов, с DCF77 и GPS.CAJAX
20.08.2015 15:17Есть ещё один экзотический вариант — сотовая сеть CDMA. Не знаю тонкостей, но я наблюдал как телфон (простая звонилка), не привязаный к оператору, регулярно синхронизировал часы.
DmitrySpb79
20.08.2015 15:21-1Разве CDMA не вымерло уже? Это по-моему лет 10 назад было?
А то можно еще пейджеры вспомнить… :)
Kidar
20.08.2015 16:44Начало шестого сигнала соответствует…
На этом принципе делалась ежечасная синхронизация по сигналам точного времени, передаваемых радиостанцией «Маяк».
KonstantinSoloviov
20.08.2015 17:04Очевидно, что про разные часовые пояса GPS-модуль ничего не знает, так что их вычисление и смену летнего/зимнего времени, разработчику придется продумать самому.
Мало того, в GPS «свое» время — уже полтора десятка секунд от UTC расхождения набежало.denmmx
20.08.2015 17:45В каком смысле — «набежало»? На каждом спутнике GPS свои атомные часы, или я чего-то не понимаю?
deniszh
20.08.2015 18:10+1«GPS time was zero at 0h 6-Jan-1980 and since it is not perturbed by leap seconds GPS is now ahead of UTC by 17 seconds.» — то есть, время GPS было синхронизировано с UTC 6 января 1980, и не корректировалось на високосные секунды, из за чего на данный момент расхождение составляет 17 секунд.
denmmx
20.08.2015 20:05Википедия сообщает, что протокол NMEA передает информацию о секунде координации, вернее уже скорректированное ей значение времени.
KonstantinSoloviov
20.08.2015 21:57+1Чуть копнул поглубже… Действительно, согласно протоколу, время передается в UTC.
Mulin
20.08.2015 19:01+1Вот люди заморачиваются, я определяю время по микроволновке с точностью ± 5 минут и мне хватает))
… правда иногда опаздываю.
Alexeyslav
21.08.2015 11:35+1Забыли еще один вариант, который все же имеет право на существование. Генератор ГИАЦИНТ, например. Имеющий на несколько порядков большую точность поддержания частоты чем обычный кварцевый генератор.
Кстати, часовые генераторы можно подстраивать! Делается это путем подстройки нагрузочных емкостей генератора. Нужна только подстроечная емкость на десяток пикофарад. Если добавить термостат для этих емкостей и кварца, стабильность частоты можно поднять на два порядка. Собственно, тогда получится практически тот самый ГИАЦИНТ…fivehouse
21.08.2015 13:22А сколько этот ГИАЦИНТ-М потребляет? Хотелось бы просто часы на стол без подключения в розетку.
Rumlin
21.08.2015 15:10питание 27 вольт
Максимальная мощность -14 Вт www.priborelektro.ru/product/price/standarty-i-sintezatory-chastot-37/224.html
Alexeyslav
21.08.2015 16:40Если нужна максимальная автономность, то ГИАЦИНТ может работать в составе первичных часов, получая стационарное питание. А вторичные — синхронизироваться по ним.
Конечно с точки зрения обычного обывателя всё это может показаться избыточным когда есть GPS, интернет и всё такое… но такой вариант обладает определенной степенью независимости и автономии от внешнего мира. интернет отключат, GPS в определенных условиях потеряет необходимое количество спутников, DCF может оказаться длительное время без прохождения… а ГИАЦИНТ будет работать пока есть энергия.
Брат дома сделал целый выводок часов без кварцевой стабилизации вообще — они все при помощи блютуз-модулей раз в минуту синхронизируются с первичными часами, которые получают время с GPS. Погода пока не подводила, или по крайней мере это происходило незаметно для пользователя.
Без синхронизации они уходят больше чем за минуту в час.
Теоретически, работе GPS-модуля может помешать сильная непогода, которая перекроет и без того слабый сигнал от спутников за горизонтом. Можно на десяток часов остаться без точного времени, если не иметь резерва.KivApple
11.09.2015 23:32Для определения местоположения по GPS нужно 3-4 спутника, причём отражение или небольшое искажение сигнала всё испортит (потому что при расчётах положения нужно очень точное время приёма, иногда важна даже фаза сигнала). Для определения точного времени достаточно одного, причём сигнал может быть не самым чистым (достаточно, чтобы было реально его декодировать в цифровой вид, на фазу, реальное время прохождения от спутника до приёмника — плевать). В общем, время по GPS можно получить в условиях на порядок хуже, чем нужны для определения координат. Мой модуль даже глубоко в комнате умудрялся за десяток минут таки поймать сигнал хотя бы от одного спутника и определить время. А уж на окне точно будет нормально ловить в любую погоду, если у него нормальная антенна.
Хотя, конечно, если речь идёт о ядерном апокалипсисе (а когда ещё исчезнут сигналы сразу от GPS и ГЛОНАСС) или хотя бы каком-нибудь подземном бункере, то можно подумать об большей автономности. Но тут интересно, нет ли более компактных вариантов прецизионных генераторов.Alexeyslav
11.09.2015 23:48более компактных чем что? Какой-нибудь цезиевый эталон частоты?
KivApple
12.09.2015 00:18Я не думаю, что у в условиях ядерного апокалипсиса нужна будет точность, как у атомных часов. Особенно простым смертным.
fivehouse
Мечтаю купить небольшие часы на стол, которые бы показывали точное время и хотябы 3-4 года не требовали внимания к себе. И за месяц до того, как остановятся по причине проблемы с питанием, сообщали бы это. GPS и DCF77 ловит не у окна плохо. WIFI потребляет энергию.
eta4ever
Я бы тогда подумал над периодической синхронизацией по Wi-Fi, чтобы в обычном режиме ESP8266 был выключен наглухо, варварски, по питанию.
DmitrySpb79
Тут еще встает задача найти маложрущий проц, если стоит задача чтобы девайс работал годами от батарейки.
ESP8266 жрет по отзывам прилично, до 0.5А вроде в пике, но если раз в неделю синхронизироваться, может и сойдет.
MsM78
А если в качестве источника питания использовать садовые фонарики с аккумулятором и солнечной батареей?
DmitrySpb79
В помещении освещенность раз в 10 меньше чем на улице :) Так что КПД батареи будет никакой. Но если делать часы которые будут стоять на подоконнике у окна, то почему нет, вполне вариант.
У меня уже год на окне стоит солнечная батарея, я от нее мобилу заряжаю. Напишу как-нибудь о своих экспериментах :)
Rumlin
Я не спеша настольные часы на ESP8266 (ESP-12) мастерю — тут ток не важен, ток не меньше, чем у самих больших LED индикаторов. Другой вопрос был бы, если это были часы с LCD индикаторами.
Alexeyslav
Даже плохой кварц обеспечивает +-2 сек в сутки. Если синхронизировать часы каждые 6 часов — никаких проблем не будет.
Кстати, если синхронизировать часы через интернет надо очень основательно подходить к выбору источника точного времени, а именно обратить внимание на его уровень STRATUM. Самый хороший вариант — это STRATUM = 2 (= 1 к сожалению слишком дорого обойдется, т.к. для этого придется завести рядом атомные часы с непосредственным подключением — никаких тебе интернетов и даже радиоинтерфейсов).
Использование в качестве источников времени сигналы точного времени по телевизору и радио с уровнем STRATUM = 5 или даже 6 чревато кратковременными отклонениями от точного времени секунд на 20...30 хотя на больших промежутках времени(месяцы, годы) время будет идти точно. Связано это с причудливыми сочетаниями связей в цепочке синхронизации и периодичностью синхронизации в каждом узле цепочки.
Решение проблемы плохого приёма может стать организация сети первичных и вторичных часов. Т.е. организуются первичные часы где-то у окна со стационарным питанием и GPS, они синхронизируют своё время и раздают вторичным часам уже локально, в пределах комнаты или дома — это может быть любой интерфейсс: провода, радио, ИК, УЗ…
akden
Тоже подыскиваю на стол/стену нечто подобное, причем устройство которое проработает лет 10 без вмешательства вполне реально, так как наручные часы уже давно используют свет для своей работы, синхронизацию можно например через блутус сделать.