Создание простейшего шрифта для LED матрицы 8х8

07.10.2016 19:35

jazon



Итак, продолжим изучение возможностей светодиодных LED матриц 8х8. В этой статье мы рассмотрим следующую функцию из библиотеки LedControl которая называется setRow(). Также попутно рассмотрим создание простейшего шрифта, состоящего полностью из цифр, чтобы в дальнейшем применить этот шрифт для визуализации счетчика, который мы создадим в конце этой статьи.


Синтаксис вызова функции setRow() имеет вид:

matrix.setRow(address, row, value);

Где matrix - объект класса LedControl

  • address - номер, или адрес устройства(LED матрицы) на шине SPI, в нашем случае будет равен нулю, так как устройство одно.
  • row - ряд на LED матрице.
  • value - значение(тип данных byte) которым заполнится ряд.

Нужно уточнить, что отсчет рядов на LED матрице начинается сверху, то есть самый верхний ряд светодиодов будет нулевым рядом, а самый нижний будет 7-м рядом. Для примера можно создать скетч, который будет выводить на LED матрицу цифру 5. Но прежде всего, нужно понять какие светодиоды будут визуализировать эту цифру. Для этого на сайте есть замечательный "Редактор символов для матриц 8х8", перейдя по ссылке, можно создать свой символ просто кликая по полю 8х8, либо выбрать готовый символ из таблицы ниже. Воспользуемся вторым вариантом, выберем символ "5" из предложенной таблицы. 


Выбранный символ отобразится в левой таблице обозначающей поле матрицы, в правой таблице будет лежать значение массива байт, которые мы скопируем и укажем в качестве аргумента value в вызове функции setRow().



Итак, пришло время создать тестовый скетч для функции setRow(). Собственно говоря, функция просто заполняет по рядам значения массива байт customChar[8]. Кстати, если непонятно как подключать LED матрицу к плате Arduino, то добро пожаловать в предыдущую статью, которая называется "Первое знакомство с LED матрицами 8х8".


#include "LedControl.h"

//Синтаксис создания класса LedControl(dataPin,clockPin,csPin,numDevices)
//Где LedControl - объект класса
//dataPin  - пин на плате Arduino к которому будет подключен пин DIN
//clockPin - пин на плате Arduino к которому будет подключен пин CLK
//csPin    - пин на плате Arduino к которому будет подключен пин CS
//numDevices - количество устройств на шине

//Создать объект класса matrix в нашем случае с одним подключенным устройством
LedControl matrix = LedControl(12, 11, 10, 1);

void setup() 
{
  //Устройству с адресом 0 по SPI интерфейсу выйти из спящего режима по умолчанию
  matrix.shutdown(0, false);
  //Установить яркость Led матрицы на 8 из 15      
  matrix.setIntensity(0, 8); 
  //Очистить дисплей
  matrix.clearDisplay(0);
}

byte customChar[8] = {0b00011111, 
                      0b00011000, 
                      0b00011110, 
                      0b00000011, 
                      0b00000011, 
                      0b00011011, 
                      0b00001110,   
                      0b00000000};
void loop() 
{
  for(int i = 0; i < 8; i ++)
  {
    //0 - адрес, либо номер устройства на шине SPI
    //i - текущий ряд на матрице
    //customChar[i] - значение(byte) которым заполнится ряд
    matrix.setRow(0, i, customChar[i]);
  }
}


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



С помощью редактора символов, можно создавать любые символы, можно создавать также и картинки, размерностью 8х8, всё ограничивается лишь фантазией разработчика. В довершение статьи можно в качестве примера сделать счетчик от 0 до 9, с интервалом примерно в одну секунду. Используя редактор символов, создадим 10 символов от 0 до 9, объявим массив CountDugits[10][8].

Вот собственно сам скетч:

#include "LedControl.h"

//Синтаксис создания класса LedControl(dataPin,clockPin,csPin,numDevices)
//Где LedControl - объект класса
//dataPin  - пин на плате Arduino к которому будет подключен пин DIN
//clockPin - пин на плате Arduino к которому будет подключен пин CLK
//csPin    - пин на плате Arduino к которому будет подключен пин CS
//numDevices - количество устройств на шине

//Создать объект класса matrix в нашем случае с одним подключенным устройством
LedControl matrix = LedControl(12, 11, 10, 1);

void setup() 
{
  //Устройству с адресом 0 по SPI интерфейсу выйти из спящего режима по умолчанию
  matrix.shutdown(0, false);
  //Установить яркость Led матрицы на 8 из 15      
  matrix.setIntensity(0, 8); 
  //Очистить дисплей
  matrix.clearDisplay(0);
}

//Объявляем массив из 10-ти символов
//Каждый символ включает в себя массив из 8-ти байт
//закодированных числом в шестнадцатиричном коде  
byte CountDigits[10][8] = 
{
  {0xe, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0xe, 0x0},  //0
  {0x2, 0x6,  0xe,  0x6,  0x6,  0x6,  0x6, 0x0},  //1
  {0xe, 0x1b, 0x3,  0x6,  0xc,  0x18, 0x1f,0x0},  //2
  {0xe, 0x1b, 0x3,  0xe,  0x3,  0x1b, 0xe, 0x0},  //3
  {0x3, 0x7,  0xf,  0x1b, 0x1f, 0x3,  0x3, 0x0},  //4
  {0x1f,0x18, 0x1e, 0x3,  0x3,  0x1b, 0xe, 0x0},  //5
  {0xe, 0x1b, 0x18, 0x1e, 0x1b, 0x1b, 0xe, 0x0},  //6
  {0x1f,0x3,  0x6,  0xc,  0xc,  0xc,  0xc, 0x0},  //7
  {0xe, 0x1b, 0x1b, 0xe,  0x1b, 0x1b, 0xe, 0x0},  //8
  {0xe, 0x1b, 0x1b, 0xf,  0x3,  0x1b, 0xe, 0x0}   //9
};

void loop() 
{
  for(int j = 0; j < 10; j ++)
  {
    for(int i = 0; i < 8; i ++)
    {
      //0 - адрес, либо номер устройства на шине SPI
      //j - индекс массива байт с символом
      //i - текущий ряд на матрице
      //CountDigits[i] - значение(byte) которым заполнится ряд
      matrix.setRow(0, i, CountDigits[j][i]);
    }
    delay(1000);
  }
}


На видео ниже - результат работы скетча, счетчик от 0 до 9 с интервалом в одну секунду:





Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.