Схема часов с барометром и MP3-плеером на Arduino

Последние веяния времени не обошли стороной и меня. Я имею ввиду всем известный конструктор «Arduino». Захотелось попробовать свои силы и в этой области радиолюбительства. Привлекает меня в этом большой простор для творчества — можно при небольших затратах «железа» получить много пользовательских функций. Правда, для этого надо освоить хотя бы азы программирования. Мне помогло давнее изучение Бейсика во времена аналогичного повального увлечения «Синклером». Все-таки все языки программирования высокого уровня строятся на одинаковых базовых принципах.

Итак, представляю на суд общественности мое первое творение на Arduino — часы с двумя будильниками, барометром, термометром, MP3-плеером, двухступенчатой автоматической регулировкой яркости, дистанционным управлением и цифровой настройкой хода (ЦНХ):

Часы с барометром и термометром

Кнопок часы не имеют, вся настройка производится через пульт дистанционного управления. В основном режиме они показывают время с точностью до секунд, дату, день недели, атмосферное давление в миллиметрах ртутного столба и температуру в помещении с разрешением 0,1 °C. Термодатчик совмещен с барометром (модуль BMP280) и находится внутри корпуса, поэтому имеет температуру на пару градусов выше комнатной. Чтобы приблизить показываемую температуру к истинной, введена настраиваемая поправка температуры от 0 до -5 °C, которая подбирается экспериментально путем сравнения показаний с другим термометром. Конечно, точность падает при этом примерно до одного градуса, но для комнаты этого достаточно. Вот так часы выглядят при коррекции температуры:

Коррекция температуры и ЦНХ

Поправка температуры — желтые цифры, а синие — это поправка ЦНХ. Она стала возможной благодаря примененному модулю часов DS3231. В нем есть так называемый регистр старения (кварца), содержимое которого влияет на точность хода часов. Записать в него можно значения от -128 до 127, что соответствует коррекции ±1,1 с в сутки.

Часы DS3231 рассчитаны на работу с литиевым аккумулятором, они имеют цепочку из диода и резистора на 200 Ом для постоянной подзарядки аккумулятора. Обычно люди ставят в них простую батарейку. Чтобы она не вышла из строя от перезарядки, надо снять с модуля часов диод или резистор, расположенные в самом углу платы между крепежным отверстием и основной микросхемой.

А это вид часов при работе плеера или будильника:

Режим плеера MP3

Желтые цифры — номер трека (максимум — 999), синие — время от начала трека (до 99 мин. 59 с). Музыкальные файлы размещаются на карте памяти микро-SD, вставляемой снизу. Использованный модуль DFPlayer Mini нумерует треки не по алфавиту, а в порядке записи на карту памяти. Это надо учитывать при поиске нужного трека по номеру.

Желтый светодиод слева внизу показывает, что включен случайный выбор трека. Красный и синий слева вверху — это индикаторы будильников.

Для будильников, кроме времени, можно выбрать дни срабатывания: РБ — рабочие, ВХ — выходные, ВСЕ — все. Также можно задать длительность работы, громкость и номер трека:

Режим установки будильников

Переходим к схеме часов:

Увеличить в новом окне
Блок питания взят мощный, с запасом, чтобы его хватило и на индикаторы, и на максимальную громкость (3 Вт). Экономичный модуль УНЧ построен на микросхеме PAM8403, работающей в классе D.

Я выбрал в качестве основы устройства модуль Arduino Pro Mini из-за его малых габаритов. Для этих часов подойдет только вариант с контроллером ATmega328 (у него памяти больше).

HARD UART — разъем программирования, в скетче эти выводы не используются. Выводы D8 и D9 — это SOFT UART, виртуальный COM-порт для MP3-плеера.

Транзистор 2N7002 возле барометра — это двунаправленный преобразователь уровня (5/3,3 В) для сигнала SDA. Сигналу SCL достаточно однонаправленного преобразователя на диоде. Подтягивающие резисторы не установлены, т. к. они уже есть в модулях барометра и часов.

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

Задняя плата

Поскольку это мое первое устройство на Arduino, я решил модули не паять, а ставить на разъемы для легкой замены и отладки. Справа вверху виден разъем под приемник RRD-102, но он не установлен, потому что мне по неопытности не хватило памяти для скетча, включающего и приемник. Из-за этого же не сделаны еще некоторые мелочи. Например, поправка ЦНХ может меняться только в непрерывном режиме, а одиночными нажатиями — нет.

А это передняя плата:

Передняя плата

Вот ее схема:

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

Увеличить в новом окне
Небольшое замечание: если бы у меня были матричные индикаторы другой полярности (с семью катодами и пятью анодами), можно было бы управлять ими обоими с помощью всего одной микросхемы TM1638. Я купил индикаторы LM-57HR07CC вместо LM-57HR07C из-за ошибки в файле LM-57XX07.pdf. У них перепутана маркировка. Этот файл с ошибкой размещен на многих сайтах в интернете (даже у меня!). Учтите это на будущее! Хотя возможен и другой вариант — ошибочная маркировка на самих индикаторах.

Увеличить в новом окне
Из последнего листа можно понять, что для индикации температуры я использовал одиночные индикаторы. В этом нет никакого скрытого смысла: просто я не нашел счетверенный индикатор нужного размера и цвета по приемлемой цене.

Пульт дистанционного управления — от колонки «Atlanfa». Можно взять и другой, лишь бы его понимал фотоприемник ДУ. Кроме того, понадобится заменить в скетче коды кнопок. Определить коды нового пульта можно с помощью вспомогательного скетча из архива для скачивания. В этом же архиве есть таблицы с описанием режимов работы часов, картой памяти EEPROM (где что запоминается), сам скетч часов, использованные библиотеки, описание индикаторов и печатные платы в формате Sprint Layout 6.

По поводу печатных плат есть замечание. Когда я их рисовал, я исходил из того, что в библиотеках TM1638.cpp и TM1638QYF.cpp порядок цифр индикаторов с общим катодом и общим анодом один и тот же. Суровая действительность оказалась совсем другой, в результате чего мне пришлось в готовой плате резать дорожки и соединять проводами разряды индикаторов с ОА в обратном порядке (это видно даже на фото). Хороший программист мог бы это исправить в самой библиотеке TM1638QYF.cpp, но мне это пока не по силам. Третий вариант выхода из этой ситуации — использовать только индикаторы с ОК, четвертый — перерисовать печатную плату перед повторением проекта.

Есть в печатных платах и другие мелкие недоработки, исправленные проводами. Это подключение точек в секундах, сигнала Busy от MP3-плеера и выхода приемника ДУ. Правильно так, как на электрической схеме, потому что она рисовалась после отладки часов.

И еще по поводу печатных плат. Когда я разводил подключение матричных индикаторов (день недели), я упростил себе жизнь и развел проводники по кратчайшему пути, не считаясь с нумерацией разрядов и сегментов. Единственное, что я выполнил, — это чтобы аноды шли на выводы SEG, а катоды — на GRID. В результате мне пришлось немного поизвращаться с порядком линий и колонок индикаторов, а также с файлом фонта TM16XXFonts.h. Вся информация есть в архиве, но вникать в это не надо. Главное — оно работает!

Пояснение насчет регулировки яркости. Теоретически микросхема TM1638 позволяет установить 8 разных уровней яркости, но уровни от 3-го до 7-го почти неразличимы. Зеленые индикаторы (часы, минуты и секунды) светят намного тусклее остальных, поэтому, чтобы выровнять яркость всех индикаторов, пришлось использовать только две градации — 2 и 7 для зеленых индикаторов, 0 и 1 для остальных.

Скетч часов имеет подробные комментарии. Если кто-нибудь захочет его изменить, сложностей не должно быть. Перед программированием контроллера стоит на всякий случай очистить EEPROM (Файл / Примеры / EEPROM / eeprom_clear). Я использовал версию Arduino IDE 1.8.2.

Напоследок справедливости ради хочу добавить, что часы имеют и недостатки.

Во-первых, они почему-то не работают без карты микро-SD, скетч зависает еще в setup’е при первом же обращении к плееру.

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

В-третьих, я совершенно забыл учесть високосные годы. В часах не предусмотрена возможность установить текущий год, а это значит, что часы сами будут решать, какой год считать високосным и когда делать 29 дней в феврале. Выходов я вижу два: 1) доработать скетч (вряд ли получится из-за недостатка памяти); 2) после установки батарейки установить правильный год с помощью какого-нибудь вспомогательного скетча. Для себя я выбрал третий вариант — в конце каждого февраля проверять и при необходимости корректировать дату. Раз в год это несложно!

P. S. Последняя модификация скетча (устранение мелких ошибок) — 24.07.18.

Скачать схему часов с барометром и MP3-плеером.

Схемы радиоаппаратуры