Наручные часы “ARSENICUM” с OLED-индикатором
Представляю вашему вниманию наручные часы с графическим индикатором на органических светодиодах, выполненные в корпусе из нержавеющей стали.
Это вторая моя попытка сделать наручные часы. Первые мои часы имели корпус высотой порядка 30 мм, из-за чего были очень неудобны для использования. А вот этот экземпляр гораздо тоньше – менее 12 мм, что уже вполне приемлемо.
Всё началось с того, что Валерий (Wall-ery ) предложил идею использовать в часах графический OLED-индикатор, имеющий разрешение 128х32 пикселя и диагональ 0,91”. Эти индикаторы имеют малые габариты, особенно по толщине. Кроме того, на графическом индикаторе можно сделать гораздо более интересные часы, чем на сегментном.
Я разработал схему и печатную плату для будущих часов, а также написал программу для микроконтроллера. Габариты платы незначительно превышают габариты самого индикатора.
В часах удалось реализовать следующие функции (а потом память микроконтроллера ATmega328PA закончилась, хотя у меня было ещё несколько идей):
- Отображение текущего времени в виде цифровых часов, стрелочных часов (3 варианта), двоичных (бинарных) часов.
- Отображение даты (календарь до 2099 года, с учётом високосных годов и автоматическим расчётом дня недели).
- Отображение уровня заряда аккумулятора.
- Просмотр полного календаря с 2000 по 2099 годы (“вперёд” и “назад” от текущей даты).
- Выбор от 1 до 6 шрифтов цифр (0–9) для цифровых часов.
- Выбор до 6 визуальных эффектов смены цифр для цифровых часов.
- Настройка яркости индикатора.
- Возможность поворота изображения на индикаторе на 180°, а также инверсия изображения.
- Коррекция точности хода часов в пределах ±23,4 с/сутки с шагом около 0,1 с/сутки.
- Микропотребление в ждущем режиме (при выключенном индикаторе).
Далее была придумана конструкция корпуса и создана 3D-модель:
Корпус я решил делать наборным из листовой нержавеющей стали толщиной 2 мм. Чертежи всех элементов корпуса я отдал на лазерную резку, и вскоре получил вот такую кучку деталей странной формы:
Затем изготовил необходимую оснастку, собрал детали в пакеты и прошлифовал все торцы пластин, чтобы убрать следы от лазера и получить ровную поверхность.
Разобрал пакеты после шлифовки и залудил детали в требуемых местах для последующей пайки.
Снова собрал пакет, но теперь уже из всех деталей сразу и в том порядке, в котором они будут в итоге.
Заложил припой и припаял переднюю панель корпуса.
Далее на фрезерном станке с ЧПУ изготовил кондуктор и сделал с его помощью необходимые выборки в боковых крышках корпуса.
Крышки стягиваются между собой при помощи двух стержней, в торцах которых нарезана резьба M2. Стержни проходят насквозь через все пластины корпуса, тем самым стягивая пакет.
После окончательной шлифовки корпус приобрёл такой вид:
Поскольку припой не растёкся равномерно в местах стыков передней панели с пластинами пакета, образовались некрасивые щели. Их я решил устранить, профрезеровав пазы V-образной фрезой и заполнив их эпоксидным клеем, смешанным с тонером для лазерного принтера (для придания чёрного цвета).
Далее вклеил в корпус стекло при помощи УФ-отверждаемого клея.
Установил в корпус плату часов и аккумулятор. Плату зафиксировал клеем.
Выточил из нержавеющей стали толкатель кнопки.
Установил боковые крышки.
На этом этапе часы были показаны Валерию, и он настоятельно порекомендовал чем-то заполнить пустое пространство на передней и задней сторонах часов.
В результате часы обрели название – ARSENICUM, а спереди и сзади была сделана гравировка.
Далее – финальные фотографии:
Все шесть шрифтов, предусмотренных в часах:
Отображение даты, дня недели и заряда аккумулятора:
Видео работы часов:
20 комментариев
Плюсищи и туть и на ютубах +
По-поводу памяти МК, есть полезный нюанс, (на случай если вы уже это не сделали) можно много сэкономить на статичных текстах выводя из прямо из флеша, не копируя в оперативку.
пример: strcpy_P(txt_buffer, PSTR("[ Статистика ]")); займет меньше места чем strcpy(txt_buffer, "[ Статистика ]");
PSTR() я уже и так использую, конечно.
Это, скорее, позволяет экономить RAM. Строки-то так или иначе будут храниться во flash-памяти. Разве что будет экономия на отсутствии кода для их копирования в RAM.
Я в процессе оптимизации дошёл до того, что делал выбор между локальной или глобальной переменной в зависимости от того, где получается меньше размер прошивки. Много памяти занимают шрифты, иконки и прочая графика. Тут мог бы помочь какой-нибудь алгоритм сжатия, но тогда могут начаться трудности, связанные со скоростью распаковки сжатой графики.
Поэтому я просто решил, что пора остановиться с добавлением всяких функций часам, и так уже много чего наворочено. :)
Кстати сам до сих пор люблю 328е меги использовать, для таких задач идеально, и нагрузочная способность ног, и широкий диапазон питания, и picopower — все приятности, которых нет у стм-ок и аналогичных. И бОльшая частота новых МК это не компенсирует, не нужно столько для таких проектов.
[offtopic]Интересно, чем нужно заслужить право плюсовать материалы?[/offtopic]
При распаковке «на лету» могут возникнуть проблемы с эффектами смены цифр. Почти для всех эффектов требуется выводить часть полного изображения цифры, а иногда и несколько частей, причём и старой цифры, и новой. На каждом кадре анимации полностью перерисовывается весь дисплей. Поэтому есть весьма жёсткие ограничения по скорости отрисовки графики.
При распаковке придётся, как минимум, каждый раз считывать bitmap цифры с самого начала, а сейчас есть возможность сразу читать его с того места, которое нужно для вывода куска цифры.
Лучше, мне кажется, распаковывать весь шрифт сразу в отдельный буфер в ОЗУ однократно при выборе нового шрифта. Оперативной памяти должно хватить — её тут 4 кБ, под буфер кадра выделено 512 байт, а все 20 цифр (по два варианта каждой — для часов/минут и секунд) шрифта занимают не более 880 байт. Остаётся ещё достаточно места под переменные и стек.
Чтобы плюсовать, нужен рейтинг не менее 1,1. Поставил Вам плюс в профиле — попробуйте теперь что-нибудь оценить.
Работа и мозгами и станками и руками.
Не думали вместо обычного названия какую нибудь загадочную аббревиатуру
типа — 49DZ-2Q-HL9 (возможно это пароль, но где-то маленькая ошибка))?
Или просто, например, ARSENICUM-8
А почему именно ARSENICUM-8? Всё-таки, число в названии должно иметь какой-то смысл (если это не просто набор случайных символов, конечно).
Я руководствовался своим восприятием. Цифра 8 по своему начертанию наиболее подходит к такому аккуратному названию.
Корпус грубее, чем название и дополнительный индекс разрешает это противоречие.
С праздником!!!