Управление LED-матрицей с помощью Arduino и max7219

Wiring Diagram

If the LED matrix is made of a single block:

  • Attach the input pins groups to Arduino Nano

  • Leave the output pins group unconnected

This image is created using Fritzing. Click to enlarge image

This image is created using Fritzing. Click to enlarge image

If the LED matrix is pre-built of multiple blocks:

  • Connect the input pins group to Arduino Nano

  • Leave the output pins group unconnected

This image is created using Fritzing. Click to enlarge image

If the LED matrix is made of multiple blocks by yourself:

  • Connect the input pins groups of the first block to Arduino Nano

  • Link the output pins groups of each block to the input pins groups of the following block

  • Leave the output pins group of the last block unconnected

This image is created using Fritzing. Click to enlarge image

Due to the high current draw of the display (up to 1A at maximum brightness):

  • Do not power it from the 5V pin of an Arduino Nano.

  • Utilize an external 5V power supply instead. Both the Arduino Nano and LED matrix can be powered by a single 5V power adapter.

Since Arduino Nano is connected to the LED matrix through SPI pins:

How does the LED matrix work?

It’s not possible to turn multiple LEDs in different rows and columns ON and keep them ON at the same time. To create the visual effect where all designated LEDs appear to be on at the same time, a vision persistence method is used.

Our eyes remember a flash of light for approximately 20ms, so when you continuously flash a light at a rate of or faster than 20ms, then it appears that the light never goes off.

Using this concept, the microcontroller turns ON the required LEDs in a row or column, one row or one column after the other, cycling through all rows or columns to turn on the required LEDs, at a rate greater than 20ms which tricks human eyes into seeing the designated LEDs appear to be ON at the same time!

Принципиальная схема табло Arduino

Схема для светодиодного табло Arduino показана ниже, так как этот проект очень прост. Для разработки схемы я использовал популярное программное обеспечение fritzing.

Работа схемы очень проста, у нас есть приложение для Android и модуль Bluetooth, чтобы успешно общаться с модулем Bluetooth, вам необходимо подключить модуль HC-05 к приложению Android. После подключения мы можем отправить строку, которую хотим отобразить, после отправки строки Arduino обработает строку и преобразует ее в сигнал, который может понять внутренний резистор сдвига 74HC595, после того, как данные будут отправлены в сдвиг. резистор, готов к отображению.

Schematics

Connecting the module to the Arduino is very easy. Since the module comes in a shield form, all we need to do is to snap it onto the top of the Arduino Uno as shown in the image below.

Connecting the Display

One of the few downsides to this display is the amount of the Arduino pins it uses. If we don’t use the SD card slot, we will be left with 6 digitals pins and one analog pin which can be connected to other modules or sensors. but when we use the SD card module part of the display, we will be left with just 2 digital and one analog pin which at times limits what we the kind of project for which we can use this display but fortunately, this display is also compatible with the Arduino Mega board which offers many more digital pins to work with, so when you need extra pins, and size is not an issue, use the mega. Unfortunately, this display does not work with some other Arduino Uno form factor based boards like the Arduino Due or the Wemos D1 ESP8266 board due to pin compatibility and library Issues. The Wemos D1, in particular, has just one analog pin and the display requires 5.

With the display mounted on the Arduino, we are ready to run some sample codes on it.

Суть соединения дисплея с Ардуино

Display для Аrduino – это одно из самых простых устройств, которое можно использовать для отображения результатов проектов. Однако есть два различных типа данного устройства: графические и символьные. В этой статье используется персональный экран, так как он легче всего работает. Кроме того, в зависимости от размера экрана, существуют разные типы:

  • 16×2 символьный – 16 колонок и 2 строки;
  • 20×4 символов – 20 колонок и 4 строки.

Они также доступны в разных цветах:

  1. Зеленые с черными символами.
  2. Синие с белыми символами.
  3. Красные с черными символами.

Тем не менее, зеленые и синие экраны являются наиболее распространенными. Другие цвета встречаются редко. В этом уроке используется Аrduino display с синим символом 20×4. Микропроцессор взаимодействует с экраном через четыре линии передачи данных. Мы задействуем цифровые контакты на микроконтроллере, чтобы взаимодействовать с дисплеем и отображать на нем то, что мы хотим.

Подсветка на ЖК-дисплее активируется, когда дается питание 5 В от микроконтроллера до 15 на мониторе и заземляющим штырем 16. Кроме того, для регулировки контрастности сенсорного дисплея для Ардуино нужен потенциометр 10K.

Матричный светодиодный экран P10

P10 Светодиодный матричный дисплей является лучшим способом доступны сделать светодиодную доску для наружного или внутреннего применения. Эта панель имеет в общей сложности 512 светодиодов высокой яркости, установленных на пластиковом корпусе, предназначенном для наилучших результатов отображения. Он также имеет степень защиты IP65 для гидроизоляции, что делает его идеальным для использования на открытом воздухе. Таким образом, вы можете сделать большую светодиодную вывеску, объединив любое количество таких панелей в любой структуре строк и столбцов.

Наш модуль имеет размер 32 * 16, что означает, что в каждом ряду 32 светодиода и 16 светодиодов в каждом столбце. Итак, всего в каждой светодиодной вывеске присутствует 512 светодиодов. Помимо этого, он имеет рейтинг IP65 для водонепроницаемости, он может питаться от одного источника питания 5 В, он имеет очень широкий угол обзора, а яркость может достигать 4500 нит. Таким образом, вы сможете ясно увидеть это при дневном свете. Ранее мы также использовали этот дисплей P10 с Arduino для создания простой светодиодной платы.

Pin Описание от P10 светодиодной матрицы:

Эта плата светодиодного дисплея использует 10-контактный почтовый заголовок для входного и выходного подключения, в этом разделе мы описали все необходимые контакты этого модуля. Кроме того, вы можете видеть, что в середине модуля есть внешний разъем на 5 В, который используется для подключения внешнего питания к плате.

  • Включить: этот вывод используется для управления яркостью светодиодной панели, подавая на нее импульс ШИМ.
  • A, B: они называются выводами мультиплексного выбора. Они используют цифровой вход для выбора любых строк мультиплекса.
  • Часы сдвига (CLK), часы сохранения (SCLK) и данные: это обычные контакты управления регистром сдвига. Здесь используется сдвиговый регистр 74HC595.

Подключение модуля светодиодного дисплея P10 к Arduino:

Подключение модуля матричного дисплея P10 к Arduino – очень простой процесс, в нашей схеме мы настроили вывод 9 Arduino как вывод включения, вывод 6 как вывод A, вывод 7 как вывод B, вывод 13 – это CLK, вывод 8 – SCLK, контакт 11 – это ДАННЫЕ, и, наконец, контакт GND – это контакт GND для модуля и Arduino, полная таблица ниже четко объясняет конфигурацию контактов.

Светодиодный модуль P10

Arduino UNO

ВКЛЮЧИТЬ

9

А

6

B

7

CLK

13

SCLK

8

ДАННЫЕ

11

GND

GND

Примечание. Подключите клемму питания модуля P10 к внешнему источнику питания 5 В, так как 512 светодиодов потребляют много энергии. Рекомендуется подключить источник постоянного тока 5 В, 3 А к одному блоку светодиодного модуля P10. Если вы планируете подключить модуль с дополнительными номерами, соответственно увеличьте емкость SMPS.

Пример 2. Arduino LCD 1602 I2C.

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

Для работы с дисплеем по I2C нужно взять уже иную библиотеку – LiquidCrystal_I2C, скачать можно, например, здесь – ссылка. А процесс добавления библиотеки в Arduino IDE я описал в отдельном посте, поскольку данный вопрос является достаточно распространенным, поэтому он достоин отдельного материала.

Приготовление завершены, переходим к деятельности:

// Подключаем библиотеку
#include <LiquidCrystal_I2C.h>


// Создаем объект класса LiquidCrystal_I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);



void setup() 
{  
  // Инициализация и начало работы с дисплеем
  lcd.init();

  // Включаем подсветку
  lcd.backlight();

  // Устанавливаем положение курсора, 0-й столбец, 0-я строка
  lcd.setCursor(0, 0);
  
  // Выводим текст
  lcd.print("MicroTechnics");

  // Устанавливаем положение курсора, 0-й столбец, 1-я строка
  lcd.setCursor(0, 1);

  // Выводим еще немного текста, уже на другой строке
  lcd.print("Hi there, LCD!");
}



void loop() 
{

}

В данном случае вместо объекта у нас , отличаются и передаваемые аргументы:

  • первый – адрес дисплея на шине I2C (0x27)
  • второй, третий – размеры дисплея – количество столбцов (16), количество строк (2)

Вопрос – как узнать адрес? Есть два глобальных варианта. Первый, эмпирический/экспериментальный заключается в том, что берется скетч из предыдущей статьи курса , он позволяет определить все наличествующие устройства на шине. В примере как раз и протестировано на примере подключения этого самого дисплея, так что видим адрес 0x27.

Второй способ, аналитический. Из документации на микросхему PCF8574, являющуюся центральным элементом модуля, который позволяет подключить дисплей по I2C, можно узнать следующее:

Из 7-ми битов адреса (помечены зеленым) 4 старших (помечены красным) фиксированы и зависят только от модели микросхемы: PCF8574 или PCF8574A. Берем модуль и изучаем, что написано на микросхеме. У меня первый вариант – PCF8574, значит фиксированная часть равна 0100 в двоичном виде. Замечательно, оставшиеся 3 бита зависят от того, какие логические уровни (1 или 0) на входах A0, A1, A2 PCF8574. По умолчанию обычно они подтянуты вверх, то есть к 1. Смотрим на плату конвертера:

У меня здесь три посадочных места для перемычек, которые позволят подключить каждый из этих входов (A0, A1, A2) к земле. Но перемычки отсутствуют, а значит на всех трех логическая единица, поэтому недостающая часть адреса на шине I2C – 111. Итоговый семибитный адрес – 0100111, что и равно 0x27 в шестнадцатеричном виде.

Возвращаемся к скетчу, в котором далее следует вывод на экран точно таких же строк, как в первом примере

Стоит только обратить внимание на чуть другую инициализацию:

lcd.init();
lcd.backlight();

На этом можно переходить к следующему демо-примеру. Ну и да, результат работы данного скетча аналогичен предыдущему, что ожидаемо:

How to Program Multiple LED Matrixes on the Arduino

Once the LED matrixes are connected, upload the code below to the Arduino. The sketch will scroll a string of text across the four displays.

The code in this sketch is a bit too complicated to explain here in depth, so I’m just going to point out the important parts.

Since we have four horizontal displays, we need to set equal to when we declare it. The number of vertical displays is still one, so is still set equal to .

The text you want to scroll goes in the line that says . This sketch prints “Hello World!” to the displays, but if you want to print something else, just change the text inside the quotation marks.

We also declare an int variable called . The variable defines the speed that the text will scroll across the display in milliseconds. As it is now, the text will shift by one LED column every 50 milliseconds. If you increase the number, the text will scroll slower. If you decrease it, the text will scroll faster.

In the wiring diagram above, the second and fourth displays are connected upside down to make it easier to wire them together. So we need to change the rotation of those displays so they don’t display upside down text. We do that with the function. This function takes two parameters. The first parameter is the number of the LED matrix, which is zero indexed. So the second display is display , and the fourth display is display . The second parameter is the display rotation. Starting from 0°, which is no rotation, the screen can be rotated clockwise in 90° increments by increasing the value by one. So a will rotate the display clockwise 90° and a will rotate it 180° clockwise, which is what we want.

After the circuit is connected and the code is uploaded to the Arduino, you should see the text “Hello World!” scrolling across the four displays:

Подключение дисплея LCD 1602 к Arduino.

Коммутация с Arduino может производиться несколькими способами, из которых можно выделить два основных. Будем последовательными, и начнем с первого из них. В данном случае линии данных дисплея (DB4 – DB7) подключаются напрямую к четырем цифровым выводам Ардуино:

Помимо этого мы имеем:

  • VDD → питание дисплея, в данном случае подключаем к пину 5V
  • VSS → земля, GND
  • A (Led+) → анод светодиода подсветки
  • K (Led-) → катод светодиода подсветки
  • RW → отвечает за направление передачи данных, чтение или запись, подключаем к GND
  • E → сигнал Enable, закидываем на еще один цифровой пин Ардуино
  • RS → выбор регистра данных или команд, также подключаем на любой цифровой пин напрямую
  • V0 → вывод для установки контрастности
  • DB4…DB7 → уже упомянутые линии данных, на некоторых дисплеях они обозначены как D4…D7, но чтобы не создавать путаницу с выводами Arduino, я буду для линий дисплея использовать обозначение “DB”
  • DB0…DB3 → не используем, так как и без того задействовано уже много выводов платы

В итоге:

LCD 1602 Arduino LCD 1602 Arduino
VDD 5V DB2 Не используется
VSS GND DB3 Не используется
V0 Потенциометр DB4 D4
RS D8 DB5 D5
RW GND DB6 D6
E D9 DB7 D7
DB0 Не используется A 5V через резистор
DB1 Не используется K GND

Пример 4. Доступные символы LCD 1602.

Все символы, который способен вывести дисплей, хранятся в его памяти, давайте по очереди отобразим их на экране:

// Подключаем библиотеку
#include <LiquidCrystal_I2C.h>


// Создаем объект класса LiquidCrystal_I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);



void setup() 
{  
  // Инициализация и начало работы с дисплеем
  lcd.init();

  // Включаем подсветку
  lcd.backlight();
}



void loop() 
{
  // Последовательно выводим символы
  for (uint8_t j = 0; j < 8; j++)
  {
    for (uint8_t i = 0; i < 32; i++)
    {
      lcd.setCursor(i % 16, i / 16);
      lcd.write(i + j * 32);
    }

    // Задержка на 3 секунды, чтобы успеть рассмотреть выводимое
    delay(3000);
  }
}

Результаты следующие:

Символы выводятся по 32 штуки (столько помещается на экране), здесь я сгруппировал их все вместе. Таким образом, если мы хотим вывести символ восклицательного знака, код которого 0x21, то делаем так:

lcd.write(0x21);

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

Рассмотрим структуру скетча чуть подробнее, в частности вывод символа:

lcd.setCursor(i % 16, i / 16);
lcd.write(i + j * 32);

Чтобы все было понятно, разберем на конкретных числовых значениях. Значение переменной меняется от 0 до 32, а от 0 до 8. Операция даем нам в результате остаток от деления на 16, например:

i i % 16 i i % 16
15 15
1 1 16
2 2 17 1

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

i i / 16 i i / 16
15
1 16 1
2 17 1

Итоговые значения, передаваемые в :

i lcd.setCursor(i % 16, i / 16) i lcd.setCursor(i % 16, i / 16)
lcd.setCursor(0, 0); 15 lcd.setCursor(15, 0);
1 lcd.setCursor(1, 0); 16 lcd.setCursor(0, 1);
2 lcd.setCursor(2, 0); 17 lcd.setCursor(1, 1);

В же передаем аргументом номера символов в памяти дисплея. Вот и все, результат мы уже видели.

Code

To use this display, we will need the libraries which can found on the product page on banggood.com. All we have to do is to install the library and load any of the examples that are designed for this shield. Since the display uses the familiar Adafruit libraries, we can easily build several impressive projects. I have developed a simple program just to demonstrate how easy it is to use the display thanks to the Adafruit libraries! It uses some of the basic functions in order to display text and simple graphics. You can download the code of this simple example for the Arduino 3.5″ Color TFT display by clicking on the download link below or by clicking on the link in the description of the video.

To briefly explain the code, as usual, the first thing we do is include the libraries we will be working with.

#include <Adafruit_GFX.h>    
#include <Adafruit_TFTLCD.h>

Next, we declare the pins of the Arduino to which our LCD is connected to, after which we declare colors for the fonts and its matching hex value.

#define LCD_CS A3 
#define LCD_CD A2 
#define LCD_WR A1 
#define LCD_RD A0 
#define LCD_RESET A4 

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Next, we create an object of the TFTLCD library with the pins to which the LCD is connected to on the Arduino as arguments.

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

With this done, we then write the void setup() function. To begin we clear the LCD of previous settings, then set the type LCD we are using via the LCD.begin function. With this done, we set the rotation of the TFT and proceed to fill the screen with different colors.

void setup() {

  tft.reset();
  tft.begin(0x9481);
  tft.setRotation(1);
  tft.fillScreen(RED);
  tft.fillScreen(GREEN);
  tft.fillScreen(BLUE);
  tft.fillScreen(BLACK);
  delay(1000);

Next, we display some text, which includes one reminding you to subscribe!

tft.setCursor(80,100);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.print("Hello");

  tft.setCursor(220,100);
  tft.setTextColor(RED);
  tft.setTextSize(4);
  tft.print("YouTUBE!");

  tft.fillRect(80,200, 321, 60, RED);

  tft.setCursor(135,215);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.print("Subscribe");

  tft.drawRect(,,480,320,WHITE);
  delay(1000);

Next, we move to the void loop section.
The void loop section basically echoes some of the things we tried under the void setup function. The idea behind all of this is to show you what is possible with this wonderful display.

void loop() 
{
  tft.fillRect(80,200,321,60,BLACK);
  delay(1000);
  tft.fillRect(80,200,321,60,RED);
  tft.setCursor(135,215);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.print("Subscribe");
  delay(1000);
}

The full code can be downloaded by clicking the link below.

Like this post? Please share to your friends: