Сделай с нами: часы!

В нынешнее время понятно, что вариантов, как сделать себе часы уже накопилось несметное множество. На шаговых моторах со стрелками, на ЖК-дисплеях, на советских вакуумных или накальных индикаторах типа ИВ-18 или ИН-4, на логических микросхемах, на моторах и наборках реле. Перечислять можно долго и скучно, но мы сейчас возьмем детали из списка ниже и сделаем простые и красивые часы на светодиодных семисегментных индикаторах.

Итак определимся с ТЗ (Техническим заданием или же чего наши часы должны уметь):

  1. Отображать время в 24-часовом формате.
  2. При нажатии кнопки отображать секунды.
  3. Питаться от аккумулятора li-ion и USB зарядки;
  4. При питании от аккумулятора экономить электроэнергию.

Мы разобрались с ТЗ теперь определимся со списком того, что нам для сборки этих часов надо купить:

  1. Arduino Nano или Pro mini (С первой проще если у Вас нет USB-UART переходника, в Nano он встроенный) - 1шт.
  2. Семисегментный индикатор (куда без него) - 1шт;
  3. Li-ion аккумулятор от ненужного мобильного телефона - 1шт;
  4. TP4056 контроллер заряда для li-ion батарей 1шт;
  5. Диоды 1N4007 - 3 шт;
  6. Стабилизатор XM1584 или же L7805(две в параллель) - 1шт;
  7. Резисторы 330 Ом - 1шт;
  8. Резистор 220 Ом - 1шт;
  9. Резистор 1 кОм - 3шт;
  10. Кнопки - 3шт.
  11. Адаптер 220В/9В - 1шт
  12. Конденсатор 4700мкФ х 16В
  13. Клемник винтовой - 1 шт;
  14. Набор проводов мама-мама - 20шт;
  15. Набор проводов мама-папа - 20шт;
  16. Набор проводов папа-папа - 20шт;
  17. Набор перемычек - 1шт

Общая стоимость набора без батареек составляет:  500 грн.

Схема наших часов представлена на рисунке ниже:

Первую сборку я сделал на макетной плате, и получилось следующие:


Давайте разберемся как это всё работает:

Выводы D3 D4 и D5 Ардуинки подключены к светодиодному модулю на двух сдвиговых регистрах 74HC595. Модуль представляет собой блок динамической индикации, таким образом за один раз мы можем вывести только одну цифру (ну или несколько одинаковых, но это чревато разной яркостью цифр). Первый байт - включенные или выключенные сегменты на цифре, второй - какую цифру засвечиваем.

То есть процесс отображения числа 1234 будет выглядеть последовательно так:

  1. Гасим 4 знакоместо
  2. Отправляем код цифры "1"
  3. Зажигаем 1-е знакоместо
  4. Ждем 20мс
  5. Гасим 1 знакоместо
  6. Отправляем код цифры "2"
  7. Зажигаем 2-е знакоместо
  8. Ждем 20мс
  9. Гасим 2 знакоместо
  10. Отправляем код цифры "3"
  11. Зажигаем 3-е знакоместо
  12. Ждем 20мс
  13. Гасим 3 знакоместо
  14. Отправляем код цифры "4"
  15. Зажигаем 4-е знакоместо
  16. Ждем 20мс
  17. Повторяем всё выше перечисленное

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


Выводы D6, D7, D8 настроены как входы и подключены к кнопкам MIN, SET, HOUR соответственно. Когда мы нажимаем на кнопку на соответствующем выводе появляется +4В от аккумулятора и микроконтроллер определяет, что надо что-то делать.

Примечание автора:

Лично я делал эти часы для замены штатного часового механизма в автомобильном зеркале "РИТМ" так что часы должны были уметь работать только как часы и ничего более. Ни будильников, ничего подобного! Вы же воспользовавшись этой статьёй, как основой, сможете сделать и часы с термометром, и с вольтметром, и с датчиком давления масла, и чем-нибудь еще. Всем что душе угодно.


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

Логика работы преобразователя идет в три такта:

  1. От бортовой сети питается модуль зарядки аккумулятора напряжением 5В (на 0,6В поднимает напряжение диод D2 на 2-й ноге 7805, а D1 как раз на это же напряжение понижает)
  2. ТР4056 заряжает аккумулятор
  3. Аккумулятор питает часы.
Вся схема потребляет по замерам автора порядка 80-100мА при заряженном аккумуляторе (если использовать линейный стабилизатор 7805, с импульсным будет меньше). Если аккумулятор полностью разряжен, то в зависимости от настроек зарядного устройства на ТР4056 ток может возрасти до 0,7-0,8А на время основного цикла зарядки аккумулятора часов.

Цепь питания идет следующим образом. С разъёма питания J1 через защитный диод D2 на питание часов подается напряжение +12В на стабилизатор U1 где оно понижается до +5,6В. Далее с помощью делителя R4-R5 напряжение опускается до 2,8-3В и подается на вход микроконтроллера сигнализирующий о  наличии напряжения в бортовой сети и что необходимо выйти из экономного режима отображения. С диода D1 напряжение +5В подается на модуль зарядки аккумулятора. Далее на клеммах аккумулятора подключается питание модуля индикации, питание контроллера и +питания для кнопок.

ВНИМАНИЕ - на аккумуляторе должна стоять плата защиты от переразряда настроенная на минимальное напряжение отсечки 3,4В, иначе, когда напряжение на клеммах упадет до 2,8В, контроллер остановится, но модуль индикации будет отображать последнюю загруженную в него цифру и таким образом разрядит аккумулятор в ноль, что чревато его выбросом в мусор

И вот, мы собрали всю схему, подали питание, а в результате ничего нигде не реагирует. Теперь наступает самый важный этап: написание программы.

Теперь нам надо более подробно решить, как часы должны реагировать на внешнюю среду. Это расширение ТЗ по программной части.

Алгоритм работы часов будет следующим:

  1. В режиме ожидания: если 12В есть - отображать время постоянно, если нет - раз в 30 секунд на время 5 секунд  включать показ времени, в остальное время мигать точкой разделения часов и минут.
  2. Если нажать кнопку MIN - показать минуты и секунды.
  3. Если нажать кнопки SET и HOUR - по кругу 00-23 переводить значение часов.
  4. Если нажать кнопки SET и MIN - по кругу 00-59 переводить значение минут.
  5. (Опционально) По нажатию кнопки CORR (вывод D10) округлять время до ближайшего целого часа, как и в оригинальных часах.
Следуя этой логике у нас получается три независимых процесса:

  1. Отсчет секунд
  2. Индикация времени
  3. Опрос клавиш и входа датчика питания

Первые два процесса более приоритетные во времени, так что мы их обернем в прерывания таймеров №1 и №2. Первый у нас будет считать секунды, а второй управлять динамической индикацией. Для того, чтоб экономить время которое процессор проводит в прерываниях, в первом таймере будет проводится опрос датчика наличия питания и обновление переменной хранящей количество секунд из суток, а это ни много ни мало целых 86400 секунд, и этот таймер будет при срабатывании каждый раз добавлять по одной секунде, пока не достигнет числа 86400. Когда он достигнет этого числа, счет секунд обнулится (момент полночь) и процесс пойдет заново. Во втором таймере у нас будет выполняться динамическая индикация. Для того, чтоб не расходовать время контроллера на ожидание этих самых 20 миллисекунд мы сделаем следующее. Мы просто настроим прерывания по таймеру приблизительно в 20мс (это не критично, но слишком быстро тоже плохо - можно дойти до того, что у нас просто всё процессорное время израсходуется на динамическую индикацию), и в самом прерывании будем просто гасить предыдущую цифру и зажигать следующую. Таким образом за 4 срабатывания таймера №2 у нас полностью отобразятся все 4 цифры. А основной процесс мы израсходуем на опрос кнопок и настройку часов.

Таким образом программа принимает следующий вид:

ЗЫ: код для 5-го пункта технического задания ("подводка времени") закрыт комментариями на 9-й, 13-й и 113-120 строках программы. Его надо раскоментировать.

Таким образом мы получаем вполне красивые, удобные и функциональные часы. Попробуйте и Вы.