Подключение MAX7219 к ESP32

Драйвер светодиодной матрицы 8×8

Модуль MAX7219 подключается к ESP32 по SPI тремя сигнальными проводами: DIN (MOSI), CLK (SCK) и CS. Питание — 5 В.

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

MAX7219ESP32
CLKGPIO18
CSGPIO5
DINGPIO23
VCC3V3
GNDGND

Схема из примера «Матрица 8×8: первая точка».

⚡ В примере «MAX7219» питается от 3V3 — в симуляторе так проще, и модель это допускает. Настоящий модуль рассчитан на 5 В: подключайте VCC к VIN (5 В от USB) или к отдельному источнику 5 В с общей землёй.

Матрица 8×8: первая точка

Открыть пример целиком

Выводы MAX7219

ВыводНазначение
CLKтактовый сигнал
CSзащёлка (LOAD): по фронту данные попадают в регистры
DINвход данных
VCCпитание 5 В
GNDобщий провод

Код для ESP32

// Выводы к микросхеме: данные, такт, выбор.
const int DIN = 23, CLK = 18, CS = 5;

// Регистры MAX7219. Разряды 1…8 — строки матрицы, остальное настройка.
const byte DECODE = 0x09, INTENSITY = 0x0A;
const byte SCANLIMIT = 0x0B, SHUTDOWN = 0x0C;

// Что горит: по байту на строку. Микросхема свои разряды прочитать не
// даёт, поэтому картинку скетч помнит сам.
byte rows[8];

// Слово в микросхему: адрес регистра и значение, старшим разрядом
// вперёд. Защёлкивается по возврату CS вверх — пока CS внизу, разряды
// просто едут дальше по цепочке.
void send(byte reg, byte value) {
  digitalWrite(CS, LOW);
  shiftOut(DIN, CLK, MSBFIRST, reg);
  shiftOut(DIN, CLK, MSBFIRST, value);
  digitalWrite(CS, HIGH);
}

void setup() {
  pinMode(DIN, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  send(SCANLIMIT, 7);       // работают все восемь строк
  send(DECODE, 0x00);       // знакогенератор не нужен: здесь точки, а не цифры
  send(INTENSITY, 8);
  // После подачи питания микросхема выключена: скетч без этой строки
  // работает правильно и не светит ничем.
  send(SHUTDOWN, 1);
  for (int row = 0; row < 8; row++) send(row + 1, 0);
}

void setLed(int row, int col, bool on) {
  // Старший разряд байта — левый столбец: так разведены модули.
  if (on) rows[row] |= 0x80 >> col;
  else rows[row] &= ~(0x80 >> col);
  send(row + 1, rows[row]);
}

void loop() {
  for (int row = 0; row < 8; row++) {
    for (int col = 0; col < 8; col++) {
      setLed(row, col, true);
      delay(40);
    }
  }
  // Строкой целиком — восемь точек за одну посылку вместо восьми.
  for (int row = 0; row < 8; row++) {
    rows[row] = 0;
    send(row + 1, 0);
    delay(60);
  }
}

Скетч можно править и запускать в симуляторе без платы и установки среды.

Что учесть на ESP32

В железе

По паспорту MAX7219 при питании 5 В считает «единицей» от 3,5 В, а ESP32 выдаёт 3,3 В. Чаще всего работает, но надёжно — через преобразователь уровней (или питать матрицу от 4,0–4,5 В).

Частые ошибки при подключении к ESP32

Другие детали для ESP32