Arduino:Библиотеки/LedControl

Материал из Онлайн справочника
Версия от 12:23, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Библиотека LedControl[1][2]

Автор библиотеки – Эбехард Фэйл (Eberhard Fahle), и далее речь ведется от его лица.

Чипы MAX7221 и MAX7219 упрощают управление массивами из 64 светодиодов, а также восемью цифрами, сделанными из 7-сегментных дисплеев, требуя при этом минимальное количество электронных компонентов. Помимо чипа вам потребуется лишь один резистор, а также один-два конденсатора. Данные передаются чипу посредством SPI-совместимого протокола при помощи трех цифровых контактов Arduino. Если вы хотите управлять более чем восемью 7-сегментными дисплеями (или более чем 64 светодиодами), то чипы можно подсоединить посредством каскадного подключения. Поскольку библиотека LedControl поддерживает до восьми каскадно подключенных чипов, это позволяет индивидуально управлять 512 светодиодами, и для этого нужно по-прежнему всего три цифровых контакта Arduino.

Ниже – фотография пускай примитивного, но работающего тестового образца:

Если вам интересно, какой из этих двух чипов лучше подойдет для вашего проекта, то можно остановиться на том, что дешевле. Однако если вы планируете использовать не Arduino, а какой-то другой контроллер, то лучше воспользоваться более дорогим MAX7221, т.к. в нем реализован полноценный SPI-совместимый интерфейс. Впрочем, библиотека LedControl может работать с обоими чипами, и внешний вид для пользователя будет одним и тем же.

Все, что вас интересует о MAX7221 и MAX7219, можно найти в «даташитах» этих устройств. Я несколько раз буду ссылаться на них – к примеру, описывая функции библиотеки. Поэтому, перед тем как читать дальше, я бы все же советовал начать с чтения «даташитов».

Описание библиотеки

Эта библиотека – разумеется, не первая попытка написать код для Arduino и MAX7221, однако все прежние начинания были сосредоточены на управлении светодиодами, сгруппированными в некое подобие прямоугольной матрицы. Я, впрочем, обычно использую эти чипы для управления 7-сегментными дисплеями, поэтому мне понадобилась функция, которая позволяла бы показывать на этих дисплеях числа (десятичные и шестнадцатеричные) и ограниченный набор буквенно-цифровых символов.

Кроме того, я хотел написать код, который мог быть полезен более широкой аудитории, поэтому в библиотеке есть функции, позволяющие включать/выключать как отдельные светодиоды, так и группы светодиодов. На тот случай, если вы при работе с MAX72xx использовали библиотеки, которые используют библиотеку Sprite, то должен добавить, что библиотека LedControl не поддерживает спрайты, потому что они требуют слишком много памяти Arduino. Если добавить в скетч библиотеку LedControl, то на ATmega168 это будет «стоить» вам 1690 байт. Впрочем, если не только подключить библиотеку, но и использовать ее функции, то это число, разумеется, увеличится.

Вот пример скетча, в котором библиотека лишь подключается, но все ее функции остаются незадействованными:

//  Этот скетч не делает ничего (просто расходует память Arduino)
#include "LedControl.h"
void setup() {}
void loop() {}

Лично у меня (arduino0007 на Linux) этот скетч потребовал 5760 байт (с закоментированным #include – 4070 байт). Это чуть меньше, чем при использовании комбинации Matrix/Sprite, которая добавляет этому коду еще 2266 байт. Иногда, к слову, я задаюсь вопросом, каким образом библиотека Sprite расходует память контроллера. Неужели один лишь файл Sprite.h ответственен за 1,2 Кб из этих 2,2 Кб? Впрочем, при портировании на ControlLed скетчей, ранее использовавших Matrix/Sprite, могут возникнуть проблемы, поскольку ControlLed использует другую схему обращения к отдельным светодиодам. Эти проблемы, впрочем, решаемы, и об этом будет рассказано ниже. Причина, по которой я использую другую схему адресации – в том, что Matrix/Sprite использует при каждом изменении состояния светодиода дополнительный код. Поскольку вам все равно придется переписывать код при портировании с Matrix/Sprite на ControlLed, то я решил свалить эту нагрузку на вас (чтобы сэкономить немного байтов и улучшить производительность). Извините :)

Другие отличия между старым кодом и новым кодом, использующим ControlLed, обсуждаются в API-документации.

Создание экземпляра класса

Все функции библиотеки вызываются через переменную типа LedControl. Вот пример кода:

/* Подключаем библиотеку */
#include "LedControl.h"

/* 
 * Создаем новый экземпляр класса LedControl. 
 * Для SPI-интерфейса используем 10-ый, 11-ый и 12-ый контакты.
 * 12-ый контакт Arduino подключаем к 1-ому контакту 
 * (DATA IN) MAX7221. 11-ый контакт Arduino подключаем к 13-ому 
 * контакту (CLK) MAX7221. 10-ый контакт Arduino подключаем к 12-ому 
 * контакту (LOAD) MAX7221. 
 * К плате Arduino подключен только один чип MAX7221.
 */
LedControl lc1=LedControl(12,11,10,1);

Первый шаг очевиден – подключаем библиотеку LedControl. Затем создаем экземпляр класса LedControl, чтобы с его помощью «разговаривать» с чипом MAX7221. Чтобы инстанцинировать класс LedControl, нужно четыре аргумента. Первые три аргумента – это номера контактов, используемых для соединения между платой Arduino и (первым) чипом MAX72XX. Вы можете использовать любые цифровые IO-контакты Arduino, но некоторые из них также используются для последовательного соединения с другими девайсами или подключены к светодиоду (как правило, это касается 13-ого контакта). В этом примере я выбрал 12-ый, 11-ый и 10-ый контакты, однако это зависит, разумеется, от типа построения цепи. Библиотека LedControl никак не проверяет, подходят ли выбранные контакты для подключения или нет, поэтому если выбрать неправильные контакты, скетч просто не будет работать.

Вам не нужно задавать контакты для выходных данных или для инициализации девайсов – библиотека сделает все за вас. Просто укажите нужные контакты при создании экземпляра класса и занимайтесь другими делами. Четвертый аргумент – это количество чипов MAX72xx, каскадно подключенных к Arduino и использующих это SPI-соединение. Имея всего один экземпляр класса LedControl, можно работать с восемью чипами MAX72xx. Впрочем, с каждым новым MAX72xx, добавленным в цепь, будет немного снижаться производительность системы. Библиотека всегда использует одинаковое количество памяти, независимо от того, как много девайсов вы указали в этом аргументе. Кроме того, четвертый аргумент поддерживает лишь числа от 1 до 8, а при указании другого числа библиотека будет по умолчанию использовать число 8. Вот прототип для нового экземпляра класса LedControl:

/* 
 * Создаем новый контроллер.
 * Аргументы:
 * int dataPin    Контакт Arduino, по которому передаются данные.
 * int clockPin   Контакт для тактового сигнала.
 * int csPin      Контакт для выбора устройства, которому нужно передать данные.
 * int numDevices Количество устройств, которыми будет управлять этот экземпляр класса.
*/
LedControl(int dataPin, int clkPin, int csPin, int numDevices);

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

/* Подключаем библиотеку */
#include "LedControl.h"

// Создаем новый LedControl для восьми устройств... 
LedControl lc1=LedControl(12,11,10,8); 

// ...и еще один. Теперь мы можем управлять 1024 светодиодами. 
// Неплохо!  
// Второй LedControl должен использовать три других контакта Arduino. 
LedControl lc2=LedControl(9,8,7,8);

Очевидно, что два экземпляра класса LedControl не могут пользоваться одними и теми же контактами Arduino.

В библиотеке LedControl нет функции, позволяющей менять эти контакты (в том числе – менять местами). Кроме того, нет и функции, позволяющей считывать номера этих контактов. Дело в том, что все это зависит от используемого оборудования, поэтому наличие в библиотеке всех этих функций лишь привело бы к расходованию лишней памяти. Однако функция, позволяющая запросить максимальное число девайсов, подключенных к LedControl, пришлась бы весьма кстати – к примеру, в случае, если вам нужно пройтись по полному списку чипов MAX72xx, подключенных к LedControl. Ниже кусочек кода, который переключает все чипы MAX72xx из спящего режима в нормальный режим. Мы еще не обсуждали функцию shutdown(), но я думаю, это не будет препятствием к тому, чтобы разобраться, что здесь к чему.

#include "LedControl.h"

// Создаем новый экземпляр класса LedControl для пяти девайсов... 
LedControl lc1=LedControl(12,11,10,5); 
 
void setup() {
  for(int index=0;index<lc1.getDeviceCount();index++) {
      lc1.shutdown(index,false);
  }
}

Здесь мы пробегаемся по списку устройств при помощи переменной index, которая начинается со значения «0», а заканчивается getDeviceCount()-1 (в данном кусочке кода – от 0 до 4). Переменная index – это адрес каждого устройства. Этот адрес будет первым аргументом в любой функции, которая задает какое-либо свойство или значение для светодиода. Держите в уме, что getDeviceCount() пускай и возвращает количество подключенных устройств, однако адресом для первого устройства всегда будет «0», для второго – «1», а для последнего – getDeviceCount()-1. Вот прототип функции:

/*
 * Считывает количество устройств, подключенных к LedControl.
 * Возвращает:
 * int   Количество устройств, подключенных к LedControl.
*/
int LedControl::getDeviceCount();

Энергосберегающий режим

Горя, светодиоды требуют довольно много энергии, поэтому если ваш проект работает на батарее, то дисплей иногда имеет смысл выключать. В библиотеке LedControl есть специальная функция, позволяющая переводить MAX72xx в спящий режим: она выключит все светодиоды на дисплее, однако все необходимые данные будут сохранены в памяти чипа. Более того, во время спящего режима чип может как принимать данные, так и обрабатывать их. Таким образом, когда чип будет выведен из спящего режима, на дисплее будут показаны обновленные данные. Ниже пример «невидимого» обратного отсчета:

// Создаем новый экземпляр класса LedControl
LedControl lc=LedControl(...);

// выставляем начальную точку для обратного отсчета:
int i=9;
// печатаем ее на дисплей:
lc.setDigit(0,(byte)i,false);
// мы увидим цифру «9»:
delay(1000);
// теперь выключаем дисплей:
lc.shutdown(true);
// и начинаем «невидимый» обратный отсчет: 
while(i>1) {
    lc.setDigit(0,(byte)i,false);
    i--;
    delay(1000);
}
// когда дисплей включится, на дисплее будет «1», т.е.
// информация, обновившаяся во время работы спящего режима:
lc.shutdown(false);
lc.setDigit(0,(byte)i,false);
Вот прототип для функции shutdown():
/* 
 * Включаем у чипа энергосберегающий (спящий) режим:
 * Параметры:
 * int addr   Адрес дисплея, которому нужно передать команду.
 * boolean b  Если указать «true», устройство перейдет в спящий режим, 
 * а если «false», то оно будет работать в нормальном режиме.
*/
void shutdown(int addr, bool b);

Имейте в виду, что при включении Arduino чип MAX72xx всегда находится в спящем режиме.

Инициализация устройства

В «даташите» MAX72xx есть глава о настройках включения. Библиотека LedControl использует почти те же самые настройки:

  • Дисплей пуст
  • Устройство не декодирует присылаемые ему данные
  • Яркость выставлена на минимум
  • При запуске девайс начинает работать в энергосберегающем (спящем) режиме
  • У чипа активировано максимальное количество цифр

Запуск в энергосберегающем режиме пригодится, к примеру, если ваш проект работает на батарее, однако перед использованием устройство в любом случае надо будет включить. О том, как это сделать, читайте выше, в главе «Энергосберегающий режим», но за тем исключением, что функцию shutdown() нужно использовать в блоке setup().

Также обратите внимание, что библиотека активирует у чипа максимальное количество цифр, что отличается от дефолтных настроек MAX72xx. Более подробно читайте в следующем разделе «Ограничение количества цифр».

Ограничение количества цифр (ограничение развертки)

При создании нового LedControl на дисплее всех устройств будут активированы все восемь цифр. Таким образом, мультиплексор, управляющий цифрами, включит их на 1/8 секунды. Светодиод включается чаще, из чего следует, что он будет дольше находиться во включенном состоянии. Его выставить ограничение развертки на «4», это значит, что светодиод включится на 1/4 секунды. Следовательно, MAX72xx должен будет дольше подавать ток на устройство, управляющее этим сегментом.

Обязательно ознакомьтесь с соответствующим разделом в «даташите» чипа, потому что, выбрав плохой резистор, ограничивающий ток, что идет через светодиод, и количество показываемых цифр, вы можете попросту испортить MAX72xx. Единственная причина поменять ограничение развертки – это если экран выглядит слишком темным. Впрочем, в большинстве случаев это происходит из-за того, что вы просто не повысили яркость при запуске. Вот прототип для функции setScanLimit():


/* 
 * Задаем количество цифр (или рядов), показываемых на экране.
 * О том, как изменение этого значения повлияет на яркость, читайте
 * в «даташите». 
 * Параметры:
 * int addr  Адрес дисплея, которому нужно передать команду. 
 * int limit Количество показываемых цифр. Можно использовать лишь 
 * значения от «0» (только одна цифра) до «7» (все цифры).
 */
void setScanLimit(int addr, int limit);

Настройка яркости дисплея

Яркость дисплея определяется тремя факторами. Первый – это переменная Rset, которая ограничивает максимум тока, что может идти через светодиод. В «даташите» есть специальный раздел, помогающий выбрать для этой переменной правильное значение. Если сделать его слишком маленьким, есть вероятность, что светодиод будет тянуть слишком много тока, и MAX72xx просто не сможет с ним справиться.

Второй фактор – это ограничение развертки дисплея. В предыдущем разделе я писал, но здесь напоминаю, что рекомендую оставить это параметр таким, каким он был по умолчанию.

Впрочем, яркость дисплея можно настраивать и программно. Нижняя и верхняя границы яркости устанавливаются оборудованием – т.е. через Rset и setScanLimit() – в результате чего создается некоторый диапазон, которым можно управлять при помощи функции setIntensivity(). Но имейте в виде следующее:

  • Когда Max72xx только запускается, яркость выставлена на самое темное значение. Поэтому имеет смысл выделить в коде местечко для того, чтобы сделать это значение повыше (если вообще ничего не видно, почитайте раздел «Энергосберегающий режим»)
  • Если выставить самое низкое значение, это еще не значит, что экран будет полностью темным
  • Диапазон значений – от 0 (темно) до 15 (максимальная яркость). Любые другие значения будут игнорироваться

Вот прототип для этой функции:

/* 
 * Задаем яркость дисплея.
 * Параметры:
 * int addr      Адрес дисплея, которому нужно передать команду.
 * int intensity Яркость дисплея.
 *               Доступны только значения от 0 (минимальная яркость) 
 *               до 15 (максимальная яркость).
 */
void setIntensity(int addr, int intensity);

Очищение дисплея

Объяснять, собственно, особо нечего, потому что все предельно ясно. Функция, отвечающая за очистку дисплея – это clearDisplay(). Вот ее прототип:

/* 
 * Выключаем все светодиоды дисплея. 
 * Параметры:
 * int addr Адрес дисплея, которому нужно передать команду.
 */
void clearDisplay(int addr);

Собственно, после вызова этой функции все светодиоды выключатся. Все.

Управление светодиодной матрицей

Светодиодная матрица может выглядеть примерно как на картинке ниже. Конкретно эта собрана при помощи семи MAX72xx.

Картинка в самом начале статьи демонстрирует проект, позволяющий управлять лишь одной матрицей размерами 5 на 7 светодиодов. То есть в данном случае возможности даже одного MAX72xx используются не на полную мощность, т.к. один чип позволяет управлять матрицей размерами 8 на 8 светодиодов. Однако даже примитивного дисплея 5х7 достаточно для проверки базовых вещей, которые библиотека LedControl позволяет делать с матрицами светодиодов.

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

Включение отдельного светодиода

Вот прототип функции:

/* 
 * Задает статус отдельного светодиода.
 * Параметры:
 * int addr  Адрес дисплея, которому нужно передать команду.
 * int row   Ряд, в котором расположен светодиод. 
 *           Доступны только значения от «0» до «7».
 * int col   Столбец, в котором расположен светодиод.
 *           Доступны только значения от «0» до «7».
 * boolean state Если «true», то светодиод включается, 
 *               а если «false», то выключается.
 */
void setLed(int addr, int row, int col, boolean state);

Что делает эта функция, думаю, очевидно, как и очевидно то, для чего нужны аргументы addr и state. Но как в матрице определяются ряды (row) и столбцы (col)?

Поскольку представление о светодиодах, как об устройствах, сгруппированных в матрицу – чисто теоретическое, схема ниже объясняет, как эта матрица подсоединена к контактам MAX72xx.

В верхней и левой частях картинки изображены контакты MAX72xx, к которым подключены светодиоды матрицы. Каждый светодиод имеет в матрице определенную позицию (ее номер написан справа). Собственно, это картинка наглядно показывает, где у матрицы ряды и столбцы: восемь рядов (пронумерованных от 0 до 7) и восемь столбцов (тоже пронумерованных от 0 до 7). Таким образом, если вы хотите зажечь, к примеру, крайний правый светодиод в третьем ряду, просто посмотрите на картинку (адрес этого светодиода будет «2,7»), а затем используйте эти данные для аргументов row и col.

// включаем светодиод, находящийся в третьем ряду (индекс «2»)
// и восьмом столбце (индекс «7»):
lc.setLed(0,2,7,true);   
delay(500);
lc.setLed(0,2,7,false);

Включение ряда и столбца

Если вам нужно изменить статус сразу нескольких светодиодов одновременно, то использовать функцию setLed(), пожалуй, не стоит, потому что в итоге скетч может попросту зависнуть. Однако в библиотеке LedControl есть еще две функции для работы со светодиодами, и они позволяют включать сразу несколько (или все) светодиодов, находящихся в одном ряду или столбце. В функции setLed() для того, чтобы поменять статус нужного светодиода, достаточно было аргумента типа boolean. Однако теперь нам нужно поменять статус сразу нескольких светодиодов, поэтому систему выбора пришлось перекодировать. Ниже показана та же картинка, что и вверху, но теперь туда добавлена добавочная «система координат».

Предположим, вы решили включить несколько светодиодов, находящихся в третьем сверху ряду. Индекс для этого ряда – «2». Светодиоды, которые нужно включить – это «2,0», «2,3» и «2,6». Все остальные светодиоды должны быть выключены. Теперь нам нужно сложить все значения из картинки выше, отвечающие за нужные нам светодиоды (т.е. значения для светодиодов, что должны оставаться темными, мы в расчет не берем). Вот таблица:


2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7
Вкл/выкл Да Нет Нет Да Нет Нет Да Нет
Значение 128 0 0 16 0 0 2 0 = 146 (128 + 16 + 2)

В коде это будет выглядеть так – setRow(0, 2, 146). То есть эта функция включит первый, четвертый и седьмой светодиоды в третьем сверху ряду на матрице, подключенной к первому MAX72xx.

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

То, что можно делать с рядами, можно делать и со столбцами, и за это отвечает функция setColumn(). Давайте представим, что нам нужно зажечь четыре последних светодиода, находящихся в шестом (индекс «5») столбце. В таком случае таблица будет выглядеть следующим образом:

0,5 1,5 2,5 3,5 4,5 5,5 6,5 7,5
Вкл/выкл Нет Нет Нет Нет Да Да Да Да
Значение 0 0 0 0 8 4 2 1 = 16 (8 + 4 + 2 + 1)

Вот прототипы для обеих функций:

/* 
 * Задает новый статус для светодиодов, находящихся в одном ряду.
 * Параметры:
 * int addr   Адрес дисплея, которому нужно передать команду.
 * int row    Ряд, в котором находятся нужные светодиоды.
 *            Доступны только значения от «0» до «7».
 * byte value Значение, обозначающее, какие светодиоды надо зажечь.
 */
void setRow(int addr, int row, byte value);

/* 
 * Задает новый статус для светодиодов, находящихся в одном столбце.
 * Параметры:
 * int addr   Адрес дисплея, которому нужно передать команду.
 * int col    Столбец, в котором находятся нужные светодиоды.
 *            Доступны только значения от «0» до «7».
 * byte value Значение, обозначающее, какие светодиоды надо зажечь.
 */
void setColumn(int addr, int col, byte value);

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

Это выполняется гораздо проще, чем описано в предыдущем разделе, и пример такого проекта можно наблюдать, к примеру, в самой первой картинке к этой статье. Думаю, показывать схему подключения смысла нет, потому что она подробно описана в «даташите» MAX72xx.

Отображение чисел (десятичных и шестнадцатеричных)

Эта функция принимает аргумент типа byte, а затем печатает указанное значение в указанном месте дисплея. Диапазон значений – от «0» до «15». Значения в диапазоне от «0» до «9» печатаются как числа, а в диапазоне от «10» до «15» – в виде шестнадцатеричных символов. Все другие значения игнорируются (т.е. не печатаются). Сам дисплей при этом не потухнет, а просто покажет предыдущее значение. Наличие десятичной запятой указывается в последнем (четвертом аргументе). Ниже – пример отображения на экране значения типа int, состоящего как минимум из 4 цифр (здесь используется также функция setChar(), которая объясняется в следующей главе).

void printNumber(int v) {
    int ones;
    int tens;
    int hundreds;
    boolean negative;	

    if(v<0) {
        negative=true;
        v=v*-1;
    }
    ones=v%10;
    v=v/10;
    tens=v%10;
    v=v/10;
    hundreds=v;			
    if(negative) {
       // печатаем знак «минус» на 4-ой позиции (без десятичной запятой):
       lc.setChar(0,3,'-',false);
    }
    else {
       // теперь печатаем знак «пробел» на 4-ой позиции:
       lc.setChar(0,3,' ',false);
    }
    // теперь печатаем цифры на 1-ой, 2-ой и 3-ей позициях:
    lc.setDigit(0,2,(byte)hundreds,false);
    lc.setDigit(0,1,(byte)tens,false);
    lc.setDigit(0,0,(byte)ones,false);
}

Прототип для этой функции:

/* 
 * Печатает на 7-сегментом дисплее шестнадцатеричную цифру.
 * Параметры:
 * int addr   Адрес дисплея, которому нужно передать команду.
 * int digit  Позиция цифры на дисплее.
 * byte value Значение, которое нужно напечатать. 
 *            Доступны только значения от 0x00 до 0x0F.
 * boolean dp Если поставить «true», функция переключится на 
 *            десятичную запятую.
 */
void setDigit(int addr, int digit, byte value, boolean dp);

В аргументе digit можно указывать значения в диапазоне от «0» до «7», т.к. MAX72xx может управлять не более чем восемью 7-сегментными дисплеями, и их отсчет ведется с «0».

Печать символов

Хотя 7-сегментные дисплеи позволяют показывать лишь ограниченный набор символов, иногда даже этот функционал приходится весьма кстати. Аргумент value – это тип символа, и здесь доступны значения в диапазоне от «0» до «127». Поскольку дисплей способен показывать далеко не все символы ASCII-формата, то в большинстве случаев вместо нужного символа на дисплее будет просто показан пробел. Кроме того, для символов с кодом выше «127» тоже будет показан пробел.

Вот список символов, которые дисплей может отобразить:

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

Кроме того, для удобства использования шестнадцатеричные символы были переопределены в значения типа char: от 0x00 до 0x0F. Таким образом, если вы хотите смешать вместе цифры и символы, то этот аргумент можно передать не только через char, но и через byte. Прототип этой функции почти идентичен прототипу setDigit():

/* 
 * Печатает символ на 7-сегментом дисплее.
 * Набор символов, которые можно напечатать, очевидно, ограничен:
 * '0','1','2','3','4','5','6','7','8','9','0',
 * 'A','b','c','d','E','F','H','L','P',
 * '.','-','_',' ' 
 * Параметры:
 * int addr   Адрес дисплея, которому нужно передать команду.
 * int digit  Позиция символа на дисплее.
 * char value Символ, который нужно напечатать (см. список выше).
 * boolean dp Если поставить «true», функция переключится на 
 *            десятичную запятую.
 */
void setChar(int addr, int digit, char value, boolean dp);

На этом все, спасибо за чтение!

Загрузка и установка

ZIP-архив, который содержит исходный код библиотеки, а также локальную версию (но на английском языке) данной статьи, можно скачать здесь. Распаковка архива создаст новую директорию под названием LedControl, которая будет содержать в себе следующее:

  • «LedControl/LedControl.h» – Заголовочный файл, который нужно будет подключать к скетчу
  • «LedControl/LedControl.cpp» – Реализация
  • «LedControl/doc/LedControl.htm» – HTML-документация
  • «LedControl/doc/lc.css» – Таблица стилей для HTML-документации
  • «LedControl/doc/*.jpg» – Несколько картинок для HTML-документации

Этот ZIP-файл нужно распаковать в директорию для библиотек IDE Arduino. У разных версий IDE Arduino эта папка может находиться в разных местах.

  • Если у вас версия от 0007 до 0009, то она находится по адресу «arduino-<версия>/lib/targets/libraries/»
  • Если у вас версия 0010 и выше, то библиотеки устанавливаются по адресу «arduino-<версия>/hardware/libraries/»

После распаковки ZIP-файла новую библиотеку нужно скомпилировать. В IDE Arduino это делается очень просто. Создайте новый скетч следующего содержания:

#include "LedControl.h"

void setup() {}
void loop() {}

Затем нажмите кнопку «Проверить», после чего библиотека скомпилируется и будет готова для использования во всех скетчах, которые начинаются со строчки

#include "LedControl.h".

Дополнительные материалы

  • Последний релиз можно всегда скачать здесь.
  • О том, как установить библиотеку, читайте тут.

История изменений

  • 26 мая 2014. Исправлена ошибка с функцией setChar().
  • 10 февраля 2014. Обновлены инструкции по установке библиотеки.
  • 10 сентября 2012. Лицензия изменена с LGPL на лицензию типа MIT.
  • 19 сентября 2011. Загружена новая версия LedControl.zip. Arduino IDE версии 1.0 переименовала внутренний заголовочный файл с WProgram.h на Arduino.h. Оператор подключения в LedControl.h был обновлен, так что библиотека теперь компилируется в версиях и до, и после 1.0.
  • 14 октября 2008. Загружена новая версия LedControl.zip. Оригинальная версия не компилировалась для Arduino версии до 0012.
  • 5 декабря 2007. На сайт Arduino (в раздел Playground) добавлены документация и исходный код.
  • 23 июля 2007. Первый публичный релиз.

Обратная связь

Все вопросы, возражения и предложения можно слать по адресу e.fahle@wayoda.org или создать новую ветку в репозитории на GitHub.

Примеры

См.также

Внешние ссылки