Giao tiếp giữa hai ESP8266

Hướng dẫn này cho bạn biết cách thiết lập kết nối giữa hai thiết bị ESP8266 bằng TCP/IP qua WiFi và trao đổi dữ liệu. Một ESP8266 sẽ hoạt động như một máy khách TCP, trong khi thiết bị còn lại sẽ đóng vai trò là một máy chủ TCP. Chúng ta sẽ đi sâu vào quá trình này thông qua một ví dụ:

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

2×ESP8266 NodeMCU
2×Micro USB Cable
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

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

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

Hãy xem xét một ví dụ cụ thể: ESP8266 số 1 giao tiếp với ESP8266 số 2. Có nhiều cách để thiết lập liên lạc giữa hai ESP8266. Chúng ta có thể chọn một trong số chúng dựa trên khoảng cách giao tiếp. Bảng dưới đây hiển thị một số phương pháp và phạm vi giao tiếp tương ứng.

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

※ Lưu ý:

  • Nếu hai ESP8266 được kết nối với Internet, phạm vi giao tiếp là không giới hạn.
  • Tuy nhiên, nếu hai ESP8266 không được kết nối với Internet mà được kết nối trong cùng một mạng LAN, phạm vi giao tiếp của chúng bị giới hạn trong mạng cục bộ đó.

Trong số các phương pháp được đề cập ở trên, bài hướng dẫn này sử dụng WiFi để cho phép giao tiếp giữa hai ESP8266, vì nó cho phép phạm vi giao tiếp không bị giới hạn.

Giao tiếp giữa hai ESP8266 qua mạng LAN cục bộ hoặc Internet

Hai ESP8266 có thể giao tiếp với nhau qua WiFi khi:

  • Họ ở cùng một Mạng cục bộ (Local Area Network - LAN), và không cần kết nối Internet
  • Họ ở các LAN khác nhau, và cần kết nối Internet

Dù hai ESP8266 được kết nối trong một mạng LAN cục bộ hay qua Internet, có hai cách giao tiếp:

Khi nói đến giao tiếp trực tiếp, thông thường một ESP8266 là máy khách TCP và thiết bị còn lại là máy chủ TCP.

Trong trường hợp sử dụng một máy chủ tập trung để giao tiếp, thông thường cả hai ESP8266 đóng vai trò là các máy khách TCP.

Khi quyết định giao thức ứng dụng cho việc giao tiếp giữa hai ESP8266, chúng ta có một số lựa chọn để chọn:

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

Ứng dụng ví dụ

Hãy biến chương trình sau đây thành hiện thực: Một nút bấm hoặc công tắc được gắn vào ESP8266 #1 sẽ được dùng để bật và tắt một LED được kết nối với ESP8266 #2 thông qua WiFi.

giao tiếp giữa hai ESP8266 NodeMCU

Như đã nêu trước đây, có một số giao thức ứng dụng có sẵn. Để đơn giản hóa ví dụ này, chúng ta sẽ tự tạo ra một giao thức riêng của chính mình (một giao thức do chúng ta tự định nghĩa).

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

Hãy thiết lập một giao thức đơn giản:

  • Thiết lập một kết nối TCP giữa ESP8266 #1 và ESP8266 #2
  • ESP8266 #1:
    • Hoạt động như một client TCP, khởi tạo kết nối TCP tới ESP8266 #2
    • Khi công tắc được bật lên (ON), gửi một byte (lệnh) có giá trị 1 tới ESP8266 #2.
    • Khi công tắc được gạt xuống (OFF), gửi một byte (lệnh) có giá trị 0 tới ESP8266 #2.
  • ESP8266 #2:
    • Đảm nhận vai trò máy chủ TCP, lắng nghe các yêu cầu kết nối TCP từ ESP8266 #1
    • Nếu byte nhận được là 1, bật LED
    • Nếu nhận được là 0, tắt LED

    Sơ đồ nối dây

    • ESP8266 #1 - Sơ đồ nối giữa ESP8266 và nút nhấn
    sơ đồ nối nút nhấn ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Xem thêm Sơ đồ chân ESP8266Cách cấp nguồn cho ESP8266.

    • ESP8266 #2 - Sơ đồ đấu nối giữa ESP8266 và LED
    sơ đồ nối LED ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Mã ESP8266 cho ESP8266 #1

    /* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/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"); } }

    Mã ESP8266 cho ESP8266 #2

    /* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/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 } }

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

    Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

    • Xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
    • Nối các thành phần như được hiển thị trong sơ đồ.
    • Kết nối hai bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
    • Mở Arduino IDE (được gọi là Arduino IDE #1).
    • Mở Arduino IDE (được gọi là Arduino IDE #2).
    • Chọn bo mạch ESP8266 phù hợp, chẳng hạn như (ví dụ NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
    • Cài đặt thư viện ezButton trên Arduino IDE.
    • Sao chép mã ESP8266 #1, dán vào Arduino IDE #1 và lưu lại (đặt tên ESP8266-1).
    • Sao chép mã ESP8266 #2, dán vào Arduino IDE #2 và lưu lại (đặt tên ESP8266-2).
    • Tải mã ESP8266 #2 lên ESP8266 #2 trước.
    • Mở Serial Monitor trên Arduino IDE #2, lấy địa chỉ IP của máy chủ TCP.
    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Thay đổi địa chỉ IP của máy chủ TCP trong mã của ESP8266 #1.
    • Tải mã ESP8266 #1 lên ESP8266 #1.
    • Mở Serial Monitor trên Arduino IDE #1.
    • Nhấn và giữ nút trên ESP8266 #1 và quan sát trạng thái của LED trên ESP8266 #2 (nó nên ở trạng thái BẬT).
    • Thả nút trên ESP8266 #1 và quan sát trạng thái của LED trên ESP8266 #2 (nó nên ở trạng thái TẮT).
    • Nhấn, giữ và thả nút vài lần.
    • Kiểm tra đầu ra trên Serial Monitor #1:
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Kiểm tra đầu ra trên Serial Monitor #2:
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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 ESP8266 qua Internet

Có hai loại địa chỉ IP: riêng tư và công khai. Địa chỉ IP thường được sử dụng trong mạng gia đình là địa chỉ riêng tư.

Việc nhận diện địa chỉ IP riêng rất dễ. Có ba định dạng địa chỉ IP riêng: 10.x.x.x, 172.16.x.x, 192.168.x.x

Việc sử dụng địa chỉ IP riêng không quan trọng trong các tình huống sau:

  • Khi hai ESP8266 nằm trong cùng một mạng cục bộ (LAN), bất kể chúng giao tiếp trực tiếp hay thông qua một máy chủ tập trung, và bất kể mạng LAN có được kết nối với Internet hay không.
  • Khi hai ESP8266 nằm ở hai mạng cục bộ riêng biệt và giao tiếp với nhau thông qua một máy chủ tập trung.

Trong trường hợp hai ESP8266 ở hai mạng LAN khác nhau và giao tiếp với nhau trực tiếp, máy khách TCP ESP8266 có thể sử dụng một địa chỉ IP riêng. Tuy nhiên, máy chủ TCP ESP8266 phải sử dụng một trong các tùy chọn sau:

  • Một địa chỉ IP công khai
  • Một địa chỉ IP riêng với "Chuyển tiếp cổng" trên Router/Điểm truy cập

Kỹ thuật 'Chuyển tiếp cổng' khác nhau giữa các router/AP. Hướng dẫn này không đề cập đến chủ đề này.