Проект 16: 8x8 LED матрица
Описание
8*8 LED точечная матрица состоит из 8 строк и 8 столбцов светодиодов, всего 64 светодиода. Каждый из них можно независимо управлять, включая или выключая, тем самым формируя различные узоры и символы.
В этом проекте вы научитесь программировать на плате разработки UNO R3 (ch340) для управления 8×8 LED матрицей, отображая узоры большого и маленького сердца.
Аппаратное обеспечение
1. Плата разработки UNO R3 (ch340) x 1
2. 8*8 LED матрица x 1
3. Макетная плата x 1
4. Соединительные провода
Принцип работы
Внешний вид точечной матрицы показан ниже

8*8 точечная матрица состоит из шестидесяти четырех светодиодов, каждый из которых расположен на пересечении строки и столбца.
Когда электрический уровень определенной строки равен 1, а электрический уровень определенного столбца равен 0, соответствующий светодиод загорается. Если вы хотите включить светодиод в первой точке, нужно установить пин 9 в высокий уровень, а пин 13 в низкий уровень.
Если вы хотите включить светодиоды в первой строке, установите пин 9 в высокий уровень, а пины 13, 3, 4, 10, 6, 11, 15 и 16 — в низкий уровень.
Если вы хотите включить светодиоды в первом столбце, установите пин 13 в низкий уровень, а пины 9, 14, 8, 12, 1, 7, 2 и 5 — в высокий уровень.
Внутренний вид точечной матрицы показан ниже

Если у нас есть 8x8 точечная матрица, как определить, где пин 1? В микросхемах возле пина 1 обычно есть точка, обозначающая этот пин. Но здесь, как узнать?

Пины начинаются со стороны ручки
На модуле LED матрицы производитель указывает метку или отметку со стороны пина 1, как показано на рисунке. Мы обязательно её найдём. Также возле пина 1 есть выемка.

Подключение батареи
Строка = + положительное питание
Столбец = - отрицательное питание
Для тестирования требуется источник питания 1.5 В постоянного тока. Достаточно одной батарейки или можно использовать резистор 130 Ом последовательно с положительной или отрицательной стороной.

Тестирование LED матрицы с батарейкой
После подключения светодиода к источнику питания мы видим, что светодиод в 8-м столбце и 5-й строке загорается, как показано на рисунке. Как подключить батарейку к матрице.

Подключение пинов столбцов и строк
Тест пинов LED точечной матрицы
Как показано на рисунке, пины 1 и 16 подают питание, и светодиод в 8-м столбце и 5-й строке загорается. Перед использованием матрицу следует проверить, так как если какой-либо светодиод неисправен, его можно заменить.

Светодиодная матрица загорается
Если вы хотите отобразить улыбающееся лицо, вот что нужно сделать:

Схема подключения

Строки 1–8 > цифровые пины D2–D9
Столбцы 1–8 > цифровые пины D10–D17

Пример кода
/*
Electronics Learning Starter Kit for Arduino
Project 16
8x8 LED Matrix
Edit By Keyes
*/
// 2-dimensional array of row pin numbers:
int R[] = {2,7,A5,5,13,A4,12,A2};
// 2-dimensional array of column pin numbers:
int C[] = {6,11,10,3,A3,4,8,9};
unsigned char biglove[8][8] = //the big "heart"
{
0,0,0,0,0,0,0,0,
0,1,1,0,0,1,1,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,0,
0,0,1,1,1,1,0,0,
0,0,0,1,1,0,0,0,
};
unsigned char smalllove[8][8] = //the small "heart"
{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,0,
0,0,1,1,1,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
};
void setup()
{
// iterate over the pins:
for(int i = 0;i<8;i++)
// initialize the output pins:
{
pinMode(R[i],OUTPUT);
pinMode(C[i],OUTPUT);
}
}
void loop()
{
for(int i = 0 ; i < 100 ; i++) //Loop display 100 times
{
Display(biglove); //Display the "Big Heart"
}
for(int i = 0 ; i < 50 ; i++) //Loop display 50 times
{
Display(smalllove); //Display the "small Heart"
}
}
void Display(unsigned char dat[8][8])
{
for(int c = 0; c<8;c++)
{
digitalWrite(C[c],LOW);//use thr column
//loop
for(int r = 0;r<8;r++)
{
digitalWrite(R[r],dat[r][c]);
}
delay(1);
Clear(); //Remove empty display light
}
}
void Clear() //clear the display
{
for(int i = 0;i<8;i++)
{
digitalWrite(R[i],LOW);
digitalWrite(C[i],HIGH);
}
}
Объяснение кода
1. Конфигурация пинов
Сначала нужно настроить пины строк и столбцов:
// 2-dimensional array of row pin numbers:
int R[] = {2, 7, A5, 5, 13, A4, 12, A2};
// 2-dimensional array of column pin numbers:
int C[] = {6, 11, 10, 3, A3, 4, 8, 9};
В коде определены два массива R[] и C[], которые представляют номера пинов для строк и столбцов LED матрицы соответственно. Каждый из массивов содержит 8 пинов, используемых для управления 8x8 LED матрицей.
2. Определение узоров
Далее определены два двумерных массива biglove и smalllove, которые представляют узоры большого и маленького сердца:
unsigned char biglove[8][8] = {
0,0,0,0,0,0,0,0,
0,1,1,0,0,1,1,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,0,
0,0,1,1,1,1,0,0,
0,0,0,1,1,0,0,0,
};
unsigned char smalllove[8][8] = {
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,0,
0,0,1,1,1,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
};
В этих массивах 1 означает, что светодиод включен, а 0 — что светодиод выключен. С помощью этих массивов можно управлять светодиодами на матрице для формирования узоров в виде сердца.
3. Настройка инициализации
В функции setup() все пины инициализируются как выходы:
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(R[i], OUTPUT);
pinMode(C[i], OUTPUT);
}
}
4. Основной цикл
В функции loop() происходит последовательное отображение узоров большого и маленького сердца:
void loop() {
for (int i = 0; i < 100; i++) {
Display(biglove);
}
for (int i = 0; i < 50; i++) {
Display(smalllove);
}
}
С помощью циклов for узор большого сердца отображается 100 раз, а маленького — 50 раз.
5. Функция отображения
Функция Display(unsigned char dat[8][8]) отвечает за конкретные операции отображения:
void Display(unsigned char dat[8][8]) {
for (int c = 0; c < 8; c++) {
digitalWrite(C[c], LOW);
for (int r = 0; r < 8; r++) {
digitalWrite(R[r], dat[r][c]);
}
delay(1);
Clear();
}
}
Эта функция последовательно сканирует каждый столбец, используя dat[r][c] для определения, должен ли светодиод быть включен или выключен. Затем вызывается функция Clear(), чтобы очистить дисплей и предотвратить эффект “призрака”.
6. Функция очистки дисплея
Функция Clear() используется для очистки текущего содержимого дисплея:
void Clear() {
for (int i = 0; i < 8; i++) {
digitalWrite(R[i], LOW);
digitalWrite(C[i], HIGH);
}
}
Все пины строк устанавливаются в низкий уровень, а пины столбцов — в высокий, что выключает все светодиоды.
Результат проекта
После загрузки кода на плату Arduino LED матрица чётко отображает узоры большого и маленького сердца. При переключении узоров заметно изменение свечения, что делает эффект очень наглядным.
