Comunicação entre dois ESP8266

Este guia mostra como estabelecer uma conexão entre dois dispositivos ESP8266 usando TCP/IP sobre WiFi e trocar dados. Um ESP8266 funcionará como cliente TCP, enquanto o outro atuará como servidor TCP. Vamos explorar esse processo com um exemplo:

Hardware Necessário

2×ESP8266 NodeMCU
2×Cabo Micro USB
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.

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

Vamos pensar em um exemplo específico: o ESP8266 #1 interagindo com o ESP8266 #2. Existem várias maneiras de permitir a comunicação entre os dois ESP8266. Podemos escolher uma delas de acordo com a distância da comunicação. A tabela abaixo mostra alguns métodos e o alcance de comunicação correspondente.

Métodos Alcance
I2C muito curto
SPI muito curto
UART (TTL) muito curto
UART (RS-232/485/422) curto
Bluetooth curto
LoRa longo
Ethernet/WiFi ilimitado(*)

※ Nota:

  • Se dois ESP8266 estiverem conectados à Internet, o alcance da comunicação é irrestrito.
  • No entanto, se dois ESP8266 não estiverem conectados à Internet, mas sim à mesma rede LAN, o alcance da comunicação fica restrito a essa rede local.

Entre os métodos mencionados acima, este tutorial usa WiFi para permitir a comunicação entre dois ESP8266, pois ele oferece um alcance de comunicação ilimitado.

Comunicação entre dois ESP8266 via LAN local ou Internet

Dois ESP8266 podem se comunicar entre si por WiFi quando:

  • Estão na mesma rede local (LAN), e uma conexão com a Internet não é necessária
  • Estão em LANs diferentes, e uma conexão com a Internet é necessária

Não importa se dois ESP8266 estão conectados dentro de uma rede LAN local ou pela Internet, existem duas formas de comunicação:

Na comunicação direta, normalmente um ESP8266 é o cliente TCP e o outro é o servidor TCP.

Ao usar um servidor centralizado para a comunicação, normalmente os dois ESP8266 atuam como clientes TCP.

Ao decidir sobre um protocolo de aplicação para a comunicação entre dois ESP8266, temos várias opções:

  • Protocolo próprio sobre TCP puro
  • Modbus TCP
  • HTTP
  • Telnet
  • SSH
  • MQTT (que exige um servidor centralizado)

Exemplo de Aplicação

Vamos tornar realidade o seguinte programa: um botão/interruptor conectado ao ESP8266 #1 será usado para ligar e desligar um LED conectado ao ESP8266 #2 por WiFi.

comunicação entre dois esp8266

Como dito antes, existem alguns protocolos de aplicação disponíveis. Para simplificar este exemplo, vamos criar nosso próprio protocolo (um protocolo próprio).

Protocolo Próprio

Vamos definir um protocolo simples:

  • Estabelecer uma conexão TCP entre o ESP8266 #1 e o ESP8266 #2
  • ESP8266 #1:
    • Comportar-se como cliente TCP, iniciando a conexão TCP com o ESP8266 #2
    • Quando o interruptor for ligado (ON), enviar um byte (comando) com valor 1 para o ESP8266 #2.
    • Quando o interruptor for desligado (OFF), enviar um byte (comando) com valor 0 para o ESP8266 #2.
  • ESP8266 #2:
    • Atuar como servidor TCP, aguardando pedidos de conexão TCP do ESP8266 #1
    • Se o byte recebido for 1, ligar o LED
    • Se o byte recebido for 0, desligar o LED

    Diagrama de Ligação

    • ESP8266 #1 - Diagrama de ligação entre o ESP8266 e o botão
    Diagrama de Ligação do Botão com ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

    • ESP8266 #2 - Diagrama de ligação entre o ESP8266 e o LED
    Diagrama de Ligação do LED com ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Código ESP8266 para o ESP8266 #1

    /* * 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/communication-between-two-esp8266 */ #include <ezButton.h> #include <ESP8266WiFi.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button #define SERVER_IP "192.168.0.180" #define SERVER_PORT 4080 ezButton button(BUTTON_PIN); // create ezButton attached to pin D7 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ESP8266 #1: TCP CLIENT + A BUTTON/SWITCH"); // Connect to WiFi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Connect to TCP server (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: Connected to TCP server"); else Serial.println("ESP8266 #1: Failed to connect to TCP server"); } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("ESP8266 #1: Connection is disconnected"); TCPclient.stop(); // Reconnect to TCP server (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: Reconnected to TCP server"); else Serial.println("ESP8266 #1: Failed to reconnect to TCP server"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("ESP8266 #1: - The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("ESP8266 #1: - The button is released, sent command: 0"); } }

    Código ESP8266 para o ESP8266 #2

    /* * 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/communication-between-two-esp8266 */ #include <ESP8266WiFi.h> #define LED_PIN D6 // The ESP8266 pin connected to LED #define SERVER_PORT 4080 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: TCP SERVER + AN LED"); // Connect to Wi-Fi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Start the TCP server TCPserver.begin(); } void loop() { // Check if a client has connected WiFiClient client = TCPserver.available(); if (client) { // Read the command from the TCP client char command = client.read(); Serial.print("ESP8266 #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(); // Close the connection } }

    Passos Rápidos

    Para começar com o ESP8266 na Arduino IDE, siga estes passos:

    • Confira o tutorial como configurar o ambiente para ESP8266 na Arduino IDE se esta for a sua primeira vez usando o ESP8266.
    • Ligue os componentes como mostrado no diagrama.
    • Conecte as duas placas ESP8266 ao seu computador usando um cabo USB.
    • Abra a Arduino IDE (chamada de Arduino IDE #1).
    • Abra a Arduino IDE (chamada de Arduino IDE #2).
    • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e sua respectiva porta COM.
    • Instale a biblioteca ezButton na Arduino IDE.
    • Copie o código do ESP8266 #1, cole na Arduino IDE #1 e salve (com o nome ESP8266-1).
    • Copie o código do ESP8266 #2, cole na Arduino IDE #2 e salve (com o nome ESP8266-2).
    • Faça o upload do código do ESP8266 #2 para o ESP8266 #2 primeiro.
    • Abra o Serial Monitor na Arduino IDE #2 e obtenha o endereço IP do servidor TCP.
    ∞
    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
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2
    • Altere o endereço IP do servidor TCP no código do ESP8266 #1.
    • Faça o upload do código do ESP8266 #1 para o ESP8266 #1
    • Abra o Serial Monitor na Arduino IDE #1.
    • Pressione e segure o botão do ESP8266 #1 e observe o estado do LED do ESP8266 #2 (deve estar ligado).
    • Solte o botão do ESP8266 #1 e observe o estado do LED do ESP8266 #2 (deve estar desligado).
    • Pressione, segure e solte o botão várias vezes.
    • Confira a saída no Serial Monitor #1:
    ∞
    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
    ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0 ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2
    • Confira a saída no Serial Monitor #2:
    ∞
    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
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0 ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0 ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

Vídeo

Como conectar dois ESP8266 pela Internet

Existem dois tipos de endereço IP: privado e público. O endereço IP normalmente usado em uma rede doméstica é privado.

É fácil reconhecer um endereço IP privado. Existem três formatos de endereço IP privado: 10.x.x.x, 172.16.x.x, 192.168.x.x

Não é importante usar o endereço IP privado nos seguintes cenários:

  • Quando dois ESP8266 estão dentro da mesma rede local, independentemente de estarem se comunicando diretamente ou por meio de um servidor centralizado, e independentemente de a LAN estar conectada à internet ou não.
  • Quando dois ESP8266 estão em redes locais separadas e se comunicam entre si por meio de um servidor centralizado.

No caso de dois ESP8266 estarem em redes LAN diferentes e se comunicarem diretamente, o cliente TCP ESP8266 pode usar um endereço IP privado. No entanto, o servidor TCP ESP8266 deve usar:

  • Um endereço IP público
  • Um endereço IP privado com "Port Forwarding" no roteador/Access Point

A técnica de "Port Forwarding" varia de roteador/AP para roteador/AP. Este tutorial não aborda esse assunto.

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