Для отображения информации в радиолюбительских и инженерных проектах сегодня зачастую используют дисплеи. К Arduino можно подключать различные дисплеи, например, TFT и LCD, но для некоторых они могут быть довольно дорогими, если они проектируют низкобюджетное устройство.

В таких случаях можно сделать простой и дешевый матричный дисплей на основе светодиодов, который может управляться посредством Arduino.
В данном примере мы рассмотрим пример построения светодиодного матричного дисплея размером 7 x 5 точек. Количество точек может быть расширено по желанию. Если вы используете Arduino Uno, количество строк может быть увеличено до 14, а число столбцов может быть увеличено до 6. Прежде чем перейти к описанию схемы, стоит рассказать о методе мультиплексирования, используемого в матричном дисплее. Пусть, предположим, мы имеем светодиодный матричный дисплей 5 × 5, и вы хотите, чтобы засветился один светодиод, например, 7-й светодиод. Тогда включается вся строка, состоящая из светодиода номер 7 (строка 3), в результате один вывод всех светодиодов этой строки получает напряжение. Теперь, чтобы зажегся светодиод 7, активируется соответствующий столбец (4-й столбец). В результате загорается только седьмой светодиод.
Схема подключения матричного дисплея 7 × 5 к плате Arduino Uno показана на приведенном ниже рисунке. Помимо Arduino и самих светодиодов, организованных в матрицу, в схеме присутствуют NPN-транзисторы BC547 с токоограничивающими резисторами, подключенными к базе. Всего таких транзисторов семь – по одному на каждый столбец.

Плата Arduino Uno не может использовать эти все светодиоды напрямую. Чтобы включать и выключать все светодиоды, используется схему коммутации на основе 7 транзисторов. Выход берется с цифровых линий D2-D8 и передается на базу транзисторов T1-T7. Коллектор транзистора подключен к питанию + 5 В с платы Arduino. Анод каждого столбца закорочен и подключен к эмиттеру транзистора, как показано на схеме. Катоды каждого ряда закорочены и подключены к аналоговым линиям для организации на них нулевого потенциала. Чтобы загорелся определенный светодиод, соответствующий цифровой контакт в столбеце устанавливается в высокий логический уровень, а соответствующий аналоговый вывод в строке устанавливается в низкий логический уровень. Когда цифровой контакт становится «высоким», соответствующий транзистор включается, в результате напряжение коллектора (+5 В) становится доступно на аноде светодиодов, а аналоговый вывод ведет себя как земля, в результате образуется путь для тока и светодиод начинает светиться.
Ниже приведен код (скетч) для Arduino, позволяющий выводить на светодиодном матричном дисплее буквы B, E и P. Соответствующие функции можно поменять для вывода своих символов.
int RowLed[7] = {2,3,4,5,6,7,8}; // Точки подключения катодов
int colLed[5] = {15,16,17,18,19}; // Точки подключения анодов
int Rpin = 6; // Всего линий для катодов
int cpin = 4; // Всего линий для анодов
void setup()
{
for (int i = 0; i <= Rpin; i++)
{
pinMode(RowLed[i], OUTPUT);
}
for (int j = 0; j <= cpin; j++)
{
pinMode(colLed[j], OUTPUT);
}
}
void alloff()
{
for (int i = 0; i <= Rpin; i++)
{
digitalWrite(RowLed[i],LOW);
}
for (int j = 0; j <= cpin; j++)
{
digitalWrite(colLed[j],HIGH);
}
}
void ledon(int x, int y)
{
alloff(); // сначала вызывается функция выключения, чтобы убедиться, что включен только этот светодиод.
digitalWrite(RowLed[x], HIGH); // Анодный вывод конкретного светодиода в +5 В
digitalWrite(colLed[y], LOW); // Катодный вывод конкретного светодиода в 0 В
}
/* Функция для отображения буквы B*/
void L_B()
{
ledon(0,0);delay(1);
ledon(1,0);delay(1);
ledon(2,0);delay(1);
ledon(3,0);delay(1);
ledon(4,0);delay(1);
ledon(5,0);delay(1);
ledon(6,0);delay(1);
ledon(0,1);delay(1);
ledon(0,2);delay(1);
ledon(0,3);delay(1);
ledon(1,4);delay(1);
ledon(2,4);delay(1);
ledon(3,0);delay(1);
ledon(3,1);delay(1);
ledon(3,2);delay(1);
ledon(3,3);delay(1);
ledon(4,4);delay(1);
ledon(5,4);delay(1);
ledon(6,0);delay(1);
ledon(6,1);delay(1);
ledon(6,2);delay(1);
ledon(6,3);delay(1);
}
/* Функция для отображения буквы E*/
void L_E()
{
ledon(0,0);delay(1);
ledon(1,0);delay(1);
ledon(2,0);delay(1);
ledon(3,0);delay(1);
ledon(4,0);delay(1);
ledon(5,0);delay(1);
ledon(6,0);delay(1);
ledon(0,1);delay(1);
ledon(0,2);delay(1);
ledon(0,3);delay(1);
ledon(0,4);delay(1);
ledon(3,0);delay(1);
ledon(3,1);delay(1);
ledon(3,2);delay(1);
ledon(3,3);delay(1);
ledon(3,4);delay(1);
ledon(6,0);delay(1);
ledon(6,1);delay(1);
ledon(6,2);delay(1);
ledon(6,3);delay(1);
ledon(6,4);delay(1);
}
/* Функция для отображения буквы P */
void L_P()
{
ledon(0,0);delay(1);
ledon(1,0);delay(1);
ledon(2,0);delay(1);
ledon(3,0);delay(1);
ledon(4,0);delay(1);
ledon(5,0);delay(1);
ledon(6,0);delay(1);
ledon(0,1);delay(1);
ledon(0,2);delay(1);
ledon(0,3);delay(1);
ledon(1,4);delay(1);
ledon(2,4);delay(1);
ledon(3,0);delay(1);
ledon(3,1);delay(1);
ledon(3,2);delay(1);
ledon(3,3);delay(1);
}
void BEP()
{
for(int i=0;i<=50;i++)
{
L_B();
}
alloff();
delay(200);
for(int i=0;i<=50;i++)
{
L_E();
}
alloff();
delay(200);
for(int i=0;i<=50;i++)
{
L_P();
}
alloff();
delay(200);
}
void loop()
{
BEP();
}
© digitrode.ru