Arduino UNO R4 MQTT

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng Arduino UNO R4 để gửi và nhận dữ liệu từ MQTT broker bằng giao thức MQTT. Chúng ta sẽ tìm hiểu các chi tiết sau:

Arduino UNO R4 mqtt

Chúng ta sẽ xem xét hai ví dụ khác nhau:

Phần Cứng Cần Thiết

1×Arduino UNO R4 WiFi
1×Alternatively, DIYables STEM V4 IoT
1×(Tùy chọn) DIYables STEM V4 IoT
1×Cáp USB Type-C
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino UNO R4
1×(Khuyến nghị) Breadboard Shield for Arduino UNO R4
1×(Khuyến nghị) Enclosure for Arduino UNO R4
1×(Khuyến nghị) Power Splitter for Arduino UNO R4
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V4 IoT Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Arduino UNO R4 và MQTT

Chúng ta sẽ học cách lập trình Arduino UNO R4 để gửi và nhận dữ liệu thông qua MQTT broker (còn gọi là MQTT server). MQTT broker có thể là:

  • MQTT broker trên Internet, chẳng hạn như Mosquitto hoặc AWS IoT.
  • MQTT broker được cài đặt trên máy tính của bạn, như Mosquitto hoặc HiveMQ.
  • MQTT broker chạy trên Raspberry Pi của bạn, ví dụ như Mosquitto.
  • MQTT broker trên cloud, chẳng hạn như Mosquitto hoặc HiveMQ trên AWS EC2.

Trong hướng dẫn này, chúng ta sẽ bắt đầu bằng cách kiểm tra xem Arduino UNO R4 có thể kết nối với Mosquitto broker trực tuyến hay không. Arduino UNO R4 sẽ gửi và nhận tin nhắn đến và từ broker này qua internet.

Tiếp theo, chúng ta sẽ cài đặt Mosquitto broker trên máy tính của chúng ta. Sau đó, chúng ta sẽ kết nối Arduino UNO R4 với MQTT broker trên máy tính. Chúng ta sẽ sử dụng nó để gửi và nhận dữ liệu thông qua broker cục bộ này.

Kết nối Arduino UNO R4 với MQTT broker trực tuyến

Trong phần này, chúng ta sẽ hiểu cách liên kết Arduino UNO R4 với test.mosquitto.org, một dịch vụ MQTT trực tuyến được cung cấp bởi Mosquitto. Hãy nhớ rằng, dịch vụ này chỉ dành cho việc thử nghiệm.

Code Arduino UNO R4

Code Arduino UNO R4 này thực hiện các nhiệm vụ sau:

  • Kết nối với MQTT broker
  • Subscribe một topic
  • Thường xuyên gửi tin nhắn đến cùng topic mà bạn đã subscribe
/* * Mã Arduino UNO R4 này được phát triển bởi newbiely.vn * Mã Arduino UNO R4 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/arduino-uno-r4/arduino-uno-r4-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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 int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-arduino-uno-r4"; // 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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-uno-r4/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-uno-r4/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino UNO R4 - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 5 seconds for connection: delay(5000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino UNO R4 - 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("Arduino UNO R4 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino UNO R4 - Subscribed to the topic: "); else Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino UNO R4 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino UNO R4 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino UNO R4 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Các Bước Nhanh

Hãy làm theo hướng dẫn từng bước sau:

  • Nếu đây là lần đầu tiên bạn sử dụng Arduino Uno R4 WiFi/Minima, hãy tham khảo hướng dẫn về Arduino UNO R4 - Cài Đặt Phần Mềm.
  • Kết nối board Arduino Uno R4 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 board Arduino Uno R4 phù hợp (ví dụ: Arduino Uno R4 WiFi) và COM port.
  • Nhấp vào biểu tượng "Library Manager" ở phía bên trái của Arduino IDE để mở nó.
  • Trong ô tìm kiếm, nhập MQTT và tìm kiếm thư viện MQTT của Joel Gaehwiler.
  • Nhấp nút Install để thêm thư viện MQTT.
Arduino UNO R4 mqtt thư viện
  • Tìm kiếm ArduinoJson trong ô tìm kiếm và tìm thư viện ArduinoJson của Benoit Blanchon. Sau đó, nhấp nút Install để cài đặt thư viện.
Arduino UNO R4 json thư viện
  • Copy code và mở nó trong Arduino IDE.
  • Thay đổi thông tin WiFi (SSID và password) trong code thành của bạn.
  • Bạn sẽ thấy 'YOUR-NAME' ba lần trong code. Thay thế nó bằng tên của bạn hoặc bất kỳ chữ cái nào (không có dấu cách). Sự thay đổi này rất quan trọng để tránh xung đột từ nhiều người dùng chạy cùng một code.
  • Nhấp nút Upload trong Arduino IDE để upload code lên Arduino UNO R4 của bạn.
  • Mở Serial Monitor.
  • Kiểm tra kết quả trên Serial Monitor.
COM6
Send
IP Address: 192.168.0.2 Arduino UNO R4 - Connecting to MQTT broker Arduino UNO R4 - Subscribed to the topic: YOUR-NAME-arduino-uno-r4/loopback Arduino UNO R4 - MQTT broker Connected! Arduino UNO R4 - sent to MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload:{"timestamp":11757,"data":255} Arduino UNO R4 - received from MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload: {"timestamp":11757,"data":255} Arduino UNO R4 - sent to MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload:{"timestamp":16896,"data":259} Arduino UNO R4 - received from MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Arduino UNO R4 gửi tin nhắn đến MQTT broker và sau đó nhận lại cùng tin nhắn đó. Điều này xảy ra vì nó được thiết lập để nhận tin nhắn từ cùng topic mà nó gửi. Nếu bạn không muốn Arduino UNO R4 nhận lại tin nhắn của chính nó, chỉ cần sử dụng các topic khác nhau cho việc gửi và nhận.

Kết nối Arduino UNO R4 với MQTT broker được cài đặt trên PC của bạn

Cài đặt Mosquitto MQTT Broker

  • Tải xuống Mosquitto MQTT Broker
  • Cài đặt nó trên ổ đĩa D:, không phải ổ đĩa C:. Điều này giúp tránh những vấn đề có thể xảy ra.

Chạy Mosquitto MQTT broker

Bây giờ, hãy xem liệu MQTT broker có hoạt động đúng không bằng cách thực hiện các bước sau:

  • Điều hướng đến thư mục nơi bạn đã cài đặt Mosquitto, chẳng hạn như D:\Draft\mosquitto. Tạo một file có tên test.conf, dán các chi tiết sau vào đó, và lưu file trong thư mục này.
listener 1883 allow_anonymous true
  • Mở Command Prompt dưới quyền Administrator trên máy tính của bạn. Gọi nó là "Broker Window." Hãy nhớ không đóng cửa sổ này cho đến khi bạn hoàn thành hướng dẫn.
windows command prompt administrator
  • Thực thi các lệnh sau một cách tuần tự:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Bạn sẽ thấy:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Mở một Command Prompt mới dưới quyền Administrator trên máy tính của bạn.
  • Để tìm địa chỉ IP của máy tính, chạy lệnh này:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.11 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Hãy ghi lại địa chỉ IP để tham khảo sau này. Trong ví dụ được cung cấp: 192.168.0.11.

Kiểm tra xem Mosquitto Broker có hoạt động không

  • Mở một Command Prompt khác dưới quyền Administrator trên máy tính của bạn. Chúng ta sẽ gọi nó là "Subscriber Window."
  • Để subscribe một topic, nhập các lệnh sau từng cái một, thay thế "địa chỉ IP của bạn" bằng địa chỉ IP thực tế của bạn:
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send
  • Mở thêm một Command Prompt với quyền Administrator trên máy tính của bạn. Đặt tên nó là Publisher Window.
  • Để publish một tin nhắn đến cùng topic, thực hiện các lệnh sau một cách tuần tự (thay thế bằng địa chỉ IP của bạn):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send -m "Hello, MQTT!"
  • Bạn sẽ thấy:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Tin nhắn được gửi đến Subscriber Window như thế này:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send Hello, MQTT!

Bạn đã cài đặt thành công Mosquitto MQTT broker trên PC của mình. Hãy không đóng ba cửa sổ: Broker Window, Subscriber Window, và Publisher Window. Chúng ta sẽ sử dụng chúng ở bước tiếp theo.

Code Arduino UNO R4

Code sau đây dành cho Arduino UNO R4 và nó thực hiện các việc sau:

  • Kết nối với MQTT broker
  • Subscribe một topic
  • Thường xuyên gửi tin nhắn đến một topic khác
/* * Mã Arduino UNO R4 này được phát triển bởi newbiely.vn * Mã Arduino UNO R4 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/arduino-uno-r4/arduino-uno-r4-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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.11"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "arduino-uno-r4"; // 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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-uno-r4/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-uno-r4/receive"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino UNO R4 - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino UNO R4 - 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("Arduino UNO R4 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino UNO R4 - Subscribed to the topic: "); else Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino UNO R4 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino UNO R4 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino UNO R4 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Các Bước Nhanh

  • Copy code ở trên và mở nó bằng Arduino IDE
  • Thay đổi thông tin WiFi (SSID và password) trong code thành của bạn.
  • Thay đổi địa chỉ MQTT broker trong code (có thể là tên miền hoặc địa chỉ IP).
  • Nhấp nút Upload trong Arduino IDE để gửi code lên Arduino UNO R4 của bạn.

Gửi tin nhắn từ Arduino UNO R4 đến PC qua MQTT

Arduino UNO R4 gửi thông tin đến MQTT topic có tên arduino-uno-r4/send. Trên máy tính, Subscriber Window subscribe topic đó để nhận dữ liệu.

  • Mở Serial Monitor để xem Arduino UNO R4 thường xuyên gửi tin nhắn đến một topic.
COM6
Send
IP Address: 192.168.0.2 Arduino UNO R4 - Connecting to MQTT broker Arduino UNO R4 - Subscribed to the topic: arduino-uno-r4/receive Arduino UNO R4 - MQTT broker Connected! Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":10708,"data":311} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":15837,"data":298} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":20965,"data":291} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Nhìn vào Subscriber Window và bạn sẽ thấy nó hiển thị tin nhắn được gửi bởi Arduino UNO R4 như thế này:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Gửi tin nhắn từ PC đến Arduino UNO R4 qua MQTT

Arduino UNO R4 được thiết lập để nhận tin nhắn từ topic arduino-uno-r4/receive. Publisher Window trên PC gửi tin nhắn đến topic này để giao tiếp với Arduino UNO R4.

  • Gửi một tin nhắn đến topic được subscribe bởi Arduino UNO R4 bằng lệnh này trong Publisher Window:
mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/receive -m "Hello, Arduino UNO R4!"
  • Bạn sẽ thấy Arduino UNO R4 nhận được tin nhắn này, như được hiển thị trên Serial Monitor:
COM6
Send
Arduino UNO R4 - received from MQTT: - topic: arduino-uno-r4/receive - payload: Hello, Arduino UNO R4!
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.