Neste tutorial, vamos aprender a controlar um painel de matriz de LED por meio de uma interface web usando o ESP32. Em detalhes, vamos programar o ESP32 para se tornar um servidor web que faz o seguinte:
Retorna uma interface web aos usuários ao receber uma requisição de um navegador web.
Fornece a interface web pela qual os usuários podem enviar a mensagem ao ESP32
Exibe as mensagens na matriz de LED assim que recebe a mensagem.
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.
Sobre a Matriz de LED e o Servidor Web
Podemos usar HTTP puro para enviar um texto da interface web para o ESP32. No entanto, usar WebSocket faz com que pareça mais responsivo e não adiciona muita dificuldade, então neste tutorial vamos usar o WebSocket.
Não conhece a Matriz de LED, o Servidor Web e o WebSocket, incluindo suas pinagens, funcionamento e programação? Explore tutoriais completos sobre esses temas abaixo:
This image is created using Fritzing. Click to enlarge image
Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.
Código ESP32
O conteúdo da página web (HTML, CSS, JavaScript) é armazenado separadamente em um arquivo index.h. Assim, teremos dois arquivos de código na Arduino IDE:
Um arquivo .ino, que é o código do ESP32, que cria um servidor web e um servidor WebSocket
Um arquivo .h, que contém o conteúdo da página web.
Conecte a placa ESP32 ao seu PC por meio de um cabo USB Type-C
Abra a Arduino IDE no seu PC.
Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
Abra o Library Manager clicando no ícone Library Manager na barra de navegação esquerda da Arduino IDE.
Pesquise “DIYables ESP32 WebServer” e encontre a biblioteca Web Server criada pela DIYables.
Clique no botão Install para instalar a biblioteca Web Server.
Pesquise “MD_Parola” e encontre a biblioteca MD_Parola
Clique no botão Install.
Será solicitado que você instale a biblioteca “MD_MAX72XX”
Clique no botão Install All para instalar a dependência.
Na Arduino IDE, crie um novo sketch e dê um nome a ele, por exemplo, newbiely.com.ino
Copie o código abaixo e abra-o na Arduino IDE
/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-led-matrix-via-web*/#include <DIYables_ESP32_WebServer.h>#include"index.h"#include <MD_Parola.h>#include <MD_MAX72xx.h>#define HARDWARE_TYPE MD_MAX72XX::FC16_HW#define MAX_DEVICES 4 // 4 blocks#define CS_PIN 21 // ESP32 pin GPIO21// WiFi credentialsconstchar WIFI_SSID[] = "YOUR_WIFI_SSID";constchar WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";// Create web server instanceDIYables_ESP32_WebServer server;DIYables_ESP32_WebSocket* webSocket;// create an instance of the MD_Parola classMD_Parola ledMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);// Web Page handlersvoid handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { server.sendResponse(client, HTML_CONTENT);}// WebSocket event handlersvoid onWebSocketOpen(net::WebSocket& ws) {Serial.println("New WebSocket connection");// Send welcome messageconstchar welcome[] = "Connected to ESP32 WebSocket Server!";}void onWebSocketMessage(net::WebSocket& ws, const net::WebSocket::DataType dataType, const char* message, uint16_tlength) {Serial.print("WebSocket Received (");Serial.print(length);Serial.print(" bytes): ");Serial.println(message); ledMatrix.displayClear(); // clear led matrix display ledMatrix.displayScroll(message, PA_CENTER, PA_SCROLL_LEFT, 100);// Broadcast response to all connected clients using the libraryif (webSocket != nullptr) {String response = "Displayed: " + String(message) + "on LED Matrix"; webSocket->broadcastTXT(response);Serial.print("WebSocket sent (");Serial.print(response.length());Serial.print(" bytes): ");Serial.println(response); }}void onWebSocketClose(net::WebSocket& ws, const net::WebSocket::CloseCode code, const char* reason, uint16_tlength) {Serial.println("WebSocket client disconnected");}voidsetup() {Serial.begin(9600);delay(1000);Serial.println("ESP32 Web Server and WebSocket Server"); ledMatrix.begin(); // initialize the object ledMatrix.setIntensity(15); // set the brightness of the LED matrix display (from 0 to 15) ledMatrix.displayClear(); // clear led matrix display ledMatrix.displayScroll("esp32io.com", PA_CENTER, PA_SCROLL_LEFT, 100);// Configure web server routes server.addRoute("/", handleHome);// Start web server with WiFi connection server.begin(WIFI_SSID, WIFI_PASSWORD);// Enable WebSocket functionality webSocket = server.enableWebSocket(81);if (webSocket != nullptr) {// Set up WebSocket event handlers webSocket->onOpen(onWebSocketOpen); webSocket->onMessage(onWebSocketMessage); webSocket->onClose(onWebSocketClose); } else {Serial.println("Failed to start WebSocket server"); }}voidloop() {// Then handle HTTP requests server.handleClient();// Handle WebSocket server.handleWebSocket();if (ledMatrix.displayAnimate()) { ledMatrix.displayReset(); }}
Crie o arquivo index.h na Arduino IDE assim:
Clique no botão logo abaixo do ícone do Serial Monitor e escolha New Tab, ou use as teclas Ctrl+Shift+N.
Dê ao arquivo o nome index.h e clique no botão OK
Copie o código abaixo e cole-o no index.h.
/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-led-matrix-via-web*/constchar *HTML_CONTENT = R"=====(<!DOCTYPE html><!-- saved from url=(0019)http://192.168.0.2/ --><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><title>ESP32 WebSocket</title><meta name="viewport" content="width=device-width, initial-scale=0.7"><link rel="icon" href="https://diyables.io/images/page/diyables.svg"><style>/* Add some basic styling for the chat window */body { font-size: 16px;}.chat-container { width: 400px; margin: 0 auto; padding: 10px;}.chat-messages { height: 250px; overflow-y: auto; border: 1px solid #444; padding: 5px; margin-bottom: 5px;}.user-input {display: flex; margin-bottom: 20px;}.user-input input { flex: 1; border: 1px solid #444; padding: 5px;}.user-input button { margin-left: 5px; background-color: #007bff; color: #fff; border: none; padding: 5px 10px;cursor: pointer;}.websocket {display: flex; align-items: center; margin-bottom: 5px;}.websocket button { background-color: #007bff; color: #fff; border: none; padding: 5px 10px;cursor: pointer;}.websocket .label { margin-left: auto;}</style><script>var ws;var wsm_max_len = 4096; /* bigger length causes uart0 buffer overflow with low speed smart device */function update_text(text) { var chat_messages = document.getElementById("chat-messages"); chat_messages.innerHTML += text + '<br>'; chat_messages.scrollTop = chat_messages.scrollHeight;}function send_onclick() {if(ws != null) { var message = document.getElementById("message").value;if (message) { document.getElementById("message").value = ""; ws.send(message + "\n"); update_text('<span style="color:navy">' + message + '</span>');// You can send the message to the server or process it as needed } }}function connect_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close();}function ws_onopen() { document.getElementById("ws_state").innerHTML = "<span style='color:blue'>CONNECTED</span>"; document.getElementById("bt_connect").innerHTML = "Disconnect"; document.getElementById("chat-messages").innerHTML = "";}function ws_onclose() { document.getElementById("ws_state").innerHTML = "<span style='color:gray'>CLOSED</span>"; document.getElementById("bt_connect").innerHTML = "Connect"; ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null;}function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // MessageEvent console.log(e_msg.data); update_text('<span style="color:blue">' + e_msg.data + '</span>');}</script></head><body> <div class="chat-container"> <h2>ESP32 WebSocket</h2> <div class="websocket"> <buttonclass="connect-button" id="bt_connect" onclick="connect_onclick()">Connect</button> <span class="label">WebSocket: <span id="ws_state"><span style="color:blue">CLOSED</span></span></span> </div> <div class="chat-messages" id="chat-messages"></div> <div class="user-input"> <input type="text" id="message" placeholder="Type your message..."> <button onclick="send_onclick()">Send</button> </div> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div></div></body></html>)=====";
Agora você tem o código em dois arquivos: newbiely.com.ino e index.h
Clique no botão Upload na Arduino IDE para carregar o código no ESP32.
Abra o Serial Monitor
Confira o resultado no Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Connecting to WiFi...
Connected to WiFi
ESP32 Web Server's IP address IP address: 192.168.0.2
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Anote o endereço IP exibido e digite esse endereço na barra de endereços de um navegador web no seu smartphone ou PC.
Você verá a página web como abaixo:
Clique no botão CONNECT para conectar a página web ao ESP32 via WebSocket.
Digite algumas palavras e envie-as ao ESP32.
Você verá a resposta do ESP32.
※ Nota:
Se você modificar o conteúdo HTML no index.h e não alterar nada no arquivo newbiely.com.ino, ao compilar e carregar o código no ESP32, a Arduino IDE não atualizará o conteúdo HTML.
Para fazer a Arduino IDE atualizar o conteúdo HTML nesse caso, faça uma alteração no arquivo newbiely.com.ino (por exemplo, adicionar uma linha vazia, adicionar um comentário....)
Explicação do Código Linha por Linha
O código ESP32 acima contém explicação linha por linha. Leia os comentários no código!
Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!