Giao tiếp MQTT giữa ESP8266 và ESP8266

Trong bài hướng dẫn này, chúng ta sẽ đề cập đến:

giao tiếp giữa hai ESP8266 NodeMCU qua mqtt.

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)

Về ESP8266 và MQTT

Chúng tôi có một hướng dẫn chi tiết về cách sử dụng ESP8266 với MQTT ở đây:

Giao tiếp giữa hai ESP8266 thông qua MQTT

Hai mạch ESP8266 có thể giao tiếp với nhau bằng cách sử dụng một máy chủ MQTT. Nếu bạn thích giao tiếp trực tiếp giữa hai ESP8266 mà không dựa vào một máy chủ MQTT, vui lòng xem hướng dẫn về Giao tiếp giữa hai ESP8266.

Khi ESP8266 #1ESP8266 #2 trao đổi dữ liệu thông qua một broker MQTT:

  • Cả hai ESP8266 đều kết nối với broker MQTT.
  • Để cho ESP8266 #2 gửi dữ liệu tới ESP8266 #1:
    • ESP8266 #1 đăng ký một chủ đề, ví dụ: esp8266-1/data.
    • ESP8266 #2 có thể truyền dữ liệu tới ESP8266 #1 bằng cách phát nó tới chủ đề mà ESP8266 #1 đang đăng ký nhận.
  • Tương tự, để cho ESP8266 #1 gửi dữ liệu tới ESP8266 #2:
    • ESP8266 #2 đăng ký một chủ đề, ví dụ: esp8266-2/data.
    • ESP8266 #1 có thể gửi dữ liệu tới ESP8266 #2 bằng cách phát nó tới chủ đề mà ESP8266 #2 đang đăng ký nhận.

    Bằng cách thực hiện cách tiếp cận này, hai ESP8266 có thể trao đổi dữ liệu hai chiều.

Ví dụ về trường hợp sử dụng

Hãy hiện thực hóa ứng dụng sau: Một nút/bộ chuyển đổi được kết nối với ESP8266 #1 điều khiển một LED được kết nối với ESP8266 #2 thông qua MQTT.

giao tiếp giữa hai ESP8266 NodeMCU

Như đã đề cập ở trên, có một số giao thức ứng dụng mà chúng ta có thể sử dụng. Trong ví dụ này, để đơn giản, chúng ta sẽ tự định nghĩa một giao thức cho riêng mình (một giao thức do chính chúng ta tự định nghĩa).

Cách thức hoạt động

Hãy định nghĩa một giao thức đơn giản:

  • Cả ESP8266 #1ESP8266 #2 đều kết nối tới một máy chủ MQTT (máy chủ MQTT).
  • Đối với ESP8266 #1:
    • ESP8266 #1 xuất bản một thông điệp MQTT tới một chủ đề cụ thể bất cứ khi nào trạng thái của công tắc thay đổi.
    • Khi nút/công tắc được bật, nội dung tin nhắn MQTT được đặt thành 1.
    • Khi nút/công tắc được tắt, nội dung tin nhắn MQTT được đặt thành 0.
  • Đối với ESP8266 #2:
    • ESP8266 #2 đăng ký nhận từ cùng một chủ đề.
    • Nếu ESP8266 #2 nhận được một tin nhắn MQTT có nội dung là 1, nó kích hoạt LED.
    • Nếu ESP8266 #2 nhận được một tin nhắn MQTT có nội dung là 0, nó vô hiệu hóa LED.

    Sơ đồ nối dây

    • ESP8266 #1 - Sơ đồ mạch giữa ESP8266 và nút nhấn
    sơ đồ nối dây cho nút 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 số 2 - Sơ đồ kết nối giữa ESP8266 và LED
    sơ đồ nối dây LED ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

Giao tiếp giữa hai ESP8266 thông qua MQTT

Mã ESP8266 số 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/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7 void setup() { Serial.begin(9600); button.setDebounceTime(100); // set debounce time to 100 milliseconds Serial.println("ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); button.loop(); // MUST call the loop() function first if (button.isPressed()) { Serial.println("- The button is pressed, send command: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- The button is released, send command: 0"); sendToMQTT('0'); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

Mã 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/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // The ESP8266 pin connected to LED const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-002"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageReceived); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); Serial.println(payload); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED on"); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED off"); digitalWrite(LED_PIN, LOW); // Turn LED off } else { Serial.print("- Received an unsupported command: "); Serial.println(command); } }

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

Để bắt đầu với ESP8266 trong Arduino IDE, làm theo các bước sau:

  • Hãy xem 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 bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 đúng, ví dụ (ví dụ NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Nối một nút/nút bật đến ESP8266 #1
  • Nối một LED đến ESP8266 #2
  • Mở Arduino IDE (gọi là 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 PC của bạn (quan trọng!())
  • Mở Library Manager bằng cách nhấp vào biểu tượng Library Manager ở thanh điều hướng bên trái của Arduino IDE
  • Nhập MQTT vào ô tìm kiếm, sau đó tìm thư viện MQTT của Joel Gaehwiler.
  • Nhấp vào nút Install để cài đặt thư viện MQTT.
thư viện mqtt cho ESP8266 NodeMCU
  • Nhập ezButton vào ô tìm kiếm, sau đó tìm thư viện nút từ ArduinoGetStarted
  • Nhấn nút Cài đặt để cài đặt thư viện ezButton.
thư viện nút cho ESP8266 NodeMCU
  • Kết nối ESP8266 #1 với máy tính bằng cáp USB và chọn cổng COM của ESP8266 #1 trên Arduino IDE #1
  • Kết nối ESP8266 #2 với máy tính bằng cáp USB và chọn cổng COM của ESP8266 #2 trên Arduino IDE #2
  • Sao chép mã ESP8266 #1, dán vào Arduino IDE #1 và lưu nó (đặt tên ESP8266-1)
  • Sao chép mã ESP8266 #2, dán vào Arduino IDE #2 và lưu nó (đặt tên ESP8266-2)
  • Thay thế thông tin WiFi (SSID và mật khẩu) trong cả hai mã bằng thông tin của bạn.
  • Thay thế địa chỉ MQTT broker trong cả hai mã (tên miền hoặc địa chỉ IP).
  • Tải mã ESP8266 #1 lên ESP8266 #1
  • Tải mã ESP8266 #2 lên ESP8266 #2
  • Mở Serial Monitor trên Arduino IDE #1
  • Mở Serial Monitor trên Arduino IDE #2
  • Nhấn và giữ nút trên ESP8266 #1 → xem trạng thái LED trên ESP8266 #2 (ON)
  • Thả nút trên ESP8266 #1 → xem trạng thái LED trên ESP8266 #2 (OFF)
  • Nhấn, giữ và thả nút vài lần.
  • Xem đầu ra trên cả hai Serial Monitor
    • Serial Monitor của ESP8266 #1
    COM6
    Send
    ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Trình theo dõi nối tiếp của ESP8266 #2
    COM6
    Send
    ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/command - payload: 0 - Received command: 0 => Turned LED off
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline