Работаем с библиотекой LedControl — разбор функций и примеры применения

Содержание

В этой статье мы решили дать полную обзорную информацию по библиотеке LedControl.h и разобрать примеры использования её функций. Эта библиотека была написана для работы с микросхемами MAX7219 и MAX7221 . Многим программистам — электронщикам которые занимаются с платформой Arduino всегда было интересно, как включаются массивы светодиодов заключенные в одну матрицу, как анимировать матрицы, как управлять семисегментными многоразрядными дисплеями. Используя библиотеку LedControl , мы получаем отличный инструмент для работы с упомянутыми устройствами. На нашем сайте уже было несколько интересных статей, в которых в той или иной мере мы работали с этой библиотекой, ниже в конце статьи будут ссылки на них. А здесь мы постараемся обобщить пройденный материал, и закрепить знания полученные в работе с этой библиотекой.

Создание объекта LedControl.

Пора начинать. А начнем мы с того, что создадим объект класса LedControl . Типичный код инициализации библиотеки будет выглядеть следующим образом:

Вообще, при подключении устройств с драйвером MAX72xx можно использовать любые пины на плате Arduino , но так как есть входы/выходы которые используются для последовательного соединения(пины 0 и 1 ), а также порты которые имеют в своей связке светодиодный индикатор(пин 13 ), то лучше избегать подключения к этим портам выбрав любые другие доступные. Также, порты указанные в объявлении объекта класса, не нужно инициализировать функцией pinMode() в разделе setup() программы, библиотека LedControl при создании объекта класса сама проинициализирует эти порты нужным образом.

Четвертый параметр — int numDevices , является количеством устройств с драйвером MAX72xx подключенных к одной шине каскадом. Одному объекту класса LedControl можно адресовать до 8 устройств, при этом, чем больше устройств на шине, тем соответственно ниже её производительность. Для параметра numDevices разрешены только значения от 1 до 8 включительно, поскольку одному объекту класса LedControl нельзя адресовать свыше 8-ми устройств.

Если необходимо управлять более восемью устройствами на базе драйвера MAX72xx , то можно создать еще несколько объектов класса LedControl . Для этого нужно использовать другую группу контактов подключения устройства, отличную от первого объекта класса LedControl . Например вот так:

Как видно из примера, для подключения следующего каскада устройств(объект LC2 ), используется следующая группа контактов, отличная от тех, которыми проинициализирован объект LC1 .

Инициализация устройств на базе драйвера MAX72xx.

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

Функция shutdown() — это функция отключения энергосберегающего режима, светодиоды потребляют много энергии, это может оказаться критичным, если полностью собранное устройство будет работать от батареек. Функция shutdown() может отключить дисплей или матрицу когда нужно будет перевести устройство в энергосберегающий режим, либо включить — когда нужно будет вывести устройство из энергосберегающего режима, либо отобразить какие-либо данные. Прототип вызова функции:

LC1.shutdown(int address, bool set);

  • LC1 — это объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx
  • bool set — параметр принимающий два значения, если set = false то это означает выход из энергосберегающего режима и отображения данных, если set = true устройство переходит в спящий режим.

В данном примере при вызове функции shutdown() мы указываем, что объекту LC1 класса LedControl , адресовано всего одно устройство на базе драйвера MAX72xx , адрес которого равен 0 , при этом второй параметр равен false , значит устройство должно быть выведено из энергосберегающего режима. Важно знать, что адресация устройств начинается с 0 , а заканчивается адресом равным 7 .

Следующая функция setIntensity() — устанавливает яркость свечения сегментов, либо светодиодов(смотря что подключено дисплей или матрица). Прототип вызова функции:

LC1.setIntensity(int address, int brightness);

  • LC1 — это объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx
  • int brightness — этот параметр устанавливает яркость свечения сегментов, либо светодиодов. Может принимать значения от 0 до 15 , при этом если значение будет равно 0 , то яркость свечения будет установлена на минимальный уровень, а если значение равно 15 , то яркость свечения будет максимально возможной. В примере, приведённом выше, этому параметру присваивается значение 8 , что позволит установить свечение средней интенсивности. Интересной особенностью является то, что при установке на минимальный уровень свечения, сегменты(либо светодиоды) не погаснут, их свечение будет видно, хоть и очень тускло. Энергопотребление останется на том же уровне, и чтобы окончательно погасить свечение используется вышеописанная функция shutdown() .

Функция clearDisplay — очищает дисплей(либо матрицу), с указанным адресом. Прототип вызова функции:

  • LC1 — это объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx

Здесь даётся указание очистить дисплей(либо матрицу) для устройства на базе драйвера MAX72xx , с адресом 0, адресованного объекту LC1 класса LedControl .

Инициализация устройств при каскадном подключении.

При инициализации устройств на базе драйвера MAX72xx (если они подключены каскадом), в разделе setup() имеет смысл использовать функцию getDeviceCount() для получения количества устройств на шине, это позволит инициализировать устройства динамически. Функция не принимает никаких параметров, но при этом возвращает целочисленное значение( тип int ), которое хранит количество подключенных устройств на базе драйвера MAX72xx , адресованных объекту класса LedControl . Ниже приведен пример динамической инициализации в цикле for для 5-ти устройств, адресованных объекту LC класса LedControl .

В дополнение — ссылка на статью, в которой приведён пример каскадного подключения устройств на базе драйвера MAX72xx:

Управление LED матрицами 8×8

Включение/выключение одного светодиода на матрице

Управление LED матрицами 8х8 осуществляется, всего лишь тремя функциями. И начнем мы с функции, которая управляет каждым светодиодом на матрице индивидуально. Итак, функция setLed() , и прототип её вызова:

LC1.setLed(int address, int row, int column, boolean state);

  • LC1 — это объект класса LedControl .
  • int address — адрес устройства на базе драйвера MAX72xx
  • int row — ряд светодиодов LED матрицы 8х8, нумерация рядов начинается с 0 а заканчивается 7 .
  • int column — столбец светодиодов LED матрицы 8х8, нумерация столбцов начинается с 0 а заканчивается 7 .
  • boolean state — состояние светодиода( true — включен, false — выключен), именно этот параметр отвечает за включение отдельно взятого светодиода.

Что же представляют собой ряды и столбцы LED матрицы 8×8? На схеме ниже изображена LED матрица 8х8, с одним закрашенным кружочком, это и есть зажженный светодиод, на втором ряду и седьмом столбце (2,7) .

Пример скетча в данном случае будет таким:

В примере видно, что вызов функции setLed() осуществляется в теле основной функции loop() программы. Светодиод на 2-ом ряду и 7-ом столбце матрицы включается и через полсекунды выключается, затем всё повторяется снова. Ну и в дополнение — ссылка на интересную статью, в которой эта функция используется более расширенно, реализация анимации бегущего огонька с примерами и обзорным видео:

Включение ряда светодиодов на LED матрице 8х8

Для включения ряда светодиодов на LED матрице 8×8 применяется функция setRow(). Функция позволяет использовать значение переменной с типом данных byte , для зажигания ряда светодиодов на матрице. Прототип вызова функции:

LC.setRow(int address, int row, byte value);

  • LC — объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx
  • int row — номер ряда на LED матрице 8×8(нумерация рядов начинается с 0 , а заканчивается 7 )
  • byte value — переменная(тип данных byte), значение которой будет включать определённые светодиоды в ряду LED матрицы 8×8. Эта переменная может быть проинициализирована значением следующего формата — B10110000 , означающего, что B — это формат записи для двоичного представления числа и 8 значений состояния, для ряда из 8-ми светодиодов. Если какое-либо значение равно 1 то включить светодиод, если же 0 то выключить. В данном примере, включатся 0-й, 2-й и 3-й светодиоды в ряду, остальные останутся выключенными.

Ниже приведена схема, показывающая LED матрицу 8х8, на которой во 2-м ряду включены 0-й, 2-й и 3-й светодиоды(они закрашены синим), остальные же выключены.

Пример скетча для включения ряда светодиодов:

Более интересный эффект даёт использование данной функции в теле цикла for . Это позволяет динамически отрисовывать различные пользовательские шрифты, пиктограммы и другие анимации. Пример использования функции setRow() в теле цикла for раскрывает следующая статья:

и инструментарий который можно использовать для создания шрифтов и пиктограмм:

Включение столбца светодиодов на LED матрице 8х8

Почти что идентичная предыдущей, функция setColumn() , которая позволяет зажечь столбец светодиодов на LED матрице 8×8. Прототип вызова функции:

LC.setColumn(int address, int column, byte value);

  • LC — объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx
  • int column — номер столбца(нумерация столбцов, как и строк, начинается с 0 , заканчивается 7 )
  • byte value — переменная(тип данных byte), значение которой будет включать определённые светодиоды в столбце LED матрицы 8×8. Эта переменная может быть проинициализирована значением следующего формата, к примеру — B00000111 , означающего, что B — это формат записи для двоичного представления числа и 8 значений состояния, для столбца из 8-ми светодиодов. Если какое-либо значение равно 1 то включить светодиод, если же 0 то выключить. В данном примере, включатся 5-й, 6-й и 7-й светодиоды в столбце, остальные останутся выключенными.

Ниже приведена схема, показывающая LED матрицу 8х8, на которой в 0-м столбце включены 5-й, 6-й и 7-й светодиоды(они закрашены синим), остальные же выключены.

Пример скетча для включения ряда светодиодов:

Важно. О производительности.
Есть одно различие в работе функций setRow() и setColumn(), а именно в том как обновляется включение светодиодов в матрице при использовании этих функций. Функция setRow(
int address, int row, byte value ) в качестве параметра которым адресуется ряд, принимает одно целочисленное значение и по нему включает ряд светодиодов. Функция setColumn() использует функцию setLed() так сказать внутри своего тела, чтобы каждый раз включить/выключить светодиод в столбце.То есть, при обработке значения, которым будет проинициализирован столбец, внутри функции setColumn() будет восемь раз вызвана функция setLed(), которая в свою очередь включит/выключит каждый светодиод в столбце индивидуально. При каскадном подключении одного или двух устройств, это не будет заметно визуально. Но если включать каскадно длинные светодиодные табло, либо экраны(в таком случае количество подключенных устройств может быть от 6-и до 8-ми), то уже будет заметна визуальная задержка отрисовки пользовательских анимаций.

Управление семисегментными дисплеями

Здесь мы рассмотрим две стандартные функции для отрисовки символов и цифр на 7-ми сегментных дисплеях, а также рассмотрим нестандартное применение функции setRow() в качестве визуализации для пользовательских символов. Итак, по БЕЛАЗам.

Управление отрисовкой цифр

В основном, 7-ми сегментные дисплеи применяются для отображения каких — либо цифровых данных. Первая рассматриваемая нами функция будет заниматься именно отображением числовых символов. Функция setDigit() применяется именно при использовании 7-ми сегментных дисплеев, и прототип её вызова выглядит так:

LC.setDigit(int address, int digit, byte value, boolean dp);

  • LC — объект класса LedControl
  • int address — адрес устройства на базе драйвера MAX72xx
  • int digit — порядковый номер разряда на 7-ми сегментном дисплее. Обычно 7-ми сегментные дисплеи содержат от 2-х до 8-ми разрядов, такие дисплеи считаются многоразрядными. Почему многоразрядные? Потому что количество разрядов, это и есть количество цифр, которое может отобразить дисплей. Нумерация разрядов в 7-ми сегментном дисплее начинается с 0 и заканчивается максимальным количеством разрядов(то есть бывают и 4-х разрядные и 6-ти разрядные), порядковый отсчет разрядов начинается с крайнего правого, то есть крайний левый будет самым старшим разрядом с наибольшим порядковым номером.
  • byte value — переменная( тип данных byte ) которая может принимать значения от 0 до F , отображение цифр на 7-ми сегментных дисплеях идет в шестнадцатиричной системе, то есть используя определенный разряд можно отобразить числовые значения от 0 до 9 в привычной нам десятичной системе, но значения от 10 до 15 будут отображаться уже в шестнадцатиричном формате от A до F .
  • boolean dp — управление отображением точки, на самом деле один разряд содержит не только 7 сегментов для построения отрисовки определённой цифры, но также присутствует и восьмой сегмент в виде точки. Параметр dp как раз и отвечает за включение этого сегмента true — включен, false — выключен.

В целом, один драйвер MAX72xx может управлять максимум восемью разрядами на дисплее. Пример программного кода, для отображения цифры 6 в пятом разряде 7-ми сегментного дисплея:

А также полезная статья на эту тему:

Управление отрисовкой символов, а также нестандартное применение функции setRow().

Отображением символов управляет функция setChar() , но к сожалению она может отобразить лишь определенный набор символов. таких как:

  • 0 1 2 3 4 5 6 7 8 9цифра отображается как символ
  • A aсимвол отобразится в верхнем регистре
  • B bсимвол отобразится в нижнем регистре
  • С ссимвол отобразится в нижнем регистре
  • D dсимвол отобразится в нижнем регистре
  • E eсимвол отобразится в верхнем регистре
  • F fсимвол отобразится в верхнем регистре
  • H hсимвол отобразится в нижнем регистре
  • L lсимвол отобразится в верхнем регистре
  • P pсимвол отобразится в верхнем регистре
  • знак минус
  • . ,отображение точки
  • _символ подчеркивания
  • Пробелустановить символ пробела

Прототип вызова функции setChar() выглядит так:

LC.setChar(int addr, int digit, char value, boolean dp);

  • LC — объект класса LedControl
  • int addr — адрес модуля на базе драйвера MAX72xx
  • int digit — порядковый номер разряда на 7-ми сегментном дисплее
  • char value — символ из ограниченного набора, который нужно отобразить
  • boolean dp — управление отображением точки

Итак мы видим, что скорее всего, тот набор символов что даётся по умолчанию к этой функции, будет недостаточно полным, ведь на самом деле можно придумать еще. Вот здесь и начинается нестандартное применение функции setRow() , а применять мы её будет в связке с генератором символов для 7-ми сегментных дисплеев. Для примера нужно перейти по ссылке, на странице видна интерактивная форма с сегментами, кликая по которым можно отрисовать нужный символ. В окне результата справа, появится двоичный(бинарный) код отрисованного символа, его можно скопировать в буфер обмена. Кстати, можно также воспользоваться кликабельными примерами символов, которые находятся в форме ниже. Далее, нужно лишь вызвать функцию setRow() передав ей в качестве параметра byte value содержимое буфера обмена. И всё же неплохо уточнить прототип вызова функции setRow() именно для отрисовки символов для 7-ми сегментных дисплеев:

LC.setRow(int address, int digit, byte value);

  • LC — объект класса LedControl
  • int adress — адрес устройства на базе драйвера MAX72xx
  • int digit — в данном случае этот параметр указывает на порядковый номер разряда 7-ми сегментного дисплея
  • byte value — значение которое будет скопировано из буфера обмена вышеуказанным способом, то есть после формирования генератором символов.

Ну что же, в завершение можно дать ссылку на еще одну статью, а именно по теме нестандартного использования функции setRow() , и вообще началу работы с 7-ми сегментными дисплеями на базе драйвера MAX72xx :

Библиотеку LedControl.h можно скачать здесь.

Если вам понравилась эта статья — комментируйте, оставляйте свои пожелания и критику, задавайте вопросы и предлагайте свои темы.


Источник: arduino.on.kg