ESP8266 - WebSocket

Neste tutorial, vamos aprender o que é o WebSocket, por que precisamos usá-lo para controlar o ESP8266 de forma fluida e como usar o WebSocket com o ESP8266. Em um exemplo prático, vamos aprender a criar um aplicativo de chat entre o navegador e o ESP8266, permitindo que você:

ESP8266 NodeMCU websocket

Hardware Necessário

1×ESP8266 NodeMCU ESP-12F
1×Alternatively, ESP8266 D1 Mini NodeMCU ESP-12F
1×Alternatively, ESP8266 NodeMCU ESP-12E (Uno-form)
1×Micro USB Cable
1×Alternatively, ESP8266 NodeMCU ESP-12F (SMD-form)
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP8266

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
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.

O que é o Websocket do ESP8266?

Agora você pode estar perguntando: "O que é o WebSocket?" É bem simples: o WebSocket é uma tecnologia que permite que um navegador converse diretamente com um servidor web em tempo real.

  • Sem o WebSocket, você precisa atualizar a página web para obter novidades. Isso não é muito conveniente.
  • Com o WebSocket, a página web e o servidor ficam conectados o tempo todo. Isso significa que eles podem trocar informações instantaneamente, sem precisar recarregar a página.

Você provavelmente já encontrou o WebSocket em aplicativos web do dia a dia, como jogos online, mensagens instantâneas e atualizações do mercado de ações.

Por que precisamos do WebSocket para controlar o ESP8266 de forma fluida?

Imagine que você quer controlar o seu carrinho de controle remoto usando uma interface web no celular ou no computador. Sem o WebSocket, toda vez que você quisesse mudar a direção ou a velocidade do carrinho, precisaria atualizar a página web. É como ter que apertar um botão de "recarregar" cada vez que você quer que o seu comando chegue ao carrinho.

Agora, com o WebSocket, é como ter uma conexão contínua e direta entre o seu celular ou computador e o carrinho. Você não precisa mais atualizar a página toda vez que quer guiar o carrinho ou ajustar a velocidade. É como se o carrinho estivesse sempre ouvindo os seus comandos em tempo real, sem atrasos causados pelo recarregamento constante da página.

Em geral, o WebSocket permite que você:

  • Envie dados do navegador para o ESP8266 sem recarregar a página web.
  • Envie dados do ESP8266 para o navegador sem recarregar a página web.

Isso permite a comunicação nos dois sentidos em tempo real.

Benefícios do WebSocket com o ESP8266:

  • Controle em Tempo Real: O WebSocket permite a comunicação instantânea com o ESP8266, garantindo respostas rápidas aos comandos para uma experiência de uso fluida.
  • Conexão Persistente: Mantenha um vínculo contínuo sem atualizar a página de controle, criando uma linha de comunicação sempre pronta para instruções imediatas.
  • Eficiência: Tenha respostas rápidas sem a necessidade de recarregar a página constantemente, melhorando a satisfação geral e a eficiência.

Chat Web com o ESP8266 via WebSocket

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 na Arduino IDE:

  • Um arquivo .ino que é 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

  • Se esta for a primeira vez que você usa o ESP8266, veja como configurar o ambiente para o ESP8266 na Arduino IDE.
  • Conecte a placa ESP8266 ao seu PC por um cabo micro USB
  • Abra a Arduino IDE no seu PC.
  • Selecione a placa ESP8266 certa (por exemplo, NodeMCU 1.0 (ESP-12E Module)) e a porta COM.
  • Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda da Arduino IDE.
  • Pesquise “WebSockets” e encontre o WebSockets criado por Markus Sattler.
  • Clique no botão Install para instalar a biblioteca WebSockets.
ESP8266 NodeMCU WebSockets library
  • 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 com a 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-websocket */ #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include "index.h" const char* ssid = "YOUR_WIFI_SSID"; // CHANGE IT const char* password = "YOUR_WIFI_PASSWORD"; // CHANGE IT ESP8266WebServer server(80); // Web server on port 80 DIYables_ESP32_WebSocket* webSocket; 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: Serial.printf("[%u] Received text: %s\n", num, payload); // Send a response back to the client String echoMessage = "Received: " + String((char*)payload); webSocket.sendTXT(num, echoMessage); break; } } void setup() { Serial.begin(9600); delay(500); // Connect to Wi-Fi WiFi.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(); // TODO: Your code here }
  • Crie o arquivo index.h na Arduino IDE da seguinte forma:
    • Clique no botão logo abaixo do ícone do Serial Monitor e escolha New Tab, ou use as teclas Ctrl+Shift+N.
    Arduino IDE 2 adds file
    • Dê ao arquivo o nome index.h e clique no botão OK
    Arduino IDE 2 adds file index.h
    • 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-websocket */ const char *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"> <button class="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> )=====";
    • Modifique as informações de WiFi (SSID e senha) no código para corresponder às credenciais da sua própria rede.
    • Agora você tem o código em dois arquivos: newbiely.com.ino e index.h
    • Clique no botão Upload da Arduino IDE para fazer upload do código para o ESP8266.
    • Abra o Serial Monitor
    • Confira o resultado no Serial Monitor.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.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.5
    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 no seu celular ou PC.
    • Você verá a página web como abaixo:
    ESP8266 NodeMCU websocket web browser
    • 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.
    ESP8266 NodeMCU websocket chat server

    ※ 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 upload do código para o ESP8266, a Arduino IDE não vai 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 do ESP8266 acima contém uma explicação linha por linha. Por favor, leia os comentários no código!

Como o Sistema Funciona

O código do ESP8266 funciona criando um servidor web e um servidor WebSocket. O processo acontece assim:

  • Quando você digita o endereço IP do ESP8266 em um navegador, é feita uma requisição da página web (Interface do Usuário) ao ESP8266.
  • O servidor web do ESP8266 responde transmitindo o conteúdo da página web (HTML, CSS, JavaScript).
  • Em seguida, o seu navegador exibe a página web.
  • Quando você clica no botão CONNECT, o código JavaScript embutido na página web estabelece uma conexão WebSocket com o servidor WebSocket no ESP8266.
  • Com a conexão WebSocket estabelecida, quando você digita algo e clica no botão SEND, o código JavaScript envia esse texto ao ESP8266 pela conexão WebSocket, em segundo plano.
  • Ao receber o valor do ângulo, o servidor WebSocket envia uma resposta de volta à página web.

Você pode conhecer outros exemplos de WebSocket com o ESP8266 abaixo:

※ NOSSAS MENSAGENS

  • 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!