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

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

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

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

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

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *