Опубликовано: 02.11.2016 19:46
Автор: jazon
На этот раз, в статье будет рассмотрен один из интереснейших модулей, а именно - многоразрядный семисегментный индикатор на базе микросхемы MAX7219. Почему многоразрядный? Ответ прост - количество разрядов это и есть количество цифр, которое может отобразить модуль. Например, на фото ниже, показаны три вида многоразрядных индикаторов, слева направо - 4-х разрядный, 6-ти разрядный, 8-ми разрядный. Причем первый является 4-х разрядным индикатором часового типа. Отличие индикатора часового типа от обычного в том, что у него есть знак двоеточия, тогда как у обычного любого индикатора этот знак заменяется точкой внизу, рядом с цифрой.
В этой статье, рассматриваемые модули работают на базе микросхемы MAX7219. Эта микросхема является драйвером для светодиодных семисегментных индикаторов, а также LED матриц 8х8, и мы не будем рассматривать принципиальные схемы подключения этого драйвера. Просто за основу взят готовый модуль, будут приведены примеры подключения к плате Arduino UNO и разобрана работа с функциями библиотеки LedControl. Кстати, как уже было сказано - LED матрицы 8х8 тоже работают на базе драйвера MAX7219, и кому интересно то добро пожаловать в статьи:
Итак, начнем... Думаю что про многоразрядность было дано хорошее описание, а вот почему семисегментный? Ответ тоже не так уж и сложен - потому что для формирования символа или отображения цифры используется семь светодиодов, проиндексированных буквами A, B, C, D, E, F, G, таблица ниже показывает как это обозначено:
Как видно из таблицы, есть также и восьмой светодиод - DP. Полностью закодировать символ или цифру можно в 1 байте, устанавливая или сбрасывая определенный бит, как это показано с примером кодирования символа J. В примере установлены биты B, C, D, E, что позволяет отобразить заданный символ на семисегментном индикаторе.
От теории к практике - подключим 8-ми разрядный модуль к плате Arduino Uno по указанной ниже схеме:
Для отображения символов используется несколько функций из подключаемой библиотеки LedControl.h. Разберем каждую из этих функций по порядку, начнем с функции setDigit().
Прототип объявления функции для отображения числа и передаваемые функции аргументы:
setDigit(int addr, int digit, byte value, boolean dp);
Где -
int addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)
int digit - порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0, а номер крайнего левого разряда в нашем случае равен 7
byte value - значение(число от 0 до 9) которое нужно отобразить в разряде номер которого указан в параметре int digit
boolean dp - этот параметр отвечает за отображение точки у разряда номер которого указан в параметре int digit. Если параметр равен true то точка отобразится, если false то точка не отобразится.
Прототип объявления функции для отображения символа и передаваемые функции аргументы:
setChar(int addr, int digit, char value, boolean dp);
int addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)
int digit - порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0, а номер крайнего левого разряда в нашем случае равен 7
char value - символ, который должен отобразиться в разряде номер которого задан параметром int digit
boolean dp - этот параметр отвечает за отображение точки у разряда номер которого указан в параметре int digit. Если параметр равен true то точка отобразится, если false то точка не отобразится.
Отдельным моментом стоит упомянуть, что функция setChar() может отобразить только ограниченный набор символов, таких как:
В тестовом скетче можно поставить задачу такого плана:
Из-за ограниченного набора символов функция setChar() не подходит для тестового скетча, так как она не сможет нормально отрисовать фразу указанную в пункте 3. Вместо этой функции мы будем использовать функцию setRow(). Итак... функция setRow() уже была нами испытана в в статьях про изучение Led матриц 8х8, давайте вновь опишем прототип вызова и параметры данной функции.
Прототип объявления функции setRow() и передаваемые функции аргументы:
setRow(int addr, int row, byte value);
Где -
int addr - адрес модуля на шине SPI для которого вызывается функция, если модуль один - то этот параметр равен 0 (по умолчанию адресация устройств на шине SPI начинается с нуля)
int row - порядковый номер разряда в модуле индикации, по умолчанию для многоразрядных индикаторов нумерация разрядов начинается с крайнего правого разряда, соответственно номер крайнего правого разряда равен 0, а номер крайнего левого разряда в нашем случае равен 7
byte value - значение в двоичном формате(пример B00000000, также возможна альтернатива в десятичном и шестнадцатиричном), которым закодирован необходимый символ. Таблица кодирования символов поможет правильно закодировать нужный символ.
Ну и в завершение статьи тестовый скетч и видео, как это работает:
#include "LedControl.h"
/*
* Подключаем библиотеку LedControl.h
* и создаём объект класса LedControl
* при этом, 7-ми сегметный дисплей с драйвером MAX72xx
* должен быть подключен к плате Arduino следующим образом:
* Arduino[Pin 5V] -> Display Module MAX72xx[VCC]
* Arduino[PinGND] -> Display Module MAX72xx[GND]
* Arduino[Pin 12] -> Display Module MAX72xx[DIN]
* Arduino[Pin 11] -> Display Module MAX72xx[CLK]
* Arduino[Pin 10] -> Display Module MAX72xx[LOAD/CS]
*
*/
LedControl lc = LedControl(12, 11, 10, 1);
//Массив с закодированными символами,
//Фраза "Arduino ruLES!!!"
byte ar[15] =
{
B01110111, //A
B00000101, //r
B00111101, //d
B00011100, //u
B00010000, //i
B00010101, //n
B00011101, //o
B00000101, //r
B00011100, //u
B00001100, //l
B01001111, //E
B01011011, //S
B10110000, //!
B10110000, //!
B10110000 //!
};
void setup()
{
//Устройство(7-ми сегментный дисплей) выводим из спящего режима
lc.shutdown(0, false);
//Установить яркость дисплея на 8
//Всего возможных режимов яркости от 0 до 15
lc.setIntensity(0,8);
//Очистить дисплей
lc.clearDisplay(0);
}
void loop()
{
//Простейший перебор чисел от 1 до 8 по разрядам
for(int i = 0, j = 7; i < 8, j >= 0; i++, j--)
{
lc.setDigit(0, j, byte(i + 1), false);
delay(400);
lc.clearDisplay(0);
}
//Перебор чисел без очистки экрана
for(int i = 0, j = 7; i < 8, j >= 0; i++, j--)
{
lc.setDigit(0, j, byte(i + 1), true);
delay(400);
}
lc.clearDisplay(0);
//Отрисовка фразы "Arduino ruLES!!!"
int n = 0;
for(int i = 0; i < 2; i ++)
{
for(int j = 7; j >= 0; j --)
{
if(n > 6 && !(i % 2))
{
continue;
}
else
{
lc.setRow(0, j, ar[n]);
delay(400);
n ++;
}
}
lc.clearDisplay(0);
}
delay(400);
lc.clearDisplay(0);
}
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.