Для реализации бегущей строки нам понадобится:
Плата NodeMCU: http://ali.pub/1qdz7a
Матрица 8×8: http://ali.pub/1uwnyl
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Данный скетч работает таким образом:
ESP8266 подключается к wi-fi сети, получает ip адрес автоматически, полученный ip адрес можно посмотреть в мониторе порта. При переходе по полученному адресу через браузер, увидим следующее поле:
В данное поле вводим текст, который хотим чтоб отображался на матрице и нажимаем кнопку “Применить”. После чего на нашем дисплее выводится введенный текст.
Схема подключения у нас выглядит вот так:
Matrix | D7 | D5 | D3 | VCC | Gnd |
NodeMCU | DIN | Clk | CS | 3.3v | Gnd |
Собственно сам скетч:
/* Подключения: NodeMCU -> Matrix MOSI-D7-GPIO13 -> DIN CLK-D5-GPIO14 -> Clk GPIO0-D3 -> CS */ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> const char* ssid = "NETGEAR"; //Имя wi-fi сети const char* password = "test"; //пароль ESP8266WebServer server(80); Max72xxPanel matrix = Max72xxPanel(D3, 4, 1); //D3-Пин подключения cs, 4- количество матриц по горизонтали, 1 - количество по вертикали unsigned long ticker_next; String tape = "psenyukov.ru"; int spacer = 1; int width = 5 + spacer; const char page[] = "<html>" "<meta charset=\"utf-8\">" "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" "<title>Ticker control</title>" "<body>" " <form action=\"\" method=\"post\">" "<input type=\"text\" name=\"text\"/>" "<input type=\"submit\" value=\"Применить\">" "</form> " "</body>" "</html>"; String utf8rus(String source){ int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } // switch m[0] = n; target = target + String(m); } return target; } void handleSubmit(){ tape = utf8rus(server.arg("text")); server.send(200, "text/html", page); } void handleRoot() { if (server.hasArg("text")) { handleSubmit(); } else { server.send(200, "text/html", page); } } void setup(void){ tape = utf8rus("psenyukov.ru"); Serial.begin(115200); delay(10); // Подключаемся к сети WiFi Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); // Ожидание подключения while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.on("/", handleRoot); server.begin(); // Вывод полученного IP адреса Serial.println(WiFi.localIP()); matrix.setIntensity(7); //яркость matrix.setRotation(0, 1); // 1 матрица matrix.setRotation(1, 1); // 2 матрица matrix.setRotation(2, 1); // 3 матрица matrix.setRotation(3, 1); // 4 матрица } void handleTicker(){ for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1); server.handleClient(); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ server.handleClient(); handleTicker(); }
Ссылка на скетч: https://yadi.sk/d/QM3f__953NCotx
Для корректной работы скетча нужно скачать следующие библиотеки:
Adafruit_GFX_Library: https://yadi.sk/d/BxfKUBu53NAcSp
arduino-Max72xxPanel-master: https://yadi.sk/d/_sMXrMoC3NAcYj
Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.