Giao tiếp giữa hai ESP32

Hướng dẫn này chỉ cho bạn cách thiết lập kết nối giữa hai ESP32 qua TCP/IP trên WiFi và trao đổi dữ liệu. Một ESP32 đóng vai trò là máy khách TCP và ESP32 còn lại đóng vai trò là máy chủ TCP. Chúng ta cũng sẽ tìm hiểu chi tiết thông qua một ví dụ:

giao tiếp giữa hai ESP32

Phần cứng cần chuẩn bị

2×mô-đun phát triển ESP-WROOM-32
2×Micro USB Cable
1×(Tùy chọn) DC Power Jack
1×breadboard
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Giao tiếp giữa hai ESP32 - Tổng quan

Có rất nhiều cách để ESP32 #1 giao tiếp với ESP32 #2. Tùy thuộc vào khoảng cách, chúng ta có thể chọn một trong các cách dưới đây:

Methods Distance
SPI very short
I2C very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
WiFi unlimited(*)

※ Lưu ý:

(*):

  • Nếu chúng ta kết nối cả hai ESP32 với Internet, khoảng cách giao tiếp là vô hạn
  • Nếu chúng ta không kết nối cả hai ESP32 với Internet, nhưng chúng ta kết nối chúng với cùng một mạng LAN, khoảng cách giao tiếp bị giới hạn trong mạng LAN

Hướng dẫn này sẽ sử dụng WiFi để giao tiếp giữa hai ESP32.

Giao tiếp giữa hai ESP32 qua WiFi

Hai ESP32 có thể giao tiếp với nhau qua WiFi nếu:

  • Hai ESP32 trong cùng một mạng LAN. Chúng không cần kết nối Internet.
  • Hai ESP32 ở hai mạng LAN khác nhau. Chúng cần kết nối Internet.

Có hai cách mà hai ESP32 có thể giao tiếp với nhau.

  • Hai ESP32 giao tiếp với nhau trực tiếp: một ESP32 là máy khách TCP, ESP32 kia là máy chủ TCP.
  • Hai ESP32 giao tiếp với nhau gián tiếp thông qua một máy chủ tập trung (ví dụ máy chủ MQTT): cả hai ESP32 đều là máy khách TCP. Tham khảo hướng dẫn Giao Tiếp MQTT Giữa ESP32-to-ESP32.

Nó cần một giao thức ứng dụng mà hai ESP32 sử dụng để giao tiếp với nhau. Ví dụ:

  • Giao thức tự định nghĩa trên TCP thô (trực tiếp)
  • Modbus TCP (trực tiếp)
  • HTTP (trực tiếp)
  • Telnet (trực tiếp)
  • SSH (trực tiếp)
  • MQTT (gián tiếp qua một máy chủ)

※ Lưu ý:

  • Giao thức UDP nằm ngoài phạm vi của hướng dẫn này.

Ứng dụng ví dụ

Hãy thực hiện ứng dụng sau: Một nút hoặc công tắc được kết nối với ESP32 #1 sẽ điều khiển một LED được kết nối với ESP32 #2 qua WiFi.

giao tiếp giữa hai ESP32

Để đơn giản, hướng dẫn này sẽ sử dụng một giao thức do chính chúng tôi tự định nghĩa (không có chuẩn).

Giao thức tự định nghĩa

Chúng tôi định nghĩa một giao thức đơn giản như sau:

  • Tạo một kết nối TCP giữa ESP32 #1ESP32 #2
  • ESP32 #1:
    • Máy khách TCP: chủ động gửi yêu cầu kết nối TCP tới ESP32 #2
    • Nếu trạng thái của công tắc được đổi sang BẬT, ESP32 #1 gửi một byte (lệnh) có giá trị bằng 1 tới ESP32 #2.
    • Nếu trạng thái của công tắc được đổi sang TẮT, ESP32 #1 gửi một byte (lệnh) có giá trị bằng 0 tới ESP32 #2.
  • ESP32 #2:
    • Máy chủ TCP: lắng nghe yêu cầu kết nối TCP từ ESP32 #1. Nếu có yêu cầu TCP, nó chấp nhận và kết nối được tạo.
    • Nếu nó nhận được một byte:
      • Nếu giá trị là 1, Bật LED
      • Nếu giá trị là 0, Tắt LED

      Sơ đồ đấu dây

      • Sơ đồ đấu dây cho ESP32 #1: Máy khách TCP + một nút hoặc công tắc
      sơ đồ đấu dây nút ESP32

      This image is created using Fritzing. Click to enlarge image

      Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.

      • Sơ đồ đấu dây cho ESP32 #2: Máy chủ TCP + một đèn LED
      sơ đồ đấu nối LED ESP32

      This image is created using Fritzing. Click to enlarge image

      ※ Lưu ý:

      Cần phải sử dụng một điện trở cho LED nếu LED không có điện trở tích hợp. Chúng tôi có các hướng dẫn dành riêng cho nút và LED. Bạn có thể tìm hiểu thêm về chúng tại:

      Mã ESP32 cho ESP32 #1

      /* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/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"); } }

      Mã ESP32 cho ESP32 số 2

      /* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/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(); } }

      Hướng dẫn từng bước

      • Nếu đây là lần đầu bạn sử dụng ESP32, hãy xem ESP32 - Cài Đặt Phần Mềm.
      • Kết nối một nút nhấn/công tắc với ESP32 #1
      • Kết nối một đèn LED đến ESP32 #2
      • Mở Arduino IDE (được gọi là Arduino IDE #1)
      • Cài đặt thư viện ezButton trên Arduino IDE
      • Kết nối ESP32 #1 với máy tính bằng cáp USB và chọn cổng COM của ESP32 #1 trên Arduino IDE #1
      • Mở một cửa sổ Arduino IDE khác (được gọi là Arduino IDE #2) bằng nhấp vào biểu tượng Arduino IDE trên máy tính của bạn (quan trọng!())
      • Kết nối ESP32 #2 với máy tính bằng cáp USB và chọn cổng COM của ESP32 #2 trên Arduino IDE #2
      • Sao chép mã của ESP32 #1, dán vào Arduino IDE #1 và lưu lại (đặt tên ESP321)
      • Sao chép mã của ESP32 #2, dán vào Arduino IDE #2 và lưu lại (đặt tên ESP322)
      • Tải lên mã của ESP32 #2 lên ESP32 #2 trước
      • Mở Serial Monitor trên Arduino IDE #2, lấy địa chỉ IP của máy chủ TCP
      COM6
      Send
      ESP32 #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP32 #1 code
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  
      • Cập nhật địa chỉ IP của máy chủ TCP trong mã ESP32 #1
      • Tải mã ESP32 #1 lên ESP32 #1
      • Mở Serial Monitor trên Arduino IDE #1
      • Nhấn và giữ nút trên ESP32 #1 → xem trạng thái đèn LED trên ESP32 #2 (BẬT)
      • Thả nút trên ESP32 #1 → xem trạng thái đèn LED trên ESP32 #2 (TẮT)
      • Thực hiện quy trình trên vài lần.
      • Xem đầu ra trên cả hai Serial Monitor
        • Serial Monitor của ESP32 #1
        COM6
        Send
        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
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  
        • Trình theo dõi nối tiếp của ESP32 #2
        COM6
        Send
        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
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  

        ※ Lưu ý:

        • (): Nếu bạn mở cửa sổ Arduino IDE #2 bằng cách "File" → "New" hoặc "Open" từ cửa sổ Arduino IDE #2, bạn sẽ không thể mở hai cửa sổ Serial Monitor cho hai ESP32 trên cùng một máy tính cùng lúc.
        • Có một phương án thay thế cho giao thức tự định nghĩa này. Đó là Modbus TCP. Giao thức Modbus được chuẩn hóa, nó có nhiều ưu điểm so với giao thức tự định nghĩa. Xem thêm trong ESP32 - Modbus hướng dẫn.

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Cách kết nối hai ESP32 qua Internet

Xem Cách kết nối hai thiết bị qua Internet