Panel led de 4 módulos: MAX7219 Esquema de conexión: ^ LED ^ ESP32 ^ | VCC | 3V3 | | GND | GND | | DIN | G23 | | CS | G5 | | CLK | G18 | Utilizaremos la biblioteca (que no librería) md_max72xx https://www.arduino.cc/reference/en/libraries/md_max72xx/ La podemos instalar con el manager de arduino, en tools > Manage Libreries Yo he instalado MD_Parola que te deja hacer efectos. Te dirá que tiene dependencias y le decimos que instale todas. ====== Mensaje sencillo ====== #include #include #include #include // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 5 const char* ssid = "mi_red_wifi"; const char* password = "mi_contraseña_wifi"; IPAddress ip(192,168,1,69); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); IPAddress dns(8,8,8,8); AsyncWebServer server(80); MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { Display.begin(); Display.setIntensity(0); Display.displayClear(); Serial.begin(115200); delay(10); Serial.println('\n'); WiFi.begin(ssid, password); WiFi.config(ip, gateway, subnet, dns); Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print('.'); } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "V1.0 Prueba Panel Led"); }); AsyncElegantOTA.begin(&server); server.begin(); Serial.println("HTTP server started"); Display.print("V 1.0"); delay(1000); } void loop() { Display.setTextAlignment(PA_LEFT); Display.print("Hola"); delay(10000); } Explicación código: Número de paneles: #define MAX_DEVICES 4 Alineamiento y lo que queremos escribir. Display.setTextAlignment(PA_LEFT); Display.print("Hola"); ====== SCROLL ====== Escribe lo que le pongas en el serial: // Use the Parola library to scroll text on the display // // Demonstrates the use of the scrolling function to display text received // from the serial interface // // User can enter text on the serial monitor and this will display as a // scrolling message on the display. // Speed for the display is controlled by a pot on SPEED_IN analog in. // Scrolling direction is controlled by a switch on DIRECTION_SET digital in. // Invert ON/OFF is set by a switch on INVERT_SET digital in. // // UISwitch library can be found at https://github.com/MajicDesigns/MD_UISwitch // // NOTE: MD_MAX72xx library must be installed and configured for the LED // matrix type being used. Refer documentation included in the MD_MAX72xx // library or see this link: // https://majicdesigns.github.io/MD_MAX72XX/page_hardware.html // #include #include // Define the number of devices we have in the chain and the hardware interface // NOTE: These pin numbers will probably not work with your hardware and may // need to be adapted #define MAX_DEVICES 4 //#define CLK_PIN 13 //#define DATA_PIN 11 #define CS_PIN 5 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW // HARDWARE SPI MD_Parola P = MD_Parola(HARDWARE_TYPE,CS_PIN, MAX_DEVICES); // SOFTWARE SPI //MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); uint8_t scrollSpeed = 25; // default frame delay value textEffect_t scrollEffect = PA_SCROLL_LEFT; textPosition_t scrollAlign = PA_LEFT; uint16_t scrollPause = 2000; // in milliseconds // Global message buffers shared by Serial and Scrolling functions #define BUF_SIZE 75 char curMessage[BUF_SIZE] = { "" }; char newMessage[BUF_SIZE] = { "Hello! Enter new message?" }; bool newMessageAvailable = true; void readSerial(void) { static char *cp = newMessage; while (Serial.available()) { *cp = (char)Serial.read(); if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // end of message character or full buffer { *cp = '\0'; // end the string // restart the index for next filling spree and flag we have a message waiting cp = newMessage; newMessageAvailable = true; } else // move char pointer to next position cp++; } } void setup() { Serial.begin(115200); Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline"); P.begin(); P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect); } void loop() { if (P.displayAnimate()) { if (newMessageAvailable) { strcpy(curMessage, newMessage); newMessageAvailable = false; } P.displayReset(); } readSerial(); } ===== Mensaje de **conectando a wifi** mientras conecta ===== #include #include #include #include // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 5 const char* ssid = "mi_red_wifi"; const char* password = "mi_contraseña_wifi"; IPAddress ip(192,168,1,69); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); IPAddress dns(8,8,8,8); AsyncWebServer server(80); MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { Display.begin(); Display.setIntensity(0); Display.displayClear(); Display.displayScroll("CONECTANDO WIFI", PA_CENTER, PA_SCROLL_LEFT, 25); Serial.begin(115200); delay(10); Serial.println('\n'); WiFi.begin(ssid, password); WiFi.config(ip, gateway, subnet, dns); Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) { if (Display.displayAnimate()) { Display.displayReset(); } } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "V1.0 Prueba Panel Led"); }); AsyncElegantOTA.begin(&server); server.begin(); Serial.println("HTTP server started"); delay(1000); } void loop() { } ===== Muestra la IP una vez conectado ===== #include #include #include #include // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 5 const char* ssid = "mi_red_wifi"; const char* password = "mi_contraseña_wifi"; IPAddress ip(192,168,1,69); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); IPAddress dns(8,8,8,8); AsyncWebServer server(80); MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); String my_ip; void setup() { Display.begin(); Display.setIntensity(0); Display.displayClear(); Display.displayScroll("CONECTANDO WIFI", PA_CENTER, PA_SCROLL_LEFT, 25); Serial.begin(115200); delay(10); Serial.println('\n'); WiFi.begin(ssid, password); WiFi.config(ip, gateway, subnet, dns); Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) { if (Display.displayAnimate()) { Display.displayReset(); } } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "V1.0 Prueba Panel Led"); }); AsyncElegantOTA.begin(&server); server.begin(); Serial.println("HTTP server started"); delay(1000); my_ip = WiFi.localIP().toString(); Serial.println(my_ip); Display.displayClear(); Display.displayScroll(my_ip.c_str(), PA_CENTER, PA_SCROLL_LEFT, 25); while(true){ if (Display.displayAnimate()) { Display.displayReset(); break; } } } void loop() { Display.setTextAlignment(PA_LEFT); Display.print("Hola"); delay(10000); } Si cambiamos la parte del while por esto, lo muestra 2 veces for (int muestra_ip = 1; muestra_ip <= 2; muestra_ip++) { while (true) { if (Display.displayAnimate()) { Display.displayReset(); break; } } } ===== Muestra mensaje leido de internet ===== Lee el texto que le indicamos en la web que tengamos en: serverPath = "http://bateriaseko.lobo99.com/prueba_led"; Al leer la cadena le pone un símbolo raro al final solo en la pantalla led, en el serial monitor no. Le quitamos el último carácter con: payload.substring(0,strlen(payload.c_str())-1) #include #include #include #include // Include the Wi-Fi library #include #include #include // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 5 const char* ssid = "mi_red_wifi"; const char* password = "mi_contraseña_wifi"; IPAddress ip(192,168,1,69); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); IPAddress dns(8,8,8,8); AsyncWebServer server(80); const int lectura=5; String power=""; String serverPath = "http://bateriaseko.lobo99.com/prueba_led"; MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { Display.begin(); Display.setIntensity(0); Display.displayClear(); Serial.begin(115200); delay(10); Serial.println('\n'); WiFi.begin(ssid, password); WiFi.config(ip, gateway, subnet, dns); Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print('.'); } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "V1.0 lee el valor de http://bateriaseko.lobo99.com/prueba_led"); }); AsyncElegantOTA.begin(&server); server.begin(); Serial.println("HTTP server started"); Display.print("V 1.0"); delay(1000); } void loop() { AsyncElegantOTA.loop(); Display.setTextAlignment(PA_LEFT); if(WiFi.status()== WL_CONNECTED){ HTTPClient http; // Your Domain name with URL path or IP address with path http.begin(serverPath.c_str()); // Send HTTP GET request int httpResponseCode = http.GET(); if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); String payload = http.getString(); Serial.println(String(payload.toInt())); Serial.println(strlen(payload.c_str())); Display.setTextAlignment(PA_CENTER); Display.print(payload.substring(0,strlen(payload.c_str())-1)); delay(1000); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } } ===== Muestra mensaje leido de internet con scroll ===== #include #include #include #include // Include the Wi-Fi library #include #include #include // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 5 const char* ssid = "mi_red_wifi"; const char* password = "mi_contraseña_wifi"; IPAddress ip(192,168,1,91); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); IPAddress dns(8,8,8,8); AsyncWebServer server(80); String mensaje=""; String serverPath = "http://mensaje.lobo99.com/mensaje.txt"; MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { Display.begin(); Display.setIntensity(0); Display.displayClear(); String mensaje = "Conectando WIFI: " + String(ssid); Display.displayScroll(mensaje.c_str(), PA_CENTER, PA_SCROLL_LEFT, 25); Serial.begin(115200); // Start the Serial communication to send messages to the computer delay(10); Serial.println('\n'); WiFi.begin(ssid, password); // Connect to the network WiFi.config(ip, gateway, subnet, dns); Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect if (Display.displayAnimate()) { Display.displayReset(); } } Serial.println('\n'); Serial.println("Connection established!"); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "V1.0 http://mensaje.lobo99.com/mensaje.txt"); }); AsyncElegantOTA.begin(&server); // Start AsyncElegantOTA server.begin(); Serial.println("HTTP server started"); Display.print("V 1.0"); delay(1000); //Display.displayScroll(payload.c_str(), PA_CENTER, PA_SCROLL_LEFT, 25); Display.setTextAlignment(PA_CENTER); Display.displayScroll("hola", PA_CENTER, PA_SCROLL_LEFT, 25); } void loop() { AsyncElegantOTA.loop(); if(WiFi.status()== WL_CONNECTED){ HTTPClient http; // Your Domain name with URL path or IP address with path http.begin(serverPath.c_str()); // Send HTTP GET request int httpResponseCode = http.GET(); if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); String payload = http.getString(); Serial.println(payload); const char* mensaje=payload.c_str(); Serial.println(mensaje); Display.displayClear(); Display.displayScroll(mensaje, PA_CENTER, PA_SCROLL_LEFT, 25); while(!Display.displayAnimate()) { Serial.println("while"); } } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } }