С миру по нитке

Часы электронные светодиодные. Электронные часы своими руками

Часы со светодиодной подсветкой и пульсирующей минутной стрелкой на микроконтроллере Arduino
Эти уникальные часы со светодиодной подсветкой и пульсирующей минутной стрелкой удалось изготовить благодаря использованию микросхемы ШИМ-контроллера TLC5940. Его главной задачей является расширить количество контактов с ШИМ-модуляцией. Еще одной особенностью данных часов является переделанный аналоговый вольтметр в прибор измеряющий минуты. Для этого на стандартном принтере была распечатана новая шкала и наклеена поверх старой. Как таковая, 5-я минута не отсчитывается, просто в течение пятой минуты счетчик времени показывает стрелку, упершуюся в конец шкалы (зашкаливает). Основное управление реализовано на микроконтроллере Arduino Uno.

Для того чтобы подсветка часов не светилась слишком ярко в темной комнате, была реализована схема автоматической подстройки яркости в зависимости от освещенности (использовался фоторезистор).

Шаг 1: Необходимые компоненты



Вот что потребуется:

  • Модуль аналогового вольтметра на 5V DC;
  • Микроконтроллер Arduino UNO или другой подходящий Arduino;
  • Монтажная плата Arduino (прото плата);
  • Модуль часов реального времени DS1307 (RTC);
  • Модуль с ШИМ-контроллером TLC5940;
  • Лепестковые светодиоды подсветки – 12 шт.;
  • Компоненты для сборки схемы автоматического регулирования яркости (LDR).

Также, для изготовления некоторых других компонентов проекта желательно иметь доступ к 3D-принтеру и станку лазерной резки. Предполагается, что этот доступ у вас есть, поэтому в инструкции на соответствующих этапах будут прилагаться чертежи для изготовления.

Шаг 2: Циферблат




Циферблат состоит из трех деталей (слоев) вырезанных на станке лазерной резки из 3 мм листа МДФ, которые скрепляются между собой с помощью болтов. Пластина без прорезей (внизу справа на картинке) помещается под другой пластиной для позиционирования светодиодов (внизу слева). Затем, отдельные светодиоды помещаются в соответствующие пазы, и сверху одевается лицевая панель (сверху на рисунке). По краю циферблата просверлены четыре отверстия, через которые все три детали скрепляются вместе с помощью болтов.

  • Для проверки работоспособности светодиодов на этом этапе, использовалась плоская батарейка CR2032;
  • Для фиксации светодиодов использовались небольшие полоски липкой ленты, которые приклеивались с задней стороны светодиодов;
  • Все ножки светодиодов были предварительно согнуты соответствующим образом;
  • Отверстия по краям были просверлены заново, через которые и выполнялось скрепление болтами. Оказалось, что это намного удобнее.

Технический чертеж деталей для циферблата доступен по :

Шаг 3: Разработка схемы



На этом этапе была разработана электрическая схема. Для этого использовались различные учебники и руководства. Не будем сильно углубляться в этот процесс, в двух файлах ниже представлена готовая электрическая схема, которая была использована в этом проекте.

Шаг 4: Подключение монтажной платы Arduino





  1. Первым делом надо распаять все игольчатые контакты на монтажных и секционных платах;
  2. Далее, ввиду того, что питание 5V и GND используют очень много плат и периферийных устройств, для надежности, было припаяно по два провода на 5V и GND на монтажной плате;
  3. Далее был установлен ШИМ-контроллер TLC5940 рядом с используемыми контактами;
  4. После выполняется подключение контроллера TLC5940, согласно схеме подключения;
  5. Для того чтобы была возможность использовать батарею, был установлен модуль RTC на краю монтажной платы. Если припаять его посередине платы, то не будет видно обозначение контактов;
  6. Выполнено подключение модуля RTC, согласно схеме подключения;
  7. Собрана схема автоматического контроля яркости (LDR), ознакомиться можно по ссылке
  8. Выполнено подключение проводов для вольтметра, путем подключения проводов к выводу 6 и GND.
  9. В конце были припаяны 13 проводов для светодиодов (На практике оказалось, что это было лучше сделать до того, как приступать к шагу 3).

Шаг 5: Программный код

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

  • Перед прошивкой Arduino, нужно раскомментировать строку, которая устанавливает время:
    rtc.adjust(DateTime(__DATE__, __TIME__))
    После прошивки контроллера с этой строкой (время задано), нужно опять ее закомментировать и прошить контроллер заново. Это позволяет модулю RTC использовать батарею, для запоминания времени, если пропадет основное питание.
  • Каждый раз, когда вы используете "Tlc.set ()", вам нужно использовать "Tlc.update"

Шаг 6: Внешнее кольцо

Внешнее кольцо для часов было напечатано на 3D-принтере Replicator Z18. Оно прикрепляется к часам с помощью винтов на лицевой стороне часов. Ниже прилагается файл с 3D-моделью кольца для печати на 3D-принтере.

Шаг 7: Сборка часов


Микроконтроллер Arduino со всей остальной электроникой был закреплен на задней стороне часов с помощью саморезов и гаек в качестве распорок. Затем подключены все светодиоды, аналоговый вольтметр и LDR к проводам, которые ранее были подпаяны к монтажной плате. Все светодиоды соединены между собой одной ножкой и подключены к контакту VCC на контроллере TLC5940 (по кругу просто припаян кусок проволоки).

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

В продаже можно встретить много различных моделей и вариантов электронных цифровых часов, но большинство из них расчитаны на использование внутри помещений, так как цифры маленькие. Однако иногда требуется разместить часы на улице - например на стене дома, или на стадионе, площади, то есть там, где они будут видны на большом расстоянии многими людьми. Для этого и была разработана и успешно собрана данная схема больших светодиодных часов, к которым можно подключить (через внутренние транзисторные ключи) LED индикаторы сколь угодно большого размера. Увеличить принципиальную схему можно кликнув по ней:

Описание работы часов

  1. Часы. В данном режиме идёт стандартный вид отображения времени. Имеется цифровая коррекция точности хода часов.
  2. Термометр. В этом случае устройство производит измерение температуры комнаты либо воздуха на улице, с одного датчика. Диапазон от -55 до +125 градусов.
  3. Предусмотрен контроль источника питания.
  4. Вывод информации на индикатор попеременно - часов и термометра.
  5. Для сохранения настроек и установок при пропадании 220В, применена энергонезависимая память.


Основой устройства является МК ATMega8, который прошивают выставляя фузы согласно таблице:

Работа и управление часами

Включив часы в первый раз, на экране появится рекламная заставка, после чего переключится на отображение времени. Нажимая на кнопку SET_TIME индикатор пойдёт по кругу из основного режима:

  • режим отображения минут и секунд. Если в этом режиме одновременно нажать на кнопку PLUS и MINUS , то произойдет обнуление секунд;
  • установка минут текущего времени;
  • установка часов текущего времени;
  • символ t . Настройка продолжительности отображения часов;
  • символ o . Время отображения символов индикации внешней температуры (out);
  • величина ежесуточной коррекции точности хода часов. Символ c и значение коррекции. Пределы установки от -25 до 25 сек. Выбранная величина будет ежесуточно в 0 часов 0 минут и 30 секунд прибавлена или вычтена из текущего времени. Более подробно читайте в инструкции, что в архиве с файлами прошивки и печатных плат.

Настройка часов

Удерживая кнопки PLUS /MINUS делаем ускоренную установку значений. После изменения каких-либо настроек, через 10 секунд новые значения запишутся в энергонезависимую память и будут считаны оттуда при повторном включении питания. Новые настройки вступают в силу по ходу установки. Микроконтроллер отслеживает наличие основного питания. При его отключении питание прибора осуществляется от внутреннего источника. Схема резервного модуля питания показана ниже:


Для уменьшения тока потребления отключаются индикатор, датчики и кнопки, но сами часы продолжают отсчитывать время. Как только напряжение сети 220В появится - все функции индикации восстанавливаются.


Так как устройство задумывалось как большие светодиодные часы, в них есть два дисплея: большой светодиодный - для улицы, и маленький ЖКИ - для удобства настройки основного дисплея. Большой дисплей расположен на расстоянии несколько метров от блока управления и соединен двумя кабелями по 8 проводов. В управление анодами внешнего индикатора индикаторов, применены транзисторные ключи по приведенной в архиве схеме. Авторы проекта: Александрович & SOIR.

Как видно из названия, главное предназначение данного устройства - узнавать текущее время и дату. Но оно имеет ещё множество других полезных функций. Идея его создания появилась после того, как мне на глаза попались полусломанные часы с относительно большим (для наручных) металлическим корпусом. Я подумал, что туда можно вставить самодельные часы, возможности которых ограничиваются только собственной фантазией и умением. В результате появилось устройство со следующими функциями:

1. Часы - календарь:

    Отсчёт и вывод на индикатор часов, минут, секунд, дня недели, числа, месяца, года.

    Наличие автоматической корректировки текущего времени, которая производится каждый час (максимальные значения +/-9999 ед., 1 ед. = 3,90625 мс.)

    Вычисление дня недели по дате (для текущего столетия)

    Автоматический переход на летнее и зимнее время (отключаемый)

  • Учитываются високосные годы

2. Два независимых будильника (при срабатывании звучит мелодия)
3. Таймер с дискретностью 1 сек. (Максимальное время отсчета 99ч 59м 59с)
4. Двухканальный секундомер с дискретностью счета 0,01 сек. (максимальное время счета 99ч 59м 59с)
5. Секундомер с дискретностью счета 1 сек. (максимальное время счета 99 суток)
6. Термометр в диапазоне от -5°С. до 55°С (ограничен температурным диапазоном нормальной работы устройства) с шагом 0,1°С.
7. Считыватель и эмулятор электронных ключей - таблеток типа DS1990 по протоколу Dallas 1-Wire (память на 50 штук, в которой уже имеется несколько универсальных ”ключей-вездеходов”) с возможностью побайтного просмотра кода ключа.
8. Дистанционный пульт управления на ИК лучах (реализована только команда "Сделать снимок") для цифровых фотокамер "Pentax", "Nikon", "Canon"
9. Светодиодный фонарик
10. 7 мелодий
11. Звуковой сигнал в начале каждого часа (отключаемый)
12. Звуковое подтверждение нажатия кнопок (отключаемое)
13. Контроль напряжения батареи питания с функцией калибровки
14. Цифровая регулировка яркости индикатора

Может такая функциональность и избыточна, но мне нравятся универсальные вещи, ну и плюс моральное удовлетворение от того, что данные часы будут сделаны своими руками.

Принципиальная схема часов

Устройство построено на микроконтроллере АТmega168PA-AU. Часы тикают по таймеру Т2, работающему в асинхронном режиме от часового кварца на 32768 Гц. Микроконтроллер почти всё время находится в спящем режиме (индикатор при этом выключен), просыпаясь раз в секунду, чтобы добавить эту самую секунду к текущему времени и снова засыпает. В активном режиме МК тактируется от внутреннего RC осциллятора на 8 МГц, но внутренний прескалер делит её на 2, в итоге ядро тактируется от 4 МГц. Для индикации используется четыре одноразрядных светодиодных цифровых семисегментных индикатора c общим анодом и децимальной точкой. Так же имеется 7 статусных светодиодов, назначение которых следующее:
D1- Признак отрицательного значения (минус)
D2- Признак работающего секундомера (мигает)
D3- Признак включенного первого будильника
D4- Признак включенного второго будильника
D5- Признак подачи звукового сигнала в начале каждого часа
D6- Признак работающего таймера (мигает)
D7- Признак низкого напряжения батареи питания

R1-R8 - токоограничительные резисторы сегментов цифровых индикаторов HG1-HG4 и светодиодов D1-D7. R12,R13 – делитель для контроля напряжения батареи. Поскольку напряжение питания часов 3V, а белому светодиоду D9 требуется около 3,4-3,8V при номинальном токе потребления, то он светится не в полную силу (но её хватает, чтобы не споткнуться в темноте) и поэтому подключен без токоограничительного резистора. Элементы R14, Q1, R10 предназначены для управления инфракрасным светодиодом D8 (реализация дистанционного управления для цифровых фотокамер). R19, R20, R21 служат для сопряжения при общении с устройствами, имеющими интерфейс 1-Wire. Управление осуществляется тремя кнопками, которые я условно назвал: MODE (режим), UP (вверх), DOWN (вниз). Первая из них также предназначена для пробуждения МК по внешнему прерыванию (при этом индикация включается), поэтому она подключена отдельно на вход PD3. Нажатия остальных кнопок определяется при помощи АЦП и резисторов R16,R18. Если кнопки не нажимаются в течении 16 сек, то МК засыпает и индикатор гаснет. При нахождении в режиме “Пульт ДУ для фотокамер” этот интервал составляет 32 сек., а при включенном фонарике - 1 минуту. Также МК можно усыпить вручную, используя кнопки управления. При запущенном секундомере с дискретностью счета 0,01 сек. устройство не переходит в спящий режим.

Печатная плата

Устройство собрано на двухсторонней печатной плате круглой формы по размеру внутреннего диаметра корпуса наручных часов. Но при изготовлении я использовал две односторонние платы толщиной 0,35 мм. Такую толщину опять же получил отслоив её от двухстороннего стеклотекстолита толщиной 1,5 мм. Платы затем склеил. Все это делалось потому что, у меня не было тонкого двухстороннего стеклотекстолита, а каждый сэкономленный миллиметр толщины в ограниченном внутреннем пространстве корпуса часов очень ценен, да и отпала надобность совмещения при изготовлении печатных проводников методом ЛУТ. Рисунок печатной платы и расположение деталей находятся в прилагаемых файлах. На одной стороне размещены индикаторы и токоограничительные резисторы R1-R8. На обратной - все остальные детали. Имеются два сквозных отверстия для белого и инфракрасного светодиодов.

Контакты кнопок и держатель батареи выполнены из гибкой пружинящей листовой стали толщиной 0,2…0,3мм. и залужены. Ниже приведены фото платы с двух сторон:

Конструкция, детали и их возможная замена

Микроконтроллер ATmega168PA-AU можно заменить на ATmega168P-AU, ATmega168V-10AU ATmega168-20AU. Цифровые индикаторы - 4 штуки KPSA02-105 суперяркие красного цвета свечения с высотой цифры 5,08мм. Mожно поставить из этой же серии KPSA02-xxx или KCSA02-xxx. (только не зеленые – они будут слабо светиться) Другие аналоги подобных размеров с достойной яркостью мне неизвестны. У HG1, HG3 соединение катодов сегментов отличается от HG2, HG4, потому что мне так было удобнее для разводки печатной платы. В связи с этим для них в программе применена различная таблица знакогенератора. Используемые резисторы и конденсаторы SMD для поверхностного монтажа типоразмеров 0805 и 1206, светодиоды D1-D7 типоразмера 0805. Белый и инфракрасный светодиоды диаметром 3мм. На плате имеется 13 сквозных отверстий, в которые необходимо установить перемычки. В качестве температурного датчика применён DS18B20 c интерфейсом 1-Wire. LS1 – обычная пьезоэлектрическая пищалка, вставляется в крышку. Одним контактом она соединяется с платой при помощи пружинки, установленной на ней, другим соединяется с корпусом часов самой крышкой. Кварцевый резонатор от наручных часов.

Программирование, прошивка, фьюзы

Для внутрисхемного программирования на плате имеются только 6 круглых контактных пятачка (J1), так как полноценный разъем не уместился по высоте. К программатору их подключал, используя контактное устройство, сделанное из штыревой вилки PLD2x3 и напаянных на них пружинками, прижимая их одной рукой к пятачкам. Ниже прилагается фото приспособления.

Я использовал его, так как в процессе отладки приходилось много раз перепрошивать МК. При разовой прошивке проще подпаять к пятачкам тонкие провода, подключенные к программатору, а после снова отпаять. МК удобнее прошивать без батареи, но чтобы питание поступало либо от внешнего источника +3V, либо от программатора c таким же напряжением питания. Программа написана на ассемблере в среде VMLAB 3.15. Исходные коды, прошивки для FLASH и EEPROM в приложении.

FUSE-биты микроконтроллера DD1 должны быть запрограммированы следующим образом:
CKSEL3...0 = 0010 - тактирование от внутреннего RC осциллятора 8 МГц;
SUT1...0 =10 - Start-up time: 6 CK + 64 ms;
CKDIV8 = 1 - делитель частоты на 8 отключён;
CKOUT = 1 - Output Clock on CKOUT запрещен;
BODLEVEL2…0 = 111 - контроль напряжения питания отключён;
EESAVE = 0 - стирание EEPROM при программировании кристалла запрещено;
WDTON = 1 - Нет постоянного включения Watchdog Timer;
Остальные FUSE – биты лучше не трогать. FUSE–бит запрограммирован, если установлен в “0”.

Прошивка EEPROM прилагаемым в архиве дампом обязательна.

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

Адрес ячейки

Назначение

Параметр

Примечание

Величина напряжения батареи, при которой происходит сигнал о её низком уровне

260($104) (2,6V)

коэффициент для коррекции значения измеренного напряжения батареи

интервал времени на переход в режим сна

1 ед. = 1 сек

интервал времени на переход в режим сна при включенном фонарике

1 ед. = 1 сек

интервал времени на переход в режим сна при нахождении в режиме ДУ для фотокамер

1 ед. = 1 сек

Здесь хранятся номера IButton ключей

Небольшие пояснения по пунктам:

1 пункт. Здесь указывается величина напряжения на батарее, при которой загорится светодиод, сигнализирующий о её низком значении. Я поставил 2,6V (параметр - 260). Если нужно другое, например 2,4V, то надо записать 240($00F0). В ячейку по адресу $0000 заносится младший байт, соответственно в $0001 – старший.

2 пункт. Поскольку я не установил на плату переменный резистор для подстройки точности измерения напряжения батареи питания ввиду отсутствия места, то я ввел программную калибровку. Порядок калибровки для точного измерения следующий: изначально в данной ячейке EEPROM записан коэффициент 1024($400), необходимо перевести устройство в активный режим и посмотреть на индикаторе напряжение, и тут же замерить вольтметром реальное напряжение на батарее. Коэффициент коррекции (К), который необходимо выставить, вычисляется по формуле: K=Uр/Uи*1024 где Uр – реальное напряжение, измеренное вольтметром, Uи – напряжение которое, измерило само устройство. После подсчёта коэффициента ”K” его заносят в устройство (как это делается сказано в инструкции по эксплуатации). После калибровки у меня погрешность не превысила 3%.

3 пункт. Здесь задается параметр времени, через которое устройство перейдет в спящий режим, если кнопки не нажимаются. У меня стоит 16 сек. Если допустим надо, чтобы засыпало через 30 сек, то надо записать 30($26).

В 4 и 5 пунктах аналогично.

6 пункт. По адресу $0030 хранится код семейства нулевого ключа (dallas 1-Wire), затем его 48 битный номер и CRC. И так 50 ключей последовательно.

Настройка, особенности работы

Настройка устройства сводится к калибровке измерения напряжения батареи, как описано выше. Также необходимо засечь отклонение хода часов за 1 час, посчитать и внести соответствующее значение коррекции (процедура описана в инструкции по эксплуатации).

Устройство питается от литиевой батареи CR2032 (3V) и потребляет в режиме сна примерно 4 мкА, а в активном режиме 5…20 мА в зависимости от яркости индикатора. При ежедневном пятиминутном использовании активного режима батареи должно хватить примерно на 2….8 месяцев в зависимости от яркости. Корпус часов соединен с минусом батареи.

Считывание ключей проверялось на DS1990. Эмуляция проверена на домофонах ”МЕТАКОМ”. Под порядковыми номерами от 46 до 49(последние 4) прошиты (все ключи хранятся в EEPROM, их можно изменять перед прошивкой) универсальные ключи для домофонов. Ключ, прописанный под номером 49 открывал все домофоны ”МЕТАКОМ”, которые мне попадались, остальные универсальные ключи тестировать не довелось, их коды я взял из сети.

Дистанционное управление для фотокамер проверялось на моделях Pentax optio L20, Nikon D3000. Canon не удалось заполучить для проверки.

Инструкция пользователя занимает 13 страниц, поэтому я не стал её включать в статью, а вынес в приложение в формате PDF.

Архив содержит:
Схема в и GIF;
Рисунок печатной платы и расположение элементов в формате ;
Прошивка и исходники на ассемблере;

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DD1 МК AVR 8-бит

ATmega168PA

1 PA-AU В блокнот
U2 Датчик температуры

DS18B20

1 В блокнот
Q1 MOSFET-транзистор

2N7002

1 В блокнот
С1, С2 Конденсатор 30 пФ 2 В блокнот
С3, С4 Конденсатор 0.1 мкФ 2 В блокнот
С5 Электролитический конденсатор 47 мкФ 1 В блокнот
R1-R8, R17 Резистор

100 Ом

9 В блокнот
R9 Резистор

10 кОм

1 В блокнот
R10 Резистор

8.2 Ом

1 В блокнот
R11 Резистор

300 Ом

1 В блокнот
R12 Резистор

2 МОм

1 В блокнот
R13 Резистор

220 кОм

1 В блокнот
R14 Резистор

30 кОм

1 В блокнот
R15, R19 Резистор

4.7 кОм

2 В блокнот
R16 Резистор

20 кОм

1

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

Конструкция собрана на микроконтроллере и часов реального времени DS1307 . В качестве индикатора текущего времени использован четырехразрядный семисегментный светодиодный индикатор (ультраяркий, голубого цвета свечения, что неплохо смотрится в темное время, и, заодно, часы играют роль ночника). Управление часами происходит двумя кнопками. Благодаря использованию микросхемы часов реального времени DS1307, алгоритм программы получился довольно простым. Общение микроконтроллера с часами реального времени происходит по шине I2C, и организованно программным путем.

Схема часов:

К сожалению, в схеме есть ошибка:
— выводы МК к базам транзисторов нужно подключать:
РВ0 к Т4, РВ1 к Т3, РВ2 к Т2, РВ3 к Т1
или поменять подключение коллекторов транзисторов к разрядам индикатора:
Т1 к DP1 ….. Т4 к DP4

Детали, используемые в схеме часов:

♦ микроконтроллер ATTiny26:

♦ часы реального времени DS1307:

♦ 4-разрядный семисегментный светодиодный индикатор – FYQ-5641UB -21 с общим катодом (ультраяркий, голубого цвета свечения):

♦ кварц 32,768 кГц, с входной емкостью 12,5 пф (можно взять с материнской платы компьютера), от этого кварца зависит точность хода часов:

♦ все транзисторы — NPN-структуры, можно применить любые (КТ3102, КТ315 и их зарубежные аналоги), я применил ВС547С
♦ микросхемный стабилизатор напряжения типа 7805
♦ все резисторы мощностью 0,125 ватт
♦ полярные конденсаторы на рабочее напряжение не ниже напряжения питания
♦ резервное питание DS1307 – 3 вольтовый литиевый элемент CR2032

Для питания часов можно использовать любое ненужное зарядное устройство сотового телефона (в этом случае, если напряжение на выходе зарядного устройства в пределах 5 вольт ± 0,5 вольта, часть схемы — стабилизатор напряжения на микросхеме типа 7805, можно исключить)
Ток потребления устройством составляет — 30 мА.
Батарейку резервного питания часов DS1307 можно и не ставить, но тогда, при пропадании напряжения в сети, текущее время придется устанавливать заново.
Печатная плата устройства не приводится, конструкция была собрана в корпусе от неисправных механических часов. Светодиод (с частотой мигания 1 Гц, от вывода SQW DS1307) служит для разделения часов и минут на индикаторе.

Установки микроконтроллера заводские: тактовая частота — 1МГц, FUSE-биты трогать не надо.

Алгоритм работы часов (в Algorithm Builder):

1. Установка указателя стека
2. Настройка таймера Т0:
— частота СК/8
— прерывания по переполнению (при такой предустановленной частоте вызов прерывания происходит каждые 2 миллисекунды)
3. Инициализация портов (выводы РА0-6 и РВ0-3 настраиваются на выход, РА7 и РВ6 на вход)
4. Инициализация шины I2C (выводы РВ4 и РВ5)
5. Проверка 7-го бита (СН) нулевого регистра DS1307
6. Глобальное разрешение прерывания
7. Вход в цикл с проверкой нажатия кнопки

При первом включении, или повторном включении при отсутствии резервного питания DS307, происходит переход в первоначальную установку текущего времени. При этом: кнопка S1 – для установки времени, кнопка S2 – переход к следующему разряду. Установленное время – часы и минуты записываются в DS1307 (секунды устанавливаются в ноль), а также вывод SQW/OUT (7-й вывод) настраивается на генерацию прямоугольных импульсов с частотой 1 Гц.
При нажатии кнопки S2 (S4 — в программе) происходит глобальный запрет прерываний, программа переходит в подпрограмму коррекции времени. При этом, кнопками S1 и S2 устанавливаются десятки и единицы минут, затем, с 0 секунд, нажатием кнопки S2 происходит запись уточненного времени в DS1307, разрешение глобального прерывания и возвращение в основную программу.

Часы показали хорошую точность хода, уход времени за месяц — 3 секунды.
Для улучшения точности хода, кварц рекомендуется подключать к DS1307, как указано в даташите:

Программа написана в среде «Algorithm Builder».
Вы можете, на примере программы часов, ознакомиться с алгоритмом общения микроконтроллера с другими устройствами по шине I2C (в алгоритме подробно прокомментирована каждая строчка).

Фотография собранного устройства и печатная плата в формате.lay от читателя сайта Анатолия Пильгук, за что ему огромное спасибо!

В устройстве применены: Транзисторы — СМД ВС847 и ЧИП резисторы

Приложения к статье:

(42,9 KiB, 3 038 hits)

(6,3 KiB, 4 058 hits)

(3,1 KiB, 2 500 hits)

(312,1 KiB, 5 833 hits)


Второй вариант программы часов в АБ (для тех у кого нескачивается верхний)

(11,4 KiB, 1 842 hits)

20 августа 2015 в 12:34

Самодельные электронные часы, элементная база - часть 1, измерение времени

  • DIY или Сделай сам

Наверное, каждый гик, увлекающийся самодельной электроникой, рано или поздно приходит к идее сделать свои, уникальные, часы. Идея вполне неплоха, разберемся как и на чем их лучше сделать. В качестве отправной точки будем считать, что человек умеет программировать микроконтроллеры, понимает как переслать 2 байта по i2c или serial-порту, и может спаять вместе несколько проводов. В принципе, этого достаточно.

Понятно, что ключевая функция часов - измерение времени (кто бы подумал, да?). И делать это желательно максимально точно, здесь есть несколько вариантов и подводных камней.

Итак, какие доступные в «железе» способы измерения времени мы можем использовать?

Встроенный 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++, так что вариантов «размять мозги» вполне достаточно.

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