Neste tutorial, vamos aprender a controlar uma placa de sinalização com matriz de LED por meio de uma interface web usando o ESP8266. Em detalhes, vamos programar o ESP8266 para se tornar um servidor web que faz o seguinte:
Retorna uma interface web ao usuário ao receber uma requisição de um navegador web.
Fornece a interface web na qual os usuários podem enviar a mensagem ao ESP8266
Exibe as mensagens na matriz de LED ao receber 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 ESP8266. Porém, usar WebSocket deixa tudo 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, funcionalidades e programação? Explore tutoriais completos sobre esses assuntos abaixo:
O conteúdo da página web (HTML, CSS, JavaScript) fica armazenado separadamente em um arquivo index.h. Assim, teremos dois arquivos de código no Arduino IDE:
Um arquivo .ino com o código do ESP8266, que cria um servidor web e um servidor WebSocket
Um arquivo .h, que contém o conteúdo da página web.
Passos Rápidos
Para começar com o ESP8266 no Arduino IDE, siga estes passos:
Faça a ligação dos componentes conforme mostrado no diagrama.
Conecte a placa ESP8266 ao seu computador usando um cabo USB.
Abra o Arduino IDE no seu computador.
Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda do Arduino IDE.
Pesquise “WebSockets” e encontre a biblioteca WebSockets criada por Markus Sattler.
Clique no botão Install para instalar a biblioteca WebSockets.
Pesquise “MD_Parola” e encontre a biblioteca MD_Parola
Clique no botão Install.
Você será solicitado a instalar a biblioteca “MD_MAX72XX”
Clique no botão Install All para instalar a dependência.
No Arduino IDE, crie um novo sketch e dê um nome a ele, por exemplo, newbiely.com.ino
Copie o código abaixo e abra com o Arduino IDE
/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-led-matrix-via-web*/#include <ESP8266WiFi.h>#include <ESP8266WebServer.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 D8 // The ESP8266 pinconst char* ssid = "YOUR_WIFI_SSID"; // CHANGE ITconst char* password = "YOUR_WIFI_PASSWORD"; // CHANGE ITESP8266WebServer server(80); // Web server on port 80DIYables_ESP32_WebSocket* webSocket;// create an instance of the MD_Parola classMD_Parola ledMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {switch (type) {case WStype_DISCONNECTED:Serial.printf("[%u] Disconnected!\n", num);break;case WStype_CONNECTED: {IPAddress ip = webSocket.remoteIP(num);Serial.printf("[%u] Connected from %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]); }break;case WStype_TEXT:String text = String((char*)payload);Serial.println("Received: " + text); ledMatrix.displayClear(); // clear led matrix display ledMatrix.displayScroll(text.c_str(), PA_CENTER, PA_SCROLL_LEFT, 100);String echoMessage = "Displayed: " + String((char*)payload) + " on LED Matrix"; webSocket.sendTXT(num, echoMessage));break; }}voidsetup() {Serial.begin(9600); 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("newbiely.com", PA_CENTER, PA_SCROLL_LEFT, 100);delay(1000);// Connect to Wi-FiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi..."); }Serial.println("Connected to WiFi");// Initialize WebSocket server webSocket.begin(); webSocket.onEvent(webSocketEvent);// Serve a basic HTML page with JavaScript to create the WebSocket connection server.on("/", HTTP_GET, []() {Serial.println("Web Server: received a web page request");String html = HTML_CONTENT; // Use the HTML content from the index.h file server.send(200, "text/html", html); }); server.begin(); Serial.print("ESP8266 Web Server's IP address: "); Serial.println(WiFi.localIP());}void loop() {// Handle client requests server.handleClient();// Handle WebSocket events webSocket.loop();if (ledMatrix.displayAnimate()) { ledMatrix.displayReset(); }}
Crie o arquivo index.h no Arduino IDE:
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 no index.h.
/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-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>ESP8266 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>ESP8266 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 no Arduino IDE para fazer o upload do código para o ESP8266.
Abra o Serial Monitor
Veja o resultado no Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Connecting to WiFi...
Connected to WiFi
ESP8266 Web Server's IP address IP address: 192.168.0.2
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E 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 celular ou PC.
Você verá a página web como abaixo:
Clique no botão CONNECT para conectar a página web ao ESP8266 via WebSocket.
Digite algumas palavras e envie-as ao ESP8266.
Você verá a resposta do ESP8266.
※ Nota:
Se você modificar o conteúdo HTML no index.h e não mexer em nada no arquivo newbiely.com.ino, quando você compilar e fizer o upload do código para o ESP8266, o Arduino IDE não atualizará o conteúdo HTML.
Para fazer o 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 do ESP8266 acima contém uma explicação linha por linha. Por favor, 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!