Матричный дисплей на MAX7219. Делаем часы с погодой.

htb1ci2ispxxxxc3xpxxq6xxfxxxh

Микросхема MAX7219 — готовый драйвер для семисегментных и матричных светодиодных индикаторов.  В семисегментном индикаторе я уже использовал ее в контроллере вентилятора  и погодной станции. В этой статье я напишу о применении готовых светодиодных модулей с MAX7219.

Модули 8×8 с MAX7219 продаются поштучно либо готовыми сборками 8×32. Я брал отдельные модули  8×8 с ценой чуть больше доллара за штуку. Так как при количестве больше 1 шт получалась платная доставка, не поленился, сделал 8 заказов.

100

В комплекте платка с микросхемой, сам индикатор, разъемы для индикатора и для соединения каждой платы.

101

Размеры индикатора 3.2 см Х 3.2 см. Подключение к микроконтроллеру по SPI «в один конец» по трем проводам. Модули подключаются каскадно — DIN->DOUT. Все остальные выводы запаралелены.
Подключив один модуль к ардуинке (фоток не осталось) решил сразу собирать дисплей.
Из двух конфигураций 8×64 и 16×32 выбрал вторую, так как решил в конечном итоге делать часы.
Первая же это классическая «бегущая строка».
Чтобы меньше возиться с проводами, развел плату под дисплей (и чего бы на нее сразу контроллер не установить было?)

200

201

Готовый собранный экран подключил к ESP8266.
Для таких модулей обычно используется ардуиновская библиотека LedControl . Но мне больше приглянулся драйвер для модулей MAX7219 к графической библиотеке AdafruitGFX.
В отличие от LedControl, где с каждому модулю обращаются по номеру, Max72xxPanel позволяет работать со всеми модулями, как с едиными пиксельным дисплеем.
К ESP8266 подключение такое:

  • DIN -> GPIO13 (MOSI)
  • SCK -> GPIO14 (SCK)
  • CS -> GPIO16 (к любому свободному)

В конструкторе объекта матрицы определяем PinCS, а также количество модулей по вертикали и по горизонтали

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

Микросхема MAX7219 поддерживает 16 градаций яркости светодиодов. Ставим максимальную:

Дисплей превращается в яркий красный фонарь

302

мощностью более 12Вт

301

К тому же довольно ощутимо нагревающийся

101

Собственно удивляться нечему — все написано в даташите на MAX7219, Максимальный ток на всех сегментах одного модуля — 330мА, что при умножении на 8 и дает 2.6А. Минимальный ток — 1/16 от этой цифры. В нашем случае около 160мА. При установке интенсивности ток будем меняться с шагом 1/16 от максимального.
При такой яркости дисплея не вижу смысла устанавливать значение интенсивности больше 7.
С током разобрались, перейдем к выводу информации на наш дисплей.
В примерах к библиотеке Max72xxPanel есть простенькая программа — вывод бегущей строки. По умолчанию, строка выдается стандартным шрифтом библиотеки GFX 5×7.
Русификация данной библиотеки подробно рассмотрена здесь.
Суть сводится к тому, что нужно скачать по ссылке архив, взять оттуда русский фонт и положить его в папку AdafruitGFX-master. Остальные файлы, это примеры, как перекодировать константы, введенные в среде Arduino в UTF-8 в кодировку фонта 1251.
Там есть для этого функция utf8rus 

Небольшое отступление про кодировку русских букв в среде Ардуино

Тут должно быть много русского мата. Про всех родственников этого итальянца.
Сперва я долго возился с выводом русских слов, введенных в редакторе Arduino IDE на дисплей. Выяснил, что в функции utf8rus нужно смещать на 1 меньше. Как я радовался получив «Привет» на экран. Но в какой то момент времени вместо внятных слов опять получалась белиберда. Смещение в кодировки было то на 1, то на 2 символа. Причем, во вновь созданном скетче все было нормально. До поры, до времени.
Я уже было решил хранить русские константы в отдельном файле либо кодировать в виде ‘\234’. Пока не стал открывать программу в редакторе NotePad++. Тот определял кодировку UTF8, то UTF8 без BOM.
Путем натурального эксперимента было определено, что если брать файл, и преобразовывать его в UTF без BOM, то следующая сборка проходит нормально и русские константы нормально отображаются.
Документированный «баг» стал «фичей».

scr1

С отображением текста теперь все ясно. Но дисплей у на ГРАФИЧЕСКИЙ. Значит без отображения графики, хотя бы статической, никуда.
Чтобы подсунуть графику библиотеке GFX, нужно запихнуть ее в байтовый массив.
Для этого можно воспользоваться онлайн-сервисом
Рисуем картинку или иконку в любом редакторе, подсовываем ее этому сервису. Шаманим с параметрами, если нужно и получаем готовый массив

scr2

Теперь если скормить этот массив функции drawBitmap, то получаем ее на дисплее

300

Интересно смотреть в тепловизор, как нагреваются отдельные пикселы

100

С дисплеем все понятно. Теперь можно сделать из него что-нибудь полезное. В интернете ходит шутка, что бы вы не делали с ESP8266 — получается метеостанция. ))) Вот ее то мы и будем делать, только без датчиков. Погоду пусть контроллер берет из интернета, с бесплатного сервиса openweathermap.org и отображает попеременно со временем, которое получает по NTP. Погода получается в формате jSON. Пытался договориться с Яндексом на получение погоды, но служба поддержки меня послала объяснила, что бесплатный доступ к API погоды они дают только СМИ.
Под цифры полной высоты шрифт не подобрал, поэтому нарисовал 10 картинок

303 304 305

Значок подключения к WiFi

306

Полный скетч который запрашивает время и погоду и выводит на экран выложил на GITHUB
Осталось подобрать подходящий корпус

401

Вытравливаю плату с контроллером (и что бы ее с платой дисплея не совместить?)

402

Прошиваю ESP8266 на программаторе.

403

Паяю плату контроллера

404

Монтирую в корпусе

405

406

Закрываю прозрачным стеклом с красным светофильтром (хорошо подходят цветные файлы для бумаг )

411

410

Питание — старый зарядник от телефона. При яркости 50% и не полном заполнении экрана ток потребления получается порядка 0.5А, так что зарядника вполне хватит. И часы в черновом варианте готовы.

407 408 409

Видео работы часов с погодой

Восторг кота слышен на заднем плане )))

Пора подводить итог.
Модули вполне годные, но работать мне с ними не понравилось. Слишком много возьни, избыточное количество микросхем, хотя лучше, чем на WS2812, где микросхема в каждом диоде.
Все же лучше применять готовые дисплеи. Например, P6 RGB гораздо большего размера обойдется в $11

В целом проект удачный, часы после небольшой доработки корпуса пойдут в подарок.
Доделаю выдачу даты, снижение яркости дисплея после захода солнца (сервис openweathermap.org lдает эту информацию) и прогноз погоды, а также отображения температуры в корпусе часов в комнате. Разъем для DS18B20 предусмотрен.
Всем хорошего дня и солнечных выходных. А то пока делал часы, больше 21С они не вещали. И это в июле!

Правда похоже получилось?

c1

c2

Пока писалась статья, приехал дисплецсик P6. Так что скоро будет новый материал

l001 l100

 

 

Вы можете оставить отзыв или трекбек со своего сайта.

31 комментарий на «Матричный дисплей на MAX7219. Делаем часы с погодой.»

  1. Кирилл:

    Отлчиная идея с красным акрилом.А если применить черный,миллиметра в три,будет достаточно читаемо?

  2. Александр:

    Подскажите, пожалуйста. Что именно и куда, нужно добавить в
    скетч, чтобы в чесах появился календарь.

  3. Оскар:

    Добрый день! Повторил Ваш проект, правда пока что на ардуинке. Отключил погоду и проверку времени. Все работает. Цифры шикарно смотрятся издалека! Скоро приедет ЕСП-шка и все включу. Спасибо, я обогатил свои знания))

  4. Оскар:

    Добрый день! Снова я))
    Пришла ЕСП-шка, сделал скетч под себя. А именно:
    1. Уменьшил паузу между миганиями значка WiFi с 500мс до 50мс, что дало существенное ускорение подключения к сети.
    2. Исправил фразу «В Перми» на » Сегодня», так более универсальнее. Причем именно с пробелом вначале, чтобы при переключении режима с маленьких цифр на большие не оставался фрагмент буквы «С».
    3. Изменил время опроса погоды с 1 минуты на переменную WEATHER_TIMEOUT и дал ей значение 5 минут.
    4. Изменил переменную времени опроса NTP сервера с 10 на 5 минут. Это на случай долгого отсутствия интернета при первом включении.
    5. Изменил способ мигания точек на больших цифрах. Теперь они в крайних вертикальных позициях и мигают поочередно. Так они почти не сливаются с цифрами.
    6. В блоке «Показ часов» добавил перед Break; строку matrix.fillScreen(LOW); что обеспечило более ровное переключение между режимами.

    Теперь что в планах:
    1. Не смог побороть символ градусов, все время прилетает не тот символ.
    2. Сделать ежечасный звуковой сигнал, лучше если из флэшки.
    3. Управление яркостью экрана в зависимости от времени суток.
    4. Можно еще подумать над вэбинтерфейсом для подключения к любой сети.
    5. Вывод собственных сообщений в зависимости от даты. Тогда точно понадобится вэбинтерфейс!))
    6. Включение ночного (дежурного) освещения в заданное время. Вэб!))
    7. При пропадании питания отключить матрицу, но продолжать работу. Выводить время на матрицу в течении 1 секунды раз в 3-5 секунд на минимальной яркости и без погоды. Питание на резерве от лития. На это время не опрашивать серверы погоды и NTP. Ну тут проще.

    Вобщем есть над чем покумекать! Кому будет интересно пишите на почту boscarСобакаlist.ru, отвечу по мере возможности. Скетч также вышлю по запросу любому желающему. Всем удачи!

  5. Даниил:

    Оскар здравствуйте, так может поделитесь скетчом ?

  6. Alexey:

    Возможно ли дополнить его будильником?

  7. Оскар:

    Кстати, без особых усилий народ собирает на этом проекте матрицу 16х40 просто добавляя блоки и прописывая скетч. Получается более визуальнее))

  8. Светозар:

    Хорошие часики. Скетч скинь на почту .. плиззз

  9. Александр:

    Здравствуйте,повторил подобную конструкцию только автора с ютуба https://www.youtube.com/watch?v=23Fk5X38x9E, она мне понравилась большим количеством различных анимаций и простотой повторения, хотя по началу заказал две строки по 4 сегмента для повторения вашей конструкции. Возникла такая проблемка, которая не даёт возможности собрать конструкцию на постоянку для работы в роли часов, а не опытной конструкции с проводами на столе. Со вревенем потухают сегменты сборки, каждый раз с различной переодичностью, иногда через сутки из 4х оставался работать только один сегмент. Не подскажете куда рыть для устранения этой проблемы?
    Пробовал питать от разных источников питания(зарядок от мобильных на 0,7А и 2А), в конце сборки ставить электролиты и керамику, ничего не меняется. Правда чесно говоря, я в программированиях дальше заливок готовых скетчей и мигания светодиодом не продвинулся особо. Но может как соседу по городу направите меня в нужном направлении

    • Alexey Alexey:

      Проблема в MAX7219 который довольно чувствителен к помехам и ловит их в свои регистры
      В аналогичном проекте добавил функцию восстановления регистров микросхемы
      /**
      * Восстановление регистров MAX7219
      */
      void MAX7219_recovery(){
      // initialization of the MAX7219
      MAX7219_setRegistry(MAXREG_SCANLIMIT, 0x03);
      delayMicroseconds(dly);
      MAX7219_setRegistry(MAXREG_DECODEMODE, 0x00); // full decode mode BCD 7 Seg Display
      delayMicroseconds(dly);
      MAX7219_setRegistry(MAXREG_SHUTDOWN, 0x01); // shutdown mode OFF
      delayMicroseconds(dly);
      MAX7219_setRegistry(MAXREG_DISPTEST, 0x00); // no test
      delayMicroseconds(dly);

      }

      И вызываю ее перед перед каждой выдачей информации на экран
      В зависимости от библиотеки функция может меняться, но принцип такой

  10. Igor:

    Привет очень хороший проект , только есть одна проблема , при смене с зимнего времени на летнее и наоборот время не меняется автоматически , как исправить это ??? . Что мне нужно дописать в коде??? , чтобы время менялось автоматически

  11. михаил:

    дай мне плата для esp8266 12F?

  12. mikhail:

    дай мне плата для esp8266 12F?

  13. Олег:

    Подскажите, пожалуйста, как убрать второе повторение бегущей строки?

  14. Как переделать на однострочный дисплей (из 4 модулей), хочу забацать часы, погоду и курс Биткоина )

  15. Здравствуйте.Не могли бы вы скинуть крайний скетч на vladqaw777@mail.ru .Спасибо!!!
    Очень интересный проект!!!

  16. kym13:

    Оскар.
    Если Вас не затруднит отправьте пожалуйста Ваш скетч на почту beika@mail.ru

Ваш отзыв на Alexey

Вы должны войти, чтобы оставлять комментарии.