Всем привет, этот материал посвящен такой теме как бегущая строка. Многие из вас видели такие яркие образцы, порой красивые, а порой и вырвиглазные рекламные стенды, подвешенные над магазинами, бутиками и прочим урбанистическим антуражем.

         Сразу возникает вопрос - а зачем мы подняли именно эту тему? Ведь данная тематика уже давно можно сказать избита и изучена, тем более в совокупности с Arduino. Но у нас особый случай - в этой статье мы продемонстрируем бегущую строку для семисегментного дисплея на базе драйвера MAX7219. И если сравнивать бегущие строки на матричном светодиодном дисплее и на семисегментном дисплее, то последняя не менее красива, и в чем то даже более привлекательна чем сгенерированная на матрице. Ну что же от слов к делу - далее нас ждет схема подключения дисплея MAX7219, хорошо прокомментированный скетч, и в конце статьи обзорное видео, в котором можно будет увидеть как в реальности работает бегущая строка. Что нам понадобится:

         Далее - схема подключения дисплея к плате Arduino:

 

 

         Скетч, достаточно хорошо прокомментирован, проблем к пониманию и освоению возникнуть не должно:

#include "LedControl.h"

/*Константы для пинов подключения дисплея*/
#define DATA_IN 13
#define CLK 12
#define LOAD_CS 11
#define NUM_DEV 1
#define DISP_ADDR 0

LedControl Display = LedControl(DATA_IN, CLK, LOAD_CS, NUM_DEV);

/*Строки выводимые на дисплей*/
byte String1[9] = {0x7E, 0x79, 0x77, 0x67, 0x5, 0x6D, 0x7E, 0x30, 0x7F};
byte String2[8] = {0x00, 0x00, 0x6D, 0xED, 0x79, 0xDB, 0x5B, 0x30};
byte String3[8] = {0x00, 0x00, 0x00, 0x00, 0x6D, 0x79, 0x63, 0x4E};

//Меняя эту константу можно регулировать скорость прокрутки
const int delayScrolling = 300;

void setup()
{
  /*Выводим дисплей из спящего режима*/
  Display.shutdown(DISP_ADDR, false);
  /*Устанавливаем яркость свечения сегментов*/
  /*Доступные значения от 0 до 15*/
  Display.setIntensity(DISP_ADDR,8);
  /*Очищаем дисплей*/
  Display.clearDisplay(DISP_ADDR);
}

void loop()
{
  //Отправляем указатель на проинициализированный символьный массив
  //в качестве первого параметра функции для прокрутки сообщений
  //второй параметр - это размер символьного массива
  //третий параметр - задержка сдвига(прокрутки влево) в миллисекундах
  //msgScrolling(String1, sizeof(String1), delayScrolling);
  //msgScrolling(String2, sizeof(String2), delayScrolling);
  msgScrolling(String3, sizeof(String3), delayScrolling);
}

//Здесь собственно сама функция для прокрутки готовых сообщений
//справа - налево
/*
  * Параметры:
  * byte msg[] - указатель на массив символьных данных
  * int msgSize - размер массива символьных данных
  * int dScroll - задержка прокрутки(сдвига сообщения влево)
  * в миллисекундах
*/
void msgScrolling(byte msg[], int msgSize, int dScroll)
{
  for(int i = 0; i < 8 + msgSize; i ++)
  {
    for(int n = i, j = 0; n >= 0, j < msgSize; n --, j ++)
    {
      Display.setRow(0, n, msg[j]);
      Display.setRow(0, n - 1, B00000000);
    }
    delay(dScroll);
  }
}

         Итак, в скетче есть три сообщения, которые выводятся на дисплей посредством прокрутки справа налево(так сказать скроллятся). Можно добавить свои сообщения, предварительно сгенерировав символы в них, о том как это сделать есть соответствующая статья на нашем сайте. Сообщения могут быть любой длины в байтах, главное не забывать указывать их количество при инициализации. После загрузки скетча в контроллер, на дисплее можно наблюдать следующую анимацию, смотрите обзорное видео:

 

 

 

        Как вы уже наверное догадались, данную функцию скроллинга, мы используем в построении наших часов, всего в наших часах будет четыре вида анимации - одиночное сообщение(с выбранным к показу параметром - дата, время, либо температура), сменяющие по очереди друг друга сообщения, развёртывание сообщений(также, по очереди), ну и конечно же прокрутка сообщений справа налево. Получается так, что эта статья стала прологом к десятому шагу построения часов. На этапе десятого шага как раз и будут рассмотрены все вышеописанные анимации включая конечно же скроллинг(бегущую строчку). Ну а всем тем, кто еще не читал предыдущие шаги - добро пожаловать в их прочтение, ссылки на них размещены ниже, в порядке возрастания, читайте, изучайте, может быть даже откроете для себя что то новое.