Микроконтроллеры это просто. LED матрицы. MD_Parola — бегущая строка с русским шрифтом за 20 строк кода.
Есть много библиотек для работы с светодиодными матрицами, но пожалуй такого разнообразия функционала как у библиотек MD_MAX72XX , MD_Parola и MD_MAXPanel нет ни у кого, кроме того данные библиотеки поддерживают не только Amtel микроконтроллеры но и STM32 и ESP8266.
Я буду рассматривать только библиотеку MD_Parola, поскольку с её помощью можно реализовать в том числе и то, что реализует библиотека MD_MAX72XX. Библиотеку MD_MAXPanel в следующих статьях.
В любом скетче должны присутствовать обязательно 2 функции: setup() и loop(), setup() вызывается один раз при старте программы, loop() это основной цикл программы. Вначале скетча подключаем библиотеки и определяем переменные.
Для работы подключаем библиотеку SPI и соответствующую библиотеку
1 2 3 |
#include <SPI.h> #include <MD_MAX72xx.h> #include <MD_Parola.h> |
далее задаем параметры матриц (количество, расположение), для использования скетча в разном оборудовании (Arduino xxx, STM32, ESP8266) надо только изменить параметр CS_PIN
1 2 3 |
#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // тип оборудования PAROLA_HW , GENERIC_HW , ICSTATION_HW , FC16_HW } #define MAX_DEVICES 4 // количество модулей матриц const uint8_t CS_PIN = 4; // номер пина сигнала CS для SPI |
задаем переменную (P) для MD_Parola
1 |
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); |
для вывода данных на матрицу мы будем использовать переменную P, делаем инициализацию матрицы и задаем параметры
1 2 3 4 5 |
void setup() { P.begin(); P.displayText("Hello", PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT); } |
и в основном цикле выводим текст
1 2 3 4 |
void loop() { P.displayAnimate(); } |
разберем строку параметров выводимого текста, она имеет следующие параметры.
P.displayText(Текст, позиция , скорость, пауза, эффект появления, эффект исчезновения);
Текст — выводимый текст
позиция — выравнивание текста
PA_CENTER — Текст будет размещен с одинаковым количеством пустых столбцов с обеих сторон.
PA_RIGHT — Самый правый столбец последнего символа будет находиться на правой стороне дисплея.
скорость — в миллисекундах (1 сек = 1000 миллисекунд) скорость анимации при появлении/исчезновении, промежуток времени между сдвигом на 1 пиксель.
пауза — пауза после исчезновения
эффект появления, эффект исчезновения — эффект появления и исчезновения текста
PA_PRINT — Текст только появляется (печатается)
PA_SCROLL_UP — Текст прокручивается вверх по дисплею.
PA_SCROLL_DOWN — Текст прокручивается вниз по дисплею.
PA_SCROLL_LEFT — Текст прокручивается справа налево на дисплее.
PA_SCROLL_RIGHT — Прокрутка текста слева направо на дисплее.
PA_SPRITE — Текст входит и выходит, используя пользовательский спрайт.
PA_SLICE — Текст входит и выходит из фрагмента (столбца) одновременно справа.
PA_MESH — Текст входит и выходит в столбцах, перемещаясь в альтернативном направлении (U / D)
PA_FADE — Текст входит и выходит, постепенно уменьшаясь от / до 0 и устанавливая интенсивность.
PA_DISSOLVE — Текст растворяется от одного дисплея к другому.
PA_BLINDS — Текст заменяется за вертикальными жалюзи.
PA_RANDOM — Текст входит и выходит как случайные точки.
PA_WIPE — Текст появляется / исчезает по одному столбцу за раз, выглядит так, будто он стирается и выключается.
PA_WIPE_CURSOR — Протрите светлой полосой перед изменением.
PA_SCAN_HORIZ — Сканируйте светодиодную колонку по одному, затем появляются / исчезают в конце.
PA_SCAN_HORIZX — Сканируйте пустой столбец по тексту по одному столбцу за раз, затем появляются / исчезают в конце.
PA_SCAN_VERT — Сканируйте светодиодный ряд по одному, затем появляются / исчезают в конце.
PA_SCAN_VERTX — Просканируйте пустую строку по тексту по одной строке за раз, затем появляются / исчезают в конце.
PA_OPENING — Появляются и исчезают из центра дисплея по направлению к концам.
PA_OPENING_CURSOR — ОТКРЫТИЕ с легкими барами перед изменением.
PA_CLOSING — Появляются и исчезают с концов дисплея по направлению к середине.
PA_CLOSING_CURSOR — ЗАКРЫТИЕ с легкими барами перед изменением.
PA_SCROLL_UP_LEFT — Текст перемещается по диагонали вверх и влево (северо-восток)
PA_SCROLL_UP_RIGHT — Текст перемещается по диагонали вверх и вправо (северо-запад)
PA_SCROLL_DOWN_LEFT — Текст перемещается по диагонали вниз и влево (юго-восток)
PA_SCROLL_DOWN_RIGHT — Текст перемещается по диагонали вниз и вправо (северо-запад)
PA_GROW_UP — Текст растет снизу вверх и уменьшается сверху вниз.
PA_GROW_DOWN — Текст растет сверху вниз и сжимается снизу вверх.
однако данный метод не позволяет сделать циклическую прокрутку текста и в качестве аргумента эффект исчезновения необходимо использовать PA_NO_EFFECT, при использовании других параметров текст будет исчезать.
в примере код
1 |
P.displayText("Hello", PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT); |
просто выводит текст и выравнивает его по центру, то есть до правого и левого края одинаковые расстояния. если текст длиннее ширины матриц то текст будет располагаться по левому краю.
Если мы добавим анимацию появления, то текст будет появляться с анимацией, например
1 |
P.displayText("Hello", PA_LEFT , 100, 0, PA_SCROLL_LEFT, PA_NO_EFFECT); |
выведет текст справа налево, скорость перемещения 0,1 сек/пиксель, после того как текст дойдет до левого края он остановиться. если мы добавим анимацию исчезновения PA_SCROLL_LEFT то текст не останавливаясь уйдет влево.
1 |
P.displayText("Hello", PA_CENTER , 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT); |
чтобы получить циклический скроллинг текста надо сбрасывать параметры командой P.displayReset(), вызывать эту функцию надо после того как анимация будет закончена, об этом функция displayAnimate() сообщает переходом в значение TRUE, по этому анимацию текста сделаем вставив следующий код в функцию loop()
1 2 3 4 5 6 |
void loop() { if (P.displayAnimate()) { P.displayReset(); } |
мы получим цикличность выполнения анимации текста.
Для вывода текста в зоны необходимо использовать функцию displayZoneText () все параметры аналогичны функции displayText () за исключением номера зоны.
P.displayZoneText (Номер зоны,Текст, позиция , скорость, пауза, эффект появления, эффект исчезновения);
Вызов данной функции будет выводить текст в указанную зону.
Русский текст и UTF-8 символы.
Как я уже писал в начале есть множество библиотек для вывода текста на матрицы, но часть из них не поддерживает русский текст и символы UTF-8 и/или не работает на STM32, esp8266
Для использования кодировки UTF-8 в которой кодируются русские символы в библиотеке предусмотрено использование внешних шрифтов.
Скачиваем шрифты, например отсюда, файл шрифтов поместим в папку со скетчем и вначале скетча подключим это файл в наш проект после подключения библиотек
1 |
#include "5bite_rus.h" |
можно подключить сразу несколько шрифтов. Далее чтобы использовать подключенный шрифт надо указать какой шрифт используем применив функцию getFont (), посмотреть название шрифта можно в подключенной файле, открываем файл любым текстовым редактором и смотрим название переменной
1 |
const uint8_t PROGMEM _5bite_rus[] = |
в данном случае _5bite_rus и есть наше название шрифта.
теперь указываем название шрифта функцией setFont() перед выводом текста
1 |
P.setFont(_5bit_rus); |
однако если текст написан в кодировке UTF-8 то кроме символов текста вы увидите перед каждым символом лишние не понятные символы, это символ старшего байта символа, чтобы этого избежать есть 2 варианта, первый это использование функции перекодировки или использование шрифта в котором нет символов с кодом, равным старшему биту. В русском шрифте старший бит равен 208 или 209 и по этому в моем шрифте эти символы отсутствуют. Без использования функции перекодировки придется пожертвовать буквой «Ё» и «ё» поскольку младшие байты этих символов совпадают с младшими байтами других символов.
полностью скетч выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> #include "5bite_rus.h" // подключаем внешний шрифт #define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW #define MAX_DEVICES 4 // количество модулей #define CS_PIN 4 // CS SPI // Hardware SPI connection MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { P.begin(); P.setFont(_5bite_rus); P.displayText("СЪЕШЬ ЕЩЕ ЭТИХ МАЛЕНЬКИХ БУЛОЧЕК И ВЫПЕЙ ЧАЮ, съешь еще этих маленьких булочек и выпей чаю", PA_CENTER , 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT); } void loop() { if (P.displayAnimate()) { P.displayReset(); } } |
Шрифты можно делать свои используя мой шаблон в LibreOffice или шаблон разработчиков в Microsoft Excel, как использовать шаблон для создания шрифтов в одной из следующих статей.