Каскадное подключение LED матриц 8х8

10.10.2016 19:28

jazon



Продолжаем цикл статей про светодиодные LED матрицы 8х8, для тех кто что то пропустил - приведу ссылки на предыдущие статьи:


  1. Статья первая. Первое знакомство с LED матрицами 8х8.
  2. Статья вторая. Создание простейшего шрифта для LED матрицы 8х8.


Итак, в этой статье я покажу как подключить несколько LED матриц при помощи так называемого каскадного подключения. В общем то всё просто - нужно соединить последовательно проводами контакты на матрицах, как показано на схеме. При этом нумерация матриц будет начинаться слева направо, то есть крайняя левая матрица будет по умолчанию пронумерована адресом 0, следующая за ней адресом 1, 2, 3 и так далее. На нижеприведённой схеме показано всё это подробно, как видите, никаких сложностей не должно возникнуть.  



Зальём скетч в плату Arduino Nano, программа  которая будет вести счет и визуализировать числа счетчика от 0 до 999. Скетч достаточно хорошо прокомментирован:

#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, 3);

//Время между сменой анимации цифры
const int delayTime = 200;

//Счетчик от 0 до 999 - нам хватит трёх матриц
//соответсвенно число будет трёхразрядным
//Первый разряд(десятые) - крайняя правая матрица
static int value1 = 0;
//Второй разряд(сотые) - средняя матрица
static int value2 = 0;
//Третий разряд(тысячные) - крайняя левая матрица
static int value3 = 0;

//Объявляем прототип функции Counter()
//эта функция будет обрабатывать значения счетчиков для матриц
void Counter();

void setup() 
{
  //Создаём переменную для хранения количества устройств на шине SPI
  //которое мы указали при создании объекта matrix класса LedControl
  //в нашем случае это три устройста
  //Функция getDeviceCount() вернёт указанное количество устройств 
  int numDevices = matrix.getDeviceCount();

  //Проведём инициализацию устройств в цикле for
  for(int address = 0; address < numDevices; address ++)
  {
    //Устройству с адресом "address" на SPI шине выйти из спящего режима по умолчанию
    matrix.shutdown(address, false);
    //Установить яркость Led матрицы на 8 из 15      
    matrix.setIntensity(address, 8); 
    //Очистить дисплей
    matrix.clearDisplay(address);
  }
}

//Объявляем массив из 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() 
{
  Counter();
  
  //Проведём повторное считывание количества устройств
  int numDevices = matrix.getDeviceCount();
  for(int address = 0; address < numDevices; address ++)
  {
    for(int i = 0; i < 8; i ++)
    {
      if(address == 2)
      {
        //Для крайней правой матрицы - десятые
        matrix.setRow(address, i, CountDigits[value1][i]);
      }
      if(address == 1)
      {
        //Для средней матрицы - сотые
        matrix.setRow(address, i, CountDigits[value2][i]);
      }
      if(address == 0)
      {
        //Для крайней левой матрицы - тысячные
        matrix.setRow(address, i, CountDigits[value3][i]);
      }
    }
  }
  delay(delayTime);
}

void Counter()
{
  if(value1 >= 9)
  {
    value1 = 0;
    if(value2 >= 9)
    {
      value2 = 0;
      if(value3 >= 9)
      {
        value3 = 0;
      }
      else
      {
        value3 ++;
      }
    }
    else
    {
      value2 ++;
    }
  }
  else
  {
    value1 ++;
  }
}


В результате на видео можно наблюдать работу программы, для каскадного подключения LED матриц 8x8.

 





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

Сообщение

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