Communication between two ESP32
This tutorial instructs you how to create connection between two ESP32 via TCP/IP over WiFi and exchange data. One ESP32 acts as a TCP client and the other acts as TCP server. We also learn in detail by an example:
- ESP32 #1 connects to a button and acts as TCP client.
- ESP32 #2 connects to an LED and acts as TCP server.
- Two ESP32 connects to each other though the internet .
- When the button on ESP32 #1 is pressed, the LED on ESP32 #2 is on.
Hardware Used In This Tutorial
2 | × | ESP-WROOM-32 Dev Module | |
2 | × | Micro USB Cable | |
1 | × | (Optional) DC Power Jack | |
1 | × | Breadboard | |
1 | × | Jumper Wires | |
1 | × | (Recommended) Screw Terminal Expansion Board for ESP32 |
Or you can buy the following sensor kits:
1 | × | DIYables Sensor Kit (30 sensors/displays) | |
1 | × | DIYables Sensor Kit (18 sensors/displays) |
Communication between two ESP32 - Overview
There are many ways to make ESP32 #1 communicate with ESP32 #2. Depending on the distance, we can choose one of the below ways:
Methods | Distance |
---|---|
SPI | very short |
I2C | very short |
UART (TTL) | very short |
UART (RS-232/485/422) | short |
Bluetooth | short |
LoRa | long |
WiFi | unlimited(*) |
※ NOTE THAT:
(*):
- If we connect both ESP32 to the Internet, the communication distance is unlimited
- If we does not connect both ESP32 to the Internet, but we connect them to the same LAN network, the communication distance is restricted within the LAN network.
This tutorial is going to use WiFi for communication between two ESP32.
Communication between two ESP32 via WiFi
Two ESP32 can communicate with each other via WiFi if:
- Two ESP32 in the same LAN network. They does not need to connect to Internet
- Two ESP32 in the different LAN networks. They need to connect to Internet
There are two ways that two ESP32 can communicate to each other.
- Two ESP32 communicate with each other directly: one ESP32 is a TCP client, the other is a TCP server.
- Two ESP32 communicate with each other indirectly via a centralized server (e.g. MQTT server): both ESP32 are TCP clients. Refer to ESP32-to-ESP32 Communication via MQTT tutorial.
It needs an application protocol that two ESP32 uses to communicate to each other. For example:
- Self-defined protocol over raw TCP (directly)
- Modbus TCP (directly)
- HTTP (directly)
- Telnet (directly)
- SSH (directly)
- MQTT (indirectly via a server)
※ NOTE THAT:
- UDP protocol is beyond the scope of this tutorial.
Example Application
Let's realize the following application: A button/switch connected to ESP32 #1 controls an LED connected to ESP32 #2 via WiFi.
To make it simple, This tutorial will use a self-defined protocol (Defined by us, no standard)
Self-defined Protocol
We define a simple protocol as follows:
- Create a TCP connection between ESP32 #1 and ESP32 #2
- ESP32 #1:
- TCP client: actively makes TCP connection request to ESP32 #2
- If the switch's state is changed to ON, ESP32 #1 sends a byte (command) with value 1 to ESP32 #2.
- If the switch's state is changed to OFF, ESP32 #1 sends a byte (command) with value 0 to ESP32 #2.
- ESP32 #2:
- TCP server: listens to a TCP connection request from ESP32 #1. If there is a TCP request, it accepts and the connection is created.
- If It receives a byte:
- If the value is 1, Turn LED on
- If the value is 0, Turn LED off
- Wiring Diagram for ESP32 #1: TCP CLIENT + A BUTTON/SWITCH
- Wiring Diagram for ESP32 #2: TCP SERVER + AN LED
- ESP32 - LED tutorial
- ESP32 - Button tutorial
- If this is the first time you use ESP32, see how to setup environment for ESP32 on Arduino IDE.
- Wire a button/switch to ESP32 #1
- Wire an LED to ESP32 #2
- Open Arduino IDE (called Arduino IDE #1)
- Install ezButton library on Arduino IDE
- Connect ESP32 #1 to PC via USB cable and select COM port of ESP32 #1 on Arduino IDE #1
- Open another Arduino IDE window (called Arduino IDE #2) by clicking on Arduino IDE icon on your PC (important!(**))
- Connect ESP32 #2 to PC via USB cable and select COM port of ESP32 #2 on Arduino IDE #2
- Copy ESP32 #1 code, paste to Arduino IDE #1 and save it (named ESP321)
- Copy ESP32 #2 code, paste to Arduino IDE #2 and save it (named ESP322)
- Upload ESP32 #2 code to ESP32 #2 first
- Open Serial Monitor on Arduino IDE #2, get TCP Server IP address
- Update TCP Server IP address in ESP32 #1 code
- Upload ESP32 #1 code to ESP32 #1
- Open Serial Monitor on Arduino IDE #1
- Press and hold the button on ESP32 #1 → see LED's state on ESP32 #2 (ON)
- Release button on ESP32 #1 → see LED's state on ESP32 #2 (OFF)
- Do the above process several times.
- See output on both Serial Monitors
- Serial Monitor of ESP32 #1
- Serial Monitor of ESP32 #2
- (**): If you open Arduino IDE #2 window via "File" → "New" or "Open" from Arduino IDE #2 window, you will NOT be able to open two Serial Monitors for two ESP32 in the same PC at the same time.
- There is an alternative to this self-defined protocol. It is the Modbus TCP. The Modbus protocol is standardized, it has many advantages over the self-defined protocol. See more in ESP32 - Modbus tutorial
Wiring Diagram
This image is created using Fritzing. Click to enlarge image
This image is created using Fritzing. Click to enlarge image
※ NOTE THAT:
It needs touse a resistor for LED if it does not have a built-in resistor. We have dedicated tutorials for button and LED. You can learn more about them in:
ESP32 Code for ESP32 #1
ESP32 Code for ESP32 #2
Quick Instructions
※ NOTE THAT:
If you're unfamiliar with how to supply power to the ESP32 and other components, you can find guidance in the following tutorial: How to Power ESP32.
Video Tutorial
Making video is a time-consuming work. If the video tutorial is necessary for your learning, please let us know by subscribing to our YouTube channel , If the demand for video is high, we will make the video tutorial.