Бегущая строка на светодиодной матрице и Arduino
Материал по статье автор Виталий Чубатый
Все знают, как красиво выглядит «бегущая строка». Но главное не красивый вид, а возможность показать очень длинный текст, не помещающийся на экран. Попробуем реализовать такое же на светодиодной матрице и 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< }
}
matrix.write();
delay(250);
}
}
Для изменения скорости прокрутки можно поиграться со значением задержки.
Внимание! При размере экрана в 32×8 светодиодов один байт соответствует одному столбцу, поэтому можно использовать функцию 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< }
for (byte x = 0; x < 8; x++) {
matrix.drawPixel(x, pos * 6 + 6, LOW);
}
}
}
Соответственно, упрощается вывод символов:
Code:
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);
}
}
Видео с результатом работы:
Полный текст скетча можно скачать по ссылке ниже.