Тут на форуме есть уже как минимум три различные конструкции часов на светодиодных матрицах. Я предлагаю ещё одну, на MAX7219
Часы (бегущая строка) получаются достаточно простыми. На каждую матрицу нужна лишь одна микросхема драйвера + 1 резистор для задания тока через светодиоды. Управляется такая матрица по трёхпроводному интерфейсу, несколько драйверов можно последовательно каскадировать, при этом количество необходимых от МК линий не изменяется - всего три.
В схеме использованы МК ATmega8, часы DS1307, датчики DS18B20, в общем, за исключением MAX7219, всё знакомое и привычное.
Вот несколько фотографий того, что у меня получилось:
Возможности:
1. Собственно отображение и настройка времени.
2. Один будильник с возможностью задания дней недели для срабатывания.
3. Настройка яркости свечения часов для каждого часа времени суток (ночью можно послабее сделать, днём поярче).
4. Отображение температуры (в комнате и на улице) раз в минуту бегущей строкой.
5. Отображение текущей даты раз минуту бегущей строкой.
Кнопки:
1. Отключение звонка будильника, остановка бегущей строки, выбор настраиваемого параметра в меню настроек.
2. Показать дату бегущей строкой, увеличить значение настраиваемого параметра.
3. Показать температуру бегущей строкой, уменьшить значение настраиваемого параметра.
При длинном нажатии кнопки соответственно входят в режимы настройки времени/будильника/яркости.
Длинное одновременное нажатие всех кнопок разворачивает картинку на экране на 180 градусов (если часы вешать на стену, это может быть удобно для подвода провода уличного датчика температуры и кабеля питания с нужной стороны.
В качестве динамика для будильника используется активный buzzer, тоже купленный в Китае.
Собственно, часы делались уже довольно давно, просто сейчас решил выложить то что есть. Возможно, кого-то часы заинтересуют, тогда могу и в виде статьи оформить.
MAX7219 можно купить в Китае на Aliexpress, там даже готовые наборы уже сразу с матрицами есть.
Исходники прошивки под avr-gcc доступны на https://github.com/WiseLord/matrixclockGitHub, так что при желании бегущую строку можно сделать намного больше, чем 3 матрицы.
Во вложении прошивка, eeprom, проект для Proteus и библиотека с матрицей для Proteus (пришлось немножко переделать имеющийся символ, чтобы строка бежала слева направо, а не снизу вверх). Можно потыкать кнопки и посмотреть, как это всё работает. Возможные дёрганья при прокрутке строк - это "заслуга" Proteus, в жизни всё аккуратно и плавно.
Если кого-то заинтересует - могу попозже оформить статью и продолжить развитие устройства. Только придётся, наверное, перейти на более "жирный" МК, т.к. в ATmega8 проект уже еле влезает (из-за шрифтов, в основном). Да и написан он был давно, и многие вещи можно оптимизировать.
Видео c работой часов:
PS
Новые (на 16 июля 2015 года) возможности по сравнению со статьёй:
Собрать прошивку под свой набор железа можно командой
Код: Выделить всё
make LED_DRIVER=[драйвер] MCU=[микроконтроллер]- Поддержка сборки для Atmega8/168/328.
В качестве [микроконтроллер] указываем, соответственно, atmega8, atmega168 или atmega328.
- Поддержка варианта для четырёх матриц.
Этот вариант теперь основной. В качестве [драйвер] указываем MAX7219. Для варианта из трёх матриц - MAX7219_X3
- Поддержка повёрнутых на 90 градусов матриц.
Так уж вышло, что у готовых китайских плат в размер матрицы разводка такая, для удобства разводки их надо развернуть на 90 градусов относительно "правильного" положения, для которого делался проект. Поэтому, для [драйвер] появились аналогичные основным варианты MAX7219MOD и MAX7219MOD_X3
- Поддержка драйвера HT1632.
Соответственно, в качестве [драйвер] указываем HT1632. Разводка для этого варианта отличается от вариантов на MAX7219 и соответствует разводки продаваемой китайцами плате J-MCU 3208CLOCK PRO.
- Поддержка датчика температуры и атмосферного давления BMP180.
Датчик работает по шине I²C и подключается к ней параллельно часам реального времени DS1307.
- Поддержка датчика температуры и влажности DHT22.
Датчик подключается к порту PD3, плюс на этом же порту необходим подтягивающий к питанию резистор 4,7кОм.
- Поддержка фоторезистора в качестве датчика освещённости
Я использовал MJ3516, но должен подходить любой с сопротивлением в освещённом состоянии 5..10 кОм. Фоторезистор (и, желательно, 500кОм..1МОм резистор параллельно) подключается между ножкой ADC0 (вариант на MAX7219) (или ADC7 (вариант на HT1632)) и питанием, также между этой ножкой и землёй подключается резистор 10кОм. Таким образом, образуется резистивный делитель, с которого АЦП получает уровень освещённости. На вывод AREF, если он не подключен к питанию, нужно подключить конденсатор 0.1мкф на землю.
Резистор 10кОм на землю обязателен и в случае отсутствия фоторезистора. Он вытягивает вход АЦП в ноль, благодаря чему система определяет, что датчик отсутствует.
При отсутствии фоторезистора дневное распределение яркости при установленном в настройках значении 15 будет выглядеть так:
Для меньшего настроенного значения график соответственно опускается ниже. При наличии фоторезистора уровень яркости, заданный в настройках, будет ограничением яркости сверху.
- Все текстовые строки перенесены в файл EEPROM
Это позволяет сделать перевод интерфейса на разные языки. В данный момент имеются белорусский, английский, украинский и русский варианты. Также это позволяет легко подправить текстовые метки под свои потребности.
- Конфигурация ножек МК вынесена в отдельный файл pins.h
Так что каждый может легко поменять её под свою удобную, разводку.
- Ежечасный сигнал
При этом период действия "кукушка" завязан на настройку будильника (неважно, включен ли он сам по себе). Скажем, если он выставлен в 8:20, то первая "кукушка" прозвучит в 9:00 и будет срабатывать вплоть до 23:00, отключаясь на ночь.
- Три различного размера шрифта для отображения времени
При этом два "широких" шрифта можно настроить в EEPROM. Шрифт шириной 5 точек находится в eeprom по смещению 0x180, шириной 6 точек - по смещению 0x1C0. Принципы формирования шрифтов:
Спойлер
Код: Выделить всё
-xxx- 5 байт(снизу вверх, слева направо):
x---x
x---x 1: 0b00111110 => 0x3E
x---x 2: 0b01000001 => 0x41
x---x 3: 0b01000001 => 0x41
x---x 4: 0b01000001 => 0x41
-xxx- 5: 0b00111110 => 0x3E
-----
В eeprom hex-редактором по смещению 0x1C0 вписываем 3E 41 41 41 3E.
Аналогично продолжаем для цифр 1-9- Возможность отключения лидирующего нуля при отображении времени
Делается это одновременным длительным нажатием кнопок 1 и 2. Можно переключить режим (вроде 08:15 <=> 8:15).
Различная полезная информация:
Расположение матриц при разводке платы под MAX7219:
Шпаргалка по кнопкам:
Спойлер
Короткие нажатия кнопок:В режиме часов:
1 - остановка бегущей строки
2 - показать дату бегущей строкой
3 - показать данные с датчиков бегущей строкой.
В режимах настройки:
1 - следующий редактируемый параметр;
2 - увеличить текущий параметр;
3 - уменьшить текущий параметр.
Длинные нажатия кнопок:
1 - вход в режим настройки времени;
2 - вход в режим настройки будильника;
3 - вход в режим настройки максимальной яркости (используется при отсутствии фоторезистора).
Повторное длительное нажатие кнопки возвращает из соответствующего режима настройки в режим часов.
1 и 2 одновременно - переключение режима отображения лидирующего нуля в часах (07:43 или 7:43);
2 и 3 одновременно - выбор шрифта для режима часов;
1, 2 и 3 одновременно - разворот картинки на 180 градусов.
Для запрета вывода некоторых данных от датчиков BMP180 и DHT22 в eeprom по адресу 0x0F находится соответствующий байт конфигурации, куда hex-редактором записываем соответствующую маску.
Спойлер
0x10 - вывод температуры от BMP1800x20 - вывод температуры от DHT22
0x40 - вывод давления от BMP180
0x80 - вывод влажности от DHT22
Любая комбинация вывода производится сложением масок. Например, 0x40 + 0x80 = 0xC0 - будет выводиться только давление и влажность, без температур. Или, 0x20 + 0x40 + 0x80 = 0xE0 - выводим всё, кроме температуры от BMP180.
По умолчанию значение в EEPROM равно 0xF0, что при наличии всех датчиков будет выводить все возможные данные от них.
Интервал между выводом бегущих строк можно настроить в EEPROM. Для этого есть ячейка в EEPROM по адресу 0x0D, в которую записывается необходимое значение в диапазоне от 0 до 255 секунд.
Прошивку от 16.07.2015 можно скачать из вложения в этом сообщении.