Радиолюбитель - это просто

А что еще нужно радиолюбителю, кроме хорошего паяльника и интересной схемы...

Бегущая строка на светодиодной матрице и Arduino

Бегущая строка на светодиодной матрице и 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);
}
}
}


Соответственно, упрощается вывод символов:

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);
}
}


Видео с результатом работы:



Полный текст скетча можно скачать по ссылке ниже.

Скачать скетч с плавной прокруткой

Скачать скетч с прокруткой по символам



Оставьте комментарий!

Комментарий будет опубликован после проверки