Все знают, как красиво выглядит «бегущая строка». Но главное не красивый вид, а возможность показать очень длинный текст, не помещающийся на экран. Попробуем реализовать такое же на светодиодной матрице и Arduino.
Вообще, для создания бегущей строки есть два способа – простой и сложный. У каждого есть свои плюсы и минусы, а какой из них лучше – надо смотреть по ситуации. Рассмотрим оба. Схему подключения используем ту же, что и в прошлом материале.
Простой способ
В прошлом материале мы выводили статическое изображение в виде текста. Попробуем реализовать эффект «бегущая строка», сделав более длинный текст и просто выбирая необходимые части для вывода.
Для работы используем прошлый скетч, немного изменив его. В частности, в секции инициализации оставим только предварительные настройки и очистку экрана, а вот вывод текста перенесём в основное тело программы. Это следует сделать, так как информация на экране будет постоянно обновляться.
Для начала попробуем написать что-то приличное, например, «Ктулху фхтагн!». Подготовим соответствующий массив с буквами, аналогично прошлому примеру (есть в скетче по ссылке внизу материала). Шрифт делаем с символами одинаковой ширины, 5 столбцов – это пригодится в следующих материалах.
Следует обратить внимание, что если мы хотим, чтобы текст плавно выезжал справа и так же плавно уходил налево, нам нужно оставить чистое поле, равное по ширине экрану.
Поэтому в начале и в конце массива добавим по 32 байта со значением 0b00000000. Для вывода на экран выбираем 32 байта подряд, постепенно смещая начало выборки в сторону конца массива. Код вывода получился следующим:
void setup() { matrix.setIntensity(brightness); matrix.setRotation(0); matrix.fillScreen(LOW); matrix.write(); } void loop() { byte x, y, i; for (i = 0; i <= sizeof(leds) - 32; i++) { for (y = 0; y <= 32; y++) { for (x = 0; x < 8; x++) { matrix.drawPixel(x, y, leds[i + y] & (1<<x)); } } matrix.write(); delay(250); } }
Для изменения скорости прокрутки можно поиграться со значением задержки.
Внимание! При размере экрана в 32x8 светодиодов один байт соответствует одному столбцу, поэтому можно использовать функцию sizeof(). В случае иного размера столбцов результат следует разделить на 2 (для столбца в 16 светодиодов) и т. д.
Видео с результатом работы:
Сложный способ
При большом количестве текста изображение будет требовать слишком много памяти, поэтому здесь стоит пойти иным путём – сформировать отдельно изображения символов, а в массив для отображения записывать только коды символов.
Для упрощения задачи можно пожертвовать плавностью прокрутки и сдвигать текст сразу на 6 столбцов (5 занимает символ и 1 – межсимвольный интервал).
В 32 столбца поместится максимум 5 символов, поэтому в начало и конец массива также пишем только по 5 пробелов.
Для облегчения работы добавим функцию drawSymbol():
void drawSymbol(byte code, byte pos) { for (byte y = 0; y < 5; y++) { for (byte x = 0; x < 8; x++) { matrix.drawPixel(x, pos * 6 + y + 1, sym[code][y] & (1<<x)); } for (byte x = 0; x < 8; x++) { matrix.drawPixel(x, pos * 6 + 6, LOW); } } }
Соответственно, упрощается вывод символов:
void loop() { byte y, i; for (i = 0; i <= sizeof(leds) - 5; i++) { for (y = 0; y < 5; y++) { drawSymbol(leds[i + y], y); } matrix.write(); delay(500); } }
Видео с результатом работы:
Полный текст скетча можно скачать по ссылке ниже.
Comments: