Небольшое вступление
Привет всем уважаемые читатели! Меня как и многих тут посещала мысля сделать что-нибудь эдакое. Руки чесались, голова пухла и таки придумал. Данные часы разрабатывались не неделю или две. Все начиналось с прототипов отдельных узлов, потом, поняв как работать с этим индикатором - начались всякие веселые бегущие строки со словами из трех букв на нем, ну и все в таком духе. Что-ж присказка закончилась, сказка начинается!
Краткое описание схемотехники
Особо-интересных узлов тут нету, все по стандарту. В основу лег микроконтроллер ATmega168. Схема питается от 5 вольт. Преобразователь на MC34063 повышает напряжение до 32 вольт для работы сегментов и сеток. По поводу драйвера: чувствую волну годовых запасов тухлых помидоров по поводу коммутации: запирать нужно отрицательным напряжением, а открывать небольшим положительным! Накал надо питать от переменного тока, а то разряды будут неравномерно светиться! Ну что я могу вам сказать: засветка конечно есть, но очень малозаметная, даже в темноте! По поводу неравномерности свечения разрядов: такого не наблюдал, все ровно. Я делал тупо из того, что было под рукой. Питание с повышайки поступает на массив Дарлингтона (UDN2981) и затем уже на сегменты/сетки. Само отображение работает по принципу динамической индикации, т.е. все синхронизировано так, что-бы в нужный момент времени засвечивались нужные сегменты под нужной сеткой. Об этом пойдет речь чуть дальше. Остальные все элементы включены по даташиту и думаю, что особого разъяснения ничего не требует.
Немного о программном коде
Программа написана в среде Atmel Studio 7.0. При написании самой программы я не использовал ничего готового. Все библиотеки написаны в ручную. Немного пробежимся по принципам работы программы.
IRDA (Инфракрасное управление)
Инфракрасное управление работает по протоколу NEC/NEC 2.0. Другие протоколы не поддерживаются! Почему? Да потому-что пультов с NEC у меня полным-полно, да и разбираться с другими протоколами было дико лень. Значит, как оно работает. В системе есть таймер (таймер 2 в этом случае). Наш таймер настроен на переполнение каждые 100 мкс. Так-же в системе есть для этого внешнее прерывание (INT0 в этом случае), настроенное на работу по нисходящему фронту. И так, рассмотрим, что такое NEC
Мы видим опорный импульс (9мс) и паузу (4.5мс). Лог 1. Длится 2.25мс, лог. 0 длится 1.12мс. Но! У нас прерывание настроено по нисходящему фронту! Хорошо, Наш опорный импульс в таком случае будет 13.5мс, а остальные данные - как и были. Важно понимать, что в данных (0 и 1) всегда есть импульс 560мкс. т.е. если не взирать на то, что прерывание настроено на нисходящий фронт и принимать импульсы по смене логического состояния, то лог 1. - это первый импульс 560 мкс, второй 1690мкс, и тож самое с лог. 0. Ладно, надеюсь, поняли =))) Значит пришло внешнее прерывание с ИК-приемника, запустился таймер, начался отсчет. Смотрим, сколько мы там насчитали и уже проводим нужные операции. К примеру пришел стартовый импульс 13.5мс, значит выставляем флаг начала приема и можем приступать к приему данных. Так-же в том самом таймере 2 присутствует сброс при достижении какого-либо значения, если ничего не пришло после стартового импульса или когда все данные приняли. Посылка NEC выглядит вот так:
Исходный код в этом месте кстати полностью откомментирован, разобраться будет несложно. В остальном там нету никаких новшеств, все, что смог распихал по библиотекам.
Описание часов, настройка и обучение ИК-пульту
Как только включили часы - нужно настроить время. Можно это сделать двумя способами:
- Кнопками
- ИК-пульт
Но при включении пульт у нас не настроен. Давайте для начала настроим время и дату. Нажимаем и удерживаем кнопку "MENU", до тех пор, пока не начнет мигать первое значение. Кнопками UP, DOWN можно настроить время/дату, перемещаться по меню - коротким нажатием на MENU. Сохранение настроек - короткое нажатие на ОК. Кстати при настройке кнопки UP, DOWN можно нажимать одиночным нажатием или нажать и удерживать.
Настройка ИК-Пульта
Для входа в настройки ИК-пульта в обычном режиме нажимаем и удерживаем OK, пока не увидим подобный экран
Полоска должна бежать от цифры к надписи. Нажимаем кнопку на пульте и если все прошло хорошо, то увидим такую надпись:
Это означает, что код кнопки уже сохранен в EEPROM
Если кнопка с таким кодом уже будет в системе, то вы увидите:
Кнопками UP, DOWN можно перемещаться по номерам настраиваемых кнопок, кнопкой MENU можно сбросить текущую настройку (если не настроить ничего после сброса, то останется предыдущая запись). Теперь поговорим о номерах настраиваемых кнопок:
- POWER OFF (пока что не используется)
- MENU (вход в меню)
- PLUS (прибавление значения)
- MINUS (убавление значения)
- CLEAR (сброс настраиваемого значения в начальное положение)
- PLAY (она же OK, для сохранения настроек)
- FWND (перемотка вперед, перемещение вперед по меню или отображаемой информации)
- RWND (перемотка назад, перемещение назад по меню или отображаемой информации)
- RETURN (выход из настроек)
Выйти из настроек можно при помощи нажатии и удержании кнопки ОК
Теперь, когда мы настроили пульт - можно поговорить еще о настройках
Поддерживается нажатие и удержание кнопки (повторные сообщения в NEC). Кнопками FWND, RWND перемещаемся по меню, кнопками PLUS и MINUS настраиваем значения. Вроде все просто, ничего не забыл. А да, в основном экране можно переключать режим отображения (Часы, дата, температура) кнопками UP, DOWN на часах или кнопками FWND, RWND на ИК-пульте
Фотографии
Послесловие
Возможно сей проект кому-то покажется слишком сложным или наоборот слишком легким. Я же рассматриваю его как старт в нечто-то более серьезное. Я всячески избегаю готовых решений, библиотек и т.д. - ибо мне очень интересно решать сложные задачи и часами втыкать в даташники и прочее.
Прикрепил к статье исходный код и файл печатной платы в Sprint-Layout.
P.S. Основную плату заказывал на заводе JLCPCB
Прикрепленные файлы:
- vfd_clock.lay6 (255 Кб)
- vfdClockCpp168old.zip (201 Кб)
Комментарии (18) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]