Comunicação entre dois ESP32

Este tutorial ensina você a criar uma conexão entre dois ESP32 via TCP/IP sobre WiFi e a trocar dados. Um ESP32 atua como cliente TCP e o outro atua como servidor TCP. Também vamos aprender em detalhes por meio de um exemplo:

comunicação entre dois ESP32

Hardware Necessário

2×Módulo de Desenvolvimento ESP32 ESP-WROOM-32
2×Cabo Micro USB
1×(Opcional) Conector de Alimentação DC
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentação para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables ESP32 S3 Starter Kit (ESP32 S3 included)
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.

Comunicação entre dois ESP32 - Visão Geral

Existem muitas formas de fazer o ESP32 #1 se comunicar com o ESP32 #2. Dependendo da distância, podemos escolher uma das formas abaixo:

Métodos Distância
SPI muito curta
I2C muito curta
UART (TTL) muito curta
UART (RS-232/485/422) curta
Bluetooth curta
LoRa longa
WiFi ilimitada(*)

※ Nota:

(*):

  • Se conectarmos os dois ESP32 à Internet, a distância de comunicação é ilimitada
  • Se não conectarmos os dois ESP32 à Internet, mas os conectarmos à mesma rede LAN, a distância de comunicação fica restrita à rede LAN.

Este tutorial vai usar WiFi para a comunicação entre dois ESP32.

Comunicação entre dois ESP32 via WiFi

Dois ESP32 podem se comunicar via WiFi se:

  • Os dois ESP32 estiverem na mesma rede LAN. Eles não precisam se conectar à Internet
  • Os dois ESP32 estiverem em redes LAN diferentes. Eles precisam se conectar à Internet

Existem duas formas de dois ESP32 se comunicarem.

  • Os dois ESP32 se comunicam diretamente: um ESP32 é cliente TCP e o outro é servidor TCP.
  • Os dois ESP32 se comunicam indiretamente por meio de um servidor centralizado (por exemplo, servidor MQTT): os dois ESP32 são clientes TCP. Consulte o tutorial Comunicação ESP32-para-ESP32 via MQTT.

É preciso um protocolo de aplicação que os dois ESP32 usem para se comunicar. Por exemplo:

  • Protocolo próprio sobre TCP puro (diretamente)
  • Modbus TCP (diretamente)
  • HTTP (diretamente)
  • Telnet (diretamente)
  • SSH (diretamente)
  • MQTT (indiretamente via servidor)

※ Nota:

  • O protocolo UDP está fora do escopo deste tutorial.

Aplicação de Exemplo

Vamos realizar a seguinte aplicação: um botão/chave conectado ao ESP32 #1 controla um LED conectado ao ESP32 #2 via WiFi.

comunicação entre dois ESP32

Para simplificar, este tutorial vai usar um protocolo próprio (definido por nós, sem padrão)

Protocolo Próprio

Definimos um protocolo simples da seguinte forma:

  • Criar uma conexão TCP entre o ESP32 #1 e o ESP32 #2
  • ESP32 #1:
    • Cliente TCP: faz ativamente a requisição de conexão TCP ao ESP32 #2
    • Se o estado da chave mudar para ON, o ESP32 #1 envia um byte (comando) com valor 1 ao ESP32 #2.
    • Se o estado da chave mudar para OFF, o ESP32 #1 envia um byte (comando) com valor 0 ao ESP32 #2.
  • ESP32 #2:
    • Servidor TCP: escuta uma requisição de conexão TCP do ESP32 #1. Se houver uma requisição TCP, ele a aceita e a conexão é criada.
    • Se ele receber um byte:
      • Se o valor for 1, acende o LED
      • Se o valor for 0, apaga o LED

      Diagrama de Ligação

      • Diagrama de Ligação do ESP32 #1: CLIENTE TCP + UM BOTÃO/CHAVE
      Diagrama de Ligação do Botão com ESP32

      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.

      • Diagrama de Ligação do ESP32 #2: SERVIDOR TCP + UM LED
      Diagrama de Ligação do LED com ESP32

      This image is created using Fritzing. Click to enlarge image

      ※ Nota:

      É preciso usar um resistor para o LED se ele não tiver um resistor embutido. Temos tutoriais dedicados para botão e LED. Você pode saber mais sobre eles em:

      Código ESP32 para o ESP32 #1

      /* * 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/communication-between-two-esp32 */ // ESP32: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <WiFi.h> #define BUTTON_PIN 21 // ESP32 pin GPIO21 connected to button const char* ssid = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char* password = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char* serverAddress = "192.168.0.180"; // CHANGE TO ESP32#2'S IP ADDRESS const int serverPort = 4080; ezButton button(BUTTON_PIN); // create ezButton WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ESP32: TCP CLIENT + A BUTTON/SWITCH"); // 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"); // connect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("Connected to TCP server"); } else { Serial.println("Failed to connect to TCP server"); } } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("Connection is disconnected"); TCPclient.stop(); // reconnect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("Reconnected to TCP server"); } else { Serial.println("Failed to reconnect to TCP server"); } } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- The button is released, sent command: 0"); } }

      Código ESP32 para o ESP32 #2

      /* * 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/communication-between-two-esp32 */ // ESP32 #2: TCP SERVER + AN LED #include <WiFi.h> #define LED_PIN 18 // ESP32 pin GPIO18 connected to LED #define SERVER_PORT 4080 const char* ssid = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char* password = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP32 #2: TCP SERVER + AN LED"); // 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"); // Print your local IP address: Serial.print("ESP32 #2: TCP Server IP address: "); Serial.println(WiFi.localIP()); Serial.println("ESP32 #2: -> Please update the serverAddress in ESP32 #1 code"); // Start listening for a TCP client (from ESP32 #1) TCPserver.begin(); } void loop() { // Wait for a TCP client from ESP32 #1: WiFiClient client = TCPserver.available(); if (client) { // Read the command from the TCP client: char command = client.read(); Serial.print("ESP32 #2: - Received command: "); Serial.println(command); if (command == '1') digitalWrite(LED_PIN, HIGH); // Turn LED on else if (command == '0') digitalWrite(LED_PIN, LOW); // Turn LED off client.stop(); } }

      Passos Rápidos

      • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
      • Ligue um botão/chave ao ESP32 #1
      • Ligue um LED ao ESP32 #2
      • Abra o Arduino IDE (chamado de Arduino IDE #1)
      • Instale a biblioteca ezButton no Arduino IDE
      • Conecte o ESP32 #1 ao PC por cabo USB e selecione a porta COM do ESP32 #1 no Arduino IDE #1
      • Abra outra janela do Arduino IDE (chamada de Arduino IDE #2) clicando no ícone do Arduino IDE no seu PC (importante!())
      • Conecte o ESP32 #2 ao PC por cabo USB e selecione a porta COM do ESP32 #2 no Arduino IDE #2
      • Copie o código do ESP32 #1, cole no Arduino IDE #1 e salve (com o nome ESP321)
      • Copie o código do ESP32 #2, cole no Arduino IDE #2 e salve (com o nome ESP322)
      • Faça upload do código do ESP32 #2 para o ESP32 #2 primeiro
      • Abra o Serial Monitor no Arduino IDE #2 e obtenha o endereço IP do Servidor TCP
      ∞
      Newbiely | Arduino IDE 2.3.8
      ──
      ☐
      ✕
      File
      Edit
      Sketch
      Tools
      Help
      ESP32 Dev Module
      Newbiely.ino
      ···
      8 Serial.println("Hello World!");
      Output
      Serial Monitor
      Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
      New Line
      9600 baud
      ESP32 #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP32 #1 code
      Ln 11, Col 1
      ESP32 Dev Module on COM15
      2
      • Atualize o endereço IP do Servidor TCP no código do ESP32 #1
      • Faça upload do código do ESP32 #1 para o ESP32 #1
      • Abra o Serial Monitor no Arduino IDE #1
      • Pressione e segure o botão do ESP32 #1 → veja o estado do LED no ESP32 #2 (ON)
      • Solte o botão do ESP32 #1 → veja o estado do LED no ESP32 #2 (OFF)
      • Repita o processo acima várias vezes.
      • Veja a saída nos dois Serial Monitors
        • Serial Monitor do ESP32 #1
        ∞
        Newbiely | Arduino IDE 2.3.8
        ──
        ☐
        ✕
        File
        Edit
        Sketch
        Tools
        Help
        ESP32 Dev Module
        Newbiely.ino
        ···
        8 Serial.println("Hello World!");
        Output
        Serial Monitor
        Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
        New Line
        9600 baud
        ESP32 #1: TCP CLIENT + A BUTTON/SWITCH ESP32 #1: Connected to TCP server ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0
        Ln 11, Col 1
        ESP32 Dev Module on COM15
        2
        • Serial Monitor do ESP32 #2
        ∞
        Newbiely | Arduino IDE 2.3.8
        ──
        ☐
        ✕
        File
        Edit
        Sketch
        Tools
        Help
        ESP32 Dev Module
        Newbiely.ino
        ···
        8 Serial.println("Hello World!");
        Output
        Serial Monitor
        Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
        New Line
        9600 baud
        ESP32 #2: TCP SERVER + AN LED ESP32 #2: TCP Server IP address: 192.168.0.2 ESP32 #2: -> Please update the serverAddress in ESP32 #1 code ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0 ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0 ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0
        Ln 11, Col 1
        ESP32 Dev Module on COM15
        2

        ※ Nota:

        • (): Se você abrir a janela do Arduino IDE #2 por "File" → "New" ou "Open" a partir da janela do Arduino IDE #2, você NÃO conseguirá abrir dois Serial Monitors para dois ESP32 no mesmo PC ao mesmo tempo.
        • Existe uma alternativa a este protocolo próprio. É o Modbus TCP. O protocolo Modbus é padronizado e tem muitas vantagens sobre o protocolo próprio. Veja mais no tutorial ESP32 - Modbus

Vídeo

Como conectar dois ESP32 pela Internet

Veja Como conectar dois dispositivos pela Internet

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