Біжучий рядок на матриці MAX7219 з текстом із браузера
Чотири матриці 8×8 утворюють яскравий біжучий рядок. Текст змінюємо з телефона через просту веб-форму — для майстерні, кав'ярні чи дитячої кімнати.
Що отримаємо
Модуль FC-16 — це чотири світлодіодні матриці 8×8 на драйверах MAX7219, з'єднані в ланцюжок (разом 32×8 точок). Бібліотека MD_Parola бере на себе шрифти, прокрутку та десятки анімацій, а ESP32 додає веб-форму: відкриваєте сторінку на телефоні, вводите текст — і він одразу біжить по табло.
Компоненти
- ESP32 DevKit
- Модуль MAX7219 4-in-1 (FC-16), 32×8
- 5 дротів мама-мама
Підключення
| MAX7219 | ESP32 |
|---|---|
| VCC | 5V (VIN) |
| GND | GND |
| DIN | GPIO 23 (MOSI) |
| CS | GPIO 5 |
| CLK | GPIO 18 (SCK) |
Матриці на повній яскравості можуть споживати до 1 А — для довгих ланцюжків живіть їх від окремого 5 В блока. MAX7219 зазвичай нормально сприймає 3.3 В логіку ESP32.
Бібліотеки
- MD_Parola
- MD_MAX72XX (залежність)
Код
#include <WiFi.h>
#include <WebServer.h>
#include <SPI.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 5
const char* WIFI_SSID = "YOUR_SSID";
const char* WIFI_PASS = "YOUR_PASSWORD";
MD_Parola display(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
WebServer server(80);
char message[128] = "Hello from ESP32!";
const char PAGE[] = R"rawliteral(
<!doctype html><html><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>LED Ticker</title>
<style>body{font-family:system-ui;max-width:420px;margin:40px auto;padding:0 16px}
input,button{font-size:1.1rem;padding:10px;width:100%;box-sizing:border-box;margin-top:8px}</style>
</head><body>
<h2>LED Ticker</h2>
<form action="/set">
<input name="msg" maxlength="120" placeholder="Text (Latin letters)" autofocus>
<input name="speed" type="range" min="20" max="150" value="60">
<button>Show</button>
</form></body></html>
)rawliteral";
void handleSet() {
String text = server.arg("msg");
// Стандартний шрифт має лише ASCII — відкидаємо інші символи
String clean;
for (unsigned int i = 0; i < text.length(); i++) {
char c = text[i];
if (c >= 32 && c < 127) clean += c;
}
clean.trim();
if (clean.length()) {
clean.toCharArray(message, sizeof(message));
}
int speed = server.arg("speed").toInt();
if (speed >= 20 && speed <= 150) display.setSpeed(speed); // мс на крок: менше — швидше
display.displayReset();
server.sendHeader("Location", "/");
server.send(303);
}
void setup() {
Serial.begin(115200);
display.begin();
display.setIntensity(3); // яскравість 0..15
display.displayText(message, PA_LEFT, 60, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
display.displayAnimate();
delay(10);
}
// Показуємо IP, щоб знати, куди заходити
snprintf(message, sizeof(message), "IP %s", WiFi.localIP().toString().c_str());
display.displayReset();
server.on("/", [] { server.send(200, "text/html", PAGE); });
server.on("/set", handleSet);
server.begin();
}
void loop() {
server.handleClient();
if (display.displayAnimate()) {
display.displayReset(); // прокрутка закінчилась — починаємо знову
}
}
Перевірка
- Після ввімкнення на табло пробіжить
Hello from ESP32!, а після підключення до Wi-Fi —IP 192.168.x.x. - Відкрийте цю адресу на телефоні, введіть текст, пересуньте повзунок швидкості, натисніть Show.
Якщо щось не так
- Текст задом наперед або «розсипаний» по матрицях — спробуйте інший тип:
PAROLA_HW,GENERIC_HWабоICSTATION_HW. - Горять усі точки або нічого — перевірте DIN/CLK/CS і спільну землю.
- Кирилиця: стандартний шрифт її не має. MD_MAX72XX дозволяє підключити власний шрифт — у репозиторії бібліотеки є інструкція та утиліта для створення шрифтів.
Ідеї
- Годинник: показуйте час з NTP (див. проєкт «Точний годинник») у режимі
PA_CENTERбез прокрутки. - Лічильник підписників YouTube чи курс валют через HTTP API.
- Ланцюжок з 8–12 модулів для великого табло — змініть
MAX_DEVICES.