Еще одни часы на матрицах
- 1
- 2
- 3
- 4
- 5
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Несколько лет назад, в процессе изучения ардуины, собрал на макетке часы (на "стоячих" матрицах). Часы были сделаны, и интерес к ним пропал. Так они и проработали все эти годы на макетке, собирая пыль.
А недавно снова дошли к ним руки, и я, наконец-то, перенес их на плату. Корпусом, правда, они еще не обзавелись. Надеюсь, ждать его они будут меньше, чем плату.
Долго думал, стоит ли делиться с общественностью сим "гениальным творением". В общем - "По телевизору показывают жуликов! Ну, чем я хуже?!" (с). Доделал то, что оставалось недоделанным и вот, что в итоге получилось, и что часы умеют:
- Само собой, показывать текущее время с вертикальной прокруткой цифр при смене времени.
- Выводить бегущей строкой дату.
- В последние дни года выводить обратный отсчет до Нового года.
- 1 января выводить бегущей строкой поздравлялку - "С Новым годом!".
- Сохранять в памяти и выводить до 16 пользовательских сообщений (до 44 символов каждое) с настраиваемыми датами (можно назначать несколько сообщений на одну дату и таким образом объединять их, если текст не помещается в одно).
- Показывать забортную температуру (с помощью выносного DS18B20, никаких радиомодулей, только хардкор - только провода :) ).
- Выводить значения минимальной и максимальной забортной температуры за текущие сутки (с указанием времени).
- Показывать температуру и влажность в помещении.
- Показывать текущее давление и строить график (с автомасштабом по значению).
- Замерять напряжение батарейки на модуле часов и выводить сообщение при его низком значении.
- Автоматически подстраивать яркость, в зависимости от внешнего освещения.
- 7 будильников (по одному на каждый день недели) с раздельной или одновременной (всех 7 сразу) настройкой.
- Встроенное меню настроек - время, дата, будильники.
- Настройка по USB или, при подключении соответствующего модуля, по Bluetooth - время, дата, будильники, сообщения. Выводится краткая подсказка по командам.
- При первом включении или если по какой-либо причине часы останавливались (например, дохлая батарейка и пропадало питание) часы "попросят" установить время и дату.
- При отсутствии какого-либо датчика соответствующая ему информация выводиться не будет. Исключение DS18B20 - если его нет, то вместо температуры будут знаки вопроса.
Часы работают с кодировкой Win-1251, поэтому перед компиляцией необходимо в файле preferences.txt найти параметр preproc.substitute_unicode и установить его в false. Где находится этот файл, можно посмотреть в настройках Arduino IDE.
Перед компиляцией можно выбрать язык: кроме русского, добавил английский, украинский и белорусский. В шрифте присутствуют "специфические" буквы этих языков. Заранее прошу прощения, если с переводом каких-то слов не угадал.
В качестве часового модуля используется DS3231. При желании можно поставить DS1307 (для этого в скетче это надо указать), но его точность хромает, а в часах автоподстройка отсутствует.
Для определения напряжения батарейки используется внутреннее опорное напряжение 1.1В. Но, как показала практика, а также гласит даташит, оно не совсем такое. Например, в моем экземпляре Nano оно было 1.043В. Поэтому для повышения точности замеров его желательно (но не обязательно) измерить мультиметром и подправить в скетче константу Vref. Также необходима небольшая доработка модуля - нужно разорвать цепь заряда, тем более, что при использовании батарейки (а не аккумулятора) она там не к месту.
Так как изначально часы не предполагалось выставлять на всеобщее обозрение, то тру программистам лучше в код не заглядывать, дабы сохранить душевное спокойствие и избежать расстройства пищеварительной системы.
Часы ничем особенным не выделяются и не лишены недостатков, но, может, кто-то (у кого с программированием еще хуже, чем у меня) захочет их повторить.
Ссылка на скачивание https://drive.google.com/file/d/1u1wEnY6zXO5CkDsKshvwJDCNAcxzFrx8/view?u...
В архиве папка с файлами проекта, папка с используемыми библиотеками и схема.
Компилировал в версии 1.6.5, код занимает почти всю память (около 27 кБ). Пробовал также в 1.0.6 - тоже норма, но код на полтора килобайта больше.
Здорово! А то матрицы такие же валяются- никак руки не дойдут... Сыпасибо.
Не знаю, это только у меня так или форум так настроен... В общем, во втором сообщении гифка с примерной демонстрацией работы. Чтобы ее посмотреть, надо на ней кликнуть мышкой. За соответствие скорости смены кадров на гифке и в реальности не ручаюсь.
Настройка по USB - это с изменениями в скетче?
Настройка по USB - это с изменениями в скетче?
Не понял вопроса. Но работает так: воткнул в комп, включил монитор порта, в настройках часов выбрал связь с компом - в мониторе появилась краткая подсказка по командам, изучаем и отсылаем команды.
Понял- через монитор порта. Ещё раз спасибо.
Подсказка по командам в порт выводится на чем-то похожем на английский :) т.к. не все мониторы отображают кириллицу.
Здесь на всякий случай напишу на русском:
Thhmmss - команда установки времени (hh, mm и ss - часы, минуты и секунды соответственно). Например, команда T094500 установит время на 09:45:00.
DddMMyy - команда установки даты (dd, MM и yy - день, месяц и год). Пример, D050418 соответствует установке даты на 5 апреля 2018 года.
A - вывести список будильников;
Ax=hhmmz - установка будильника/ов,
x - порядковый номер дня недели: 0 или 7 - воскресенье, 1 - понедельник, 2 - вторник и т.д. Если указать * - то команда сработает на все будильники;
z может быть + или - (вкл и выкл соответственно), можно ничего не указывать - тогда состояние будильника/ов (вкл или выкл) не изменится. Пример, A*=0700+ установит все будильники на время 07:00 и включит их.
Ax+ - включить будильник номер х.
Ax- - выключить будильник номер х.
M - вывести список сообщений.
Mn=ddMMtext - записать пользовательское сообщение (n - номер сообщения: 0 - 9 и A - F; dd и MM - день и месяц; text - сам текст, максимальная длина текста 44 символа - лишние отбрасываются). Например, M0=2509С Днем рождения! - 25 сентября будет показываться бегущей строкой сообщение С Днем рождения!
Mn- - удалить сообщение.
Mn - показать сообщение бегущей строкой на часах.
Команды можно писать и заглавными, и строчными буквами - разницы нет.
В часах используется ардиуно нано. С про мини будет работать? Имеется ввиду загрузчик никак не повлияет на работу?
Не вижу причин, чтобы не работало. Разве что надо что-то придумывать для настройки пользовательских сообщений - они записываются/удаляются через Serial. Т.е., или использовать дополнительный переходник для подключения по USB, или подключать Bluetooth-модуль. А также использовать версию с ATmega328 (в ATmega168 не влезет). Ну и пины можно использовать любые другие (у меня такой выбор обусловлен разводкой платы).
Дополнительно опишу управление часами с помощью кнопок. Всего в часах 3 кнопки: "Вверх" (она же "Вправо"), "ОК" и "Вниз" (она же "Влево").
При отображении времени нажатие на любую кнопку, кроме "ОК", принудительно переведет часы в режим отображения дополнительной информации (при обычной работе дополнительная информация вызывается через 30 сек отображения времени, этот интервал можно настроить в скетче).
- время, дата, будильники, связь с компьютером. Выбор нужного пункта осуществляется кнопками "Вправо" и "Влево". Активный пункт указывается мерцанием соответствующей пиктограммы. Подтверждение выбора - кнопка "ОК". Чтобы выйти из меню необходимо несколько раз нажать "Вправо" или "Влево" (чтобы выйти за его границы).
и даты
. Мигающий курсор указывает на изменяемое значение. Кнопки "Вверх" и "Вниз" меняют его, а "ОК" подтверждает ввод и осуществляет переход к следующему значению. Кнопки "Вверх" и "Вниз" можно удерживать для быстрой смены цифр.
сначала выбирается день недели (точка в первом столбце): самая верхняя позиция соответствует понедельнику, нижняя - воскресенье, горят все семь точек - одновременная настройка всех будильников. Потом можно переключать состояние будильника/ов: включить (+) или выключить (х). И в самом конце - время срабатывания. Управление такое же как и при настройке времени и даты: кнопками "Вверх" и "Вниз" производятся изменения, а "ОК" - подтверждение ввода и переход дальше. Мигающий курсор указывает на меняемое значение.
. Перед этим надо подключить часы к компьютеру и запустить монитор порта. При включении этого пункта меню в мониторе отобразиться краткая справка по командам и можно работать. Выход - любая кнопка (на часах).
Кнопка "ОК" вызывает меню с настройками:
Настройка времени
При настройке будильников
Последний пункт меню - связь с компьютером
Также, как упоминалось ранее, часы умеют контролировать напряжение батарейки и выводить сообщении при его низком значении (отображение уведомления настроено на 2.3В и меньше - это минимальное напряжение, при котором часовая микросхема сохраняет работоспособность по даташиту). Чтобы увидеть текущее состояние батарейки, не дожидаясь ее разряда, можно в конце вывода дополнительной информации (при наличии и работоспособности всех датчиков последним выводится информация о давлении) нажать и удерживать любую кнопку

хорошая работа.
Т.е., или использовать дополнительный переходник для подключения по USB, или подключать Bluetooth-модуль. А также использовать версию с ATmega328 (в ATmega168 не влезет). Ну и пины можно использовать любые другие (у меня такой выбор обусловлен разводкой платы).
Да, про переходник понятно. Код откомпилировался и занял 90% памяти, поэтому конечно ATmega328.
Спасибо за часики. А где уменьшить скорость бегущей строки?
Интересный вопрос :) Я как-то над этим не заморачивался. Там специальных задержек никаких нет, скроллинг "тормозится" естественным путем - скоростью передачи информации на матрицы. Мне казалось, что на одинаковом оборудовании, с одинаковой тактовой частотой, оно должно работать с одинаковой "плюс минус лапоть" скоростью.
Можно в функции Show() в конце дописать нужную небольшую задержку - delay(...); Тогда и горизонтальный и вертикальный скроллинги будут двигаться медленный.
Если надо только для бегущих строк, т.е. горизонтального скроллинга, то задержку следует добавить в конец функции ScrollScreenBufferOneLeft().
А что, реально очень быстро? Или вы просто для себя хотите немного скорректировать скорость?
Отличная работа!!!
Можно в функции Show() в конце дописать нужную небольшую задержку - delay(...); Тогда и горизонтальный и вертикальный скроллинги будут двигаться медленный.
Если надо только для бегущих строк, т.е. горизонтального скроллинга, то задержку следует добавить в конец функции ScrollScreenBufferOneLeft().
А что, реально очень быстро? Или вы просто для себя хотите немного скорректировать скорость?
Да вот увидел Ваши часики - красиво, фукционально! По быстрому на проводках собрал, но у меня дисплейчик из 4 вместе собранных матриц. На них информация повернута на 90 градусов и пробегает на всех 4 матрицах. Ломать (разделять) их не хочется. Заказал отдельные матрицы, но пока дойдут, тестирую на отдельном одном матричном модуле. Так вот текст бежит ну очень быстро ( кстати так же быстро и на 4 матричном дисплее) даже не успеваю прочитать. С задержкой попробую попозже. Если бы можно было б развернуть текст по быстрому (для вместе собранного на 4 модулях дисплея) - вообще было бы класс! Но глянул код - мне не по силам самому :-( И если часики у Вас пока не в корпусе - не покажите ли на какой они у Вас платке обосновались?
vk007, классные часики!
А нельзя вместо BMP180 и SHT21 применить один датчик BME280? (температура, влажность, давление) 3 в 1. Вот тех. данные:
А нельзя вместо BMP180 и SHT21 применить один датчик BME280? (температура, влажность, давление) 3 в 1.
Можете делать и подключать, что угодно. Подключаете нужные библиотеки, в сетапе инициализируете датчик, а в лупе меняете запросы комнатной температуры, влажности и давления на соответствующие для библиотеки вашего датчика. Это всего несколько строк.
Видимо скетч без переделки под такой модуль не подойдет?
https://ru.aliexpress.com/item/MAX7219-dot-matrix-module-microcontroller-module-4-in-one-display/32689479860.html?spm=a2g0s.9042311.0.0.0uFARX
Если бы можно было б развернуть текст по быстрому (для вместе собранного на 4 модулях дисплея) - вообще было бы класс! И если часики у Вас пока не в корпусе - не покажите ли на какой они у Вас платке обосновались?
Развернуть, к сожалению так просто не получится. Вы, конечно, можете попробовать в скетче все setRow поменять на setColumn, но, во-первых, setColumn передает данные ощутимо медленнее и тормоза бегущей строки будет очень заметны. А, во-вторых, если я правильно понимаю как соединены эти матрицы в одну, то изображение надо будет еще и отзеркалить, а это уже надо копать код.
В то время, когда я делал эти часы, "4 матрицы на одной плате" были еще мало распространены на али и стоили существенно дороже. Ну и одна матрицы у меня до этого уже была для экспериментов. Докупил еще 3, плюс бонусом получил еще и провода с разъемами, что шли в комплекте к каждой.
Что касается платы, то она самодельная, двусторонная, сделанная лутом. Хоть и получилась компактной (чуть больше матриц, около 135х55 мм), но не лишена некоторых недостатков.
Видимо скетч без переделки под такой модуль не подойдет?
https://ru.aliexpress.com/item/MAX7219-dot-matrix-module-microcontroller-module-4-in-one-display/32689479860.html?spm=a2g0s.9042311.0.0.0uFARX
К сожалению, нет. Я в предыдущем сообщении написал, почему. Или резать и компоновать их по-другому или использовать отдельные матрицы.
Можно в функции Show() в конце дописать нужную небольшую задержку - delay(...); Тогда и горизонтальный и вертикальный скроллинги будут двигаться медленный.
Если надо только для бегущих строк, т.е. горизонтального скроллинга, то задержку следует добавить в конец функции ScrollScreenBufferOneLeft().
Огромнейшая благодарность автору за выложенный скетч и за проделанную работу! Скорость отлично регулируется как Вы указали. Полностью согласен с тем, что легче разделить модули и повернуть так как надо, чем переделывать программный код!
Платка нормальная уже тем, что всё культурненько без проводов ;)
Отличные часы спасибо автору
Вот правда заметил такую вещь.
Минуты у часов обновляются после второго прохода бегущей строки, выставлял отображение часов 3 минуты, так вот все три минуты часы не обновляются. По скетчи вроде всё нормально так не нашёл причину может это у меня одного или не обращал никто внимания. Подключён только один датчик температуры ds18b20.
Странно, но я такого не замечал. Там время должно проверяться из RTC в начале каждого общего цикла отобажения информации и потом каждые 2 секунды (для показометра считаю этого достаточно), пока на экране выводится время. Я не исключаю ошибок, код писался давно. Надо будет проверить.
Проверил. Да, действительно, иногда такое могло происходить. Код исправил, ссылка та же, можете проверять, как работает. an, спасибо за тестирование!
Спасибо большое vk007 проверил все работает отлично.
Отличные часы
Здравствуйте! Хочу спросить - каким редактором можно воспользоваться для корректировки шрифта?
Попробовал matrixclockeditor-ом.
Хочу под себя подправить некоторые символы.
Я, в основном, использовал GLCD Font Creator.
Собрал, всё работает,спасибо. Вот только с кириллицей проблема. В преференцах строку исправил. ЧЯНТД ? fonts.h надо куда-то положить? Датчики температуры не подключал. Уже голова не варит, пойду спать.
Если видны хотя бы цифры, то fonts.h лежит там, где надо (в одной папке с основным скетчем).
Что касается кириллицы, то может не тот preferences.txt или не так правили? Проще всего сделать так: открыть Arduino IDE, зайти в "файл - настройки", где-то внизу будет строка-ссылка к файлу preferences.txt, нажав на нее откроется папка с этим файлом, после этого надо обязательно закрыть Arduino IDE, и только после этого можно открывать и править preferences.txt. Также стоит проверить, может там preproc.substitute_unicode прописан дважды (а вдруг, кто его знает)? Больше предположений у меня пока нет.
Датчики подключать не обязательно и их наличие/отсутствие не связано с выводом кириллицы. Я уже писал, что при отсутствии какого-либо датчика соответствующая ему информация просто не будет выводиться. Как исключение DS18B20 (отвечающий за температуру на улице) - если он не будет подключен, то картинка появится, но вместо цифр температуры будут знаки вопроса.
Спасибо, вечерком попробую ещё разок.
На счёт кириллицы, пробовал Arduino Ide последнюю текст не корректно отражается как бы в настройках не выставлял. Нашёл версию 1.6 как написано выше и все проблемы решились.
Все может быть. Код писался давно, еще под устаревшие уже версии. Да и я не гонюсь за постоянными обновлениями, для моих задач пока меня устраивают и те, какими пользуюсь. Возможно, в новых версиях кодировка переключается как-то по-другому, или не переключается никак. Я вообще начинал писать этот скетч под модифицированную версию 1.0.5 с возможностью выбора кодировки в настройках самой Arduino IDE.
Перекачайте, пожалуйста, скетч. Обнаружилась ошибка, связанная с выводом графика давления. Ссылка прежняя.
Действительно,скачал 1.6.0 - кириллица заработала. До зтого была 1.6.8 и пробовал самую свежую с сайта ардуины.
Перекачайте, пожалуйста, скетч. Обнаружилась ошибка, связанная с выводом графика давления. Ссылка прежняя.
Пришли мне матрицы одиночные, залил этот скетч (не помню вроде на старом так не было (скетч не сохранился)) - время, дата и остальные параметры перелистываются. Но само время отображается буквально 2 секунды. Перелистнулись цифры и снова дата и т.д. Вопрос к уважаемому автору как сделать чтобы время отображалось хотя бы минуту. (затем остальное). Пробовал менять в начале скетча переменную define TIME_SHOW_MSEC 30000UL // продолжительность отображения времени (30 сек). Результата нет. А мельтешение раздражает. Термометр, барометр ,кнопки - не подключены.
Кнопки к плюсу подтяни ( или сделай для пинов на кнопки INPUT_PULLUP).
Кнопки к плюсу подтяни ( или сделай для пинов на кнопки INPUT_PULLUP).
Подтянул через INPUT_PULLUP кнопки 7,6 и 5 . Результат тот же. DS18b20, buzzer тоже подключен.
Тогда померяй напряжение на этих пинах. Больше 4 вольт? Если нет, ищи коротыш. Программа думает, что нажата какая-то кнопка.
Тогда померяй напряжение на этих пинах. Больше 4 вольт? Если нет, ищи коротыш. Программа думает, что нажата какая-то кнопка.
Спасибо! Действительно помогла только "железячная" подтяжка. Всё работает, ну есть маленькие ньансы под мои нужды но пока об этом не стоит ;-) .
Странно. У меня пуллапа хватило, ну да ладно.
Заметил такую вещь: уровень яркости как бы прыгает каждый цикл показа времени - то есть сначала включается полная яркость, а затем медленно затухает ( в темное время) . Нельзя ли как бы поправить (сравнить если освещение поменялось -> тогда только менять яркость дисплея) или сделать наоборот от меньшей яркости дисплея к большей.
С автоподстройкой яркости я особо не заморачивался, поскольку в планах было сделать ее аппаратной - включить фоторезистор в цепь токоограничения для МАХ7219. Даже статью недавно видел, как кто-то так уже делал, но руки так и не дошли.
Возможно, и скорее всего, идет засветка фоторезистора от матрицы. Я у себя засунул его в черную термоусадку и расположил так, чтобы свет от матрицы не попадал на него - и такого эффекта не наблюдаю. Попробуйте, должно помочь.
Если не получится, то можно подправить скетч. Сейчас при отображении времени слежение за освещением идет постоянно. Это конечно хорошо, но если наблюдаются глюки, то лучше этим пожертвовать и перенести SetBrightness() из цикла while((millis() - time_previous_millis... в самое начало loop'а. Тогда установка яркости будет происходить один раз перед выводом времени. В этот момент экран пустой и влиять на фоторезистор он не будет.
Автор молодец!!! Жена как увидела часики в работе, приравняла меня к лику святых:)) Шучу. Осталось засунуть их в бутылку от вина. Где-то в инете был образец. Ещё раз спасибо.
bizzon, делали плату сами или спаяли на макетке?
Ну скажем так.. Объёмный монтаж .Бутербродом.
Перекачайте, пожалуйста, скетч. Обнаружилась ошибка, связанная с выводом графика давления. Ссылка прежняя.
А в каком виде должен выводиться график давления? Подключил сегодня BMP180. За 3 часа давление упало на еденицу. Вот что рисует
Спустя 3 дня график почти заполнен. Получается это барограф)
Правильно рисует. Там логика такая - пока история показаний пустая, то рисуется такое себе "многоточие" (чтобы совсем пусто не было). Со временем данные будут накапливаться и график заполнится полностью. Старые данные выводятся слева, данные посвежее - справа. У вас сейчас в память занесено только одно показание, поэтому виден только один столбец справа. Еще через 3 часа (или как вы там себе настроили) в память сохранится новое свежее значение и уже оно будет в самом правом столбце, а то, что сейчас, сдвинется влево, и т.д. Таким образом, примерно через 3 суток у вас уже будет полный график.
А я вот думаю не про график (польза от него в мои года ..) А про оформление.
Изменение давления организм сам подскажет, а вот как оформить подарок- ..