当前位置:   article > 正文

物联网的实现:Arduino UNO R4 WIFI + MQTTX

arduino uno r4 wifi

一、写在前面

Arduino UNO R4 WIFI(简称“UNO R4”)是一款带有R7FA4M1芯片和ESP32芯片的开发板,在UNO R3的基础上,添加了联网和点阵屏的功能。

由于UNO R4的使用与UNO R3基本相同,最主要的区别是联网功能。在ESP32芯片的支持下,UNO R4可以更好地用于物联网教育。

二、物联网

1.物联网的概念

物联网是通信网和互联网的拓展应用和网络延伸,它利用感知技术与智能装备对物理世界进行感知识别,通过网络传输互联,进行计算、处理和知识挖掘,实现人与物、物与物的信息交互和无缝链接,达到对物理世界实时控制、精确管理和科学决策的目的。

2.物联网的技术特征

全面感知:利用无线射频识别、传感器、定位器和二维码等手段,随时随地对物体进行信息采集和获取。

可靠传递:通过各种网络,对接收到的物体信息进行实时且准确的远程传送,实现信息的交互和共享,并进行各种有效的处理。

智能处理:通过各种网络,对接收到的物体信息进行实时且准确的远程传送,实现信息的交互和共享,并进行各种有效的处理。

3.物联网的组成结构

感知层:感知层实现对物理世界的智能感知识别、信息采集处理和自动控制,并通过通信模块将物理实体连接到网络层和应用层。

网络层:网络层主要实现信息的传递、路由和控制,包括延伸网、接入网和核心网,网络层可依托公众电信网和互联网,也可以依托行业专用通信网络。

应用层:应用层包括应用基础设施/中间件和各种物联网应用。应用基础设施/中间件为物联网应用提供信息处理、计算等通用基础服务设施、能力及资源调用接口,以此为基础实现物联网在众多领域的各种应用。

三、Arduino UNO R4 WIFI

Arduino UNO R4 WIFI VERSION

上图为本教程使用的Arduino UNO R4 WIFI(意大利原版),详见以下网址。

Arduino® UNO R4 WiFi — Arduino Online ShopThe Arduino UNO R4 WiFi combines the processing power and exciting new peripherals of the RA4M1 microcontroller from Renesas with the wireless connectivity power of the ESP32-S3 from Espressif. On top of this, the UNO R4 WiFi offers an on-board 12x8 LED matrix, Qwiic connector, VRTC, and OFF pin, covering all potentialicon-default.png?t=N7T8https://store-usa.arduino.cc/products/uno-r4-wifi芯片的完整型号为R7FA4M1AB3CFM,ESP32模组的完整编号为ESP32-S3-MINI-1。

功能概况如下。

Arduino UNO R4 WIFI FUNCTION

四、MQTTX

1.物联网平台分析

近年来,国内外物联网平台发展迅猛,常见的物联网平台包括Blynk、Blinker、HiveMQ、EMQX,Arduino力推Arduino Cloud,北京师范大学Mixly团队还针对中国创客教育开发了MixIO平台,上述平台很好地支持了物联网教育的开展。

然而,Blynk、HiveMQ和Arduino Cloud是国外产品,在网络方面和使用方面颇有不便;Blinker一直不温不火,在资源支持和APP设计方面比较落后;MixIO强烈依赖Mixly,在其它IDE中使用困难。

2.选择MQTTX的原因

考虑了种种因素,由EMQX开发的MQTTX成为中小学物联网教育的较佳选择,其功能和特点包括:具有图形化界面,对初学者友好;支持中文界面显示,对中国用户友好;本地部署,完全免费。

以下是MQTTX的下载地址,本教程以Windows客户端为例,即MQTTX在Windows系统上运行。

MQTTX:全功能 MQTT 客户端工具MQTTX 是一款强大的全功能 MQTT 5.0 客户端工具,适用于桌面、命令行和 WebSocket。它使得开发和测试 MQTT 应用更加简单高效。icon-default.png?t=N7T8https://mqttx.app/zh

五、Arduino UNO R4 WIFI + MQTTX

1.方案设计

有了前面的介绍,我们已经了解了物联网、UNO R4和MQTTX是什么。在本教程中,由UNO R4和MQTTX组成的物联网系统将完成两个基本功能——Uno R4向MQTTX发送消息、MQTTX向UNO R4发送消息,见下图。

物联网系统的两个基本功能

在MQTT协议的支持下,UNO R4和MQTTX形成了单工传输。当UNO R4向MQTTX发送消息时,MQTTX要订阅UNO R4指定的主题;当MQTTX向UNO R4发送消息时,UNO R4要订阅MQTTX指定的主题。

2.方案实现

(1)打开MQTTX,用户名和密码均输入test,点击“连接”。

(2)点击“添加订阅”,命名为publish。

(3)下载压缩“UNOR4_MQTTX.zip”并解压缩。

(4)打开“arduino_secrets.h”,修改WIFI名称和密码。

  1. //arduino_secrets.h header file
  2. #define SECRET_SSID "WIFI_NAME"
  3. #define SECRET_PASS "WIFI_PSWD"

(5)运行“recFromMQTTX.ino”,此时MQTTX客户端将收到Hello MQTTX的消息。

  1. #include "WiFiS3.h"
  2. #include <ArduinoMqttClient.h>
  3. #include <ArduinoJson.h>
  4. WiFiClient wifiClient;
  5. MqttClient mqttClient(wifiClient);
  6. // 设置WIFI
  7. char ssid[] = "VICTUS";
  8. char pass[] = "22228888";
  9. // 设置MQTT(EMQX)
  10. char mqtt_user[] = "test";
  11. char mqtt_pass[] = "test";
  12. const char broker[] = "broker.emqx.io";
  13. int port = 1883;
  14. // 指定订阅主题(Arduino为信息接收方)
  15. const char subscribe_topic[] = "subscribe";
  16. void setup() {
  17. Serial.begin(9600);
  18. while (!Serial) {
  19. ;
  20. }
  21. // 连接网络
  22. Serial.print("Attempting to connect to WPA SSID: ");
  23. Serial.println(ssid);
  24. while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
  25. Serial.print(".");
  26. delay(5000);
  27. }
  28. Serial.println("You're connected to the network");
  29. Serial.println();
  30. // 连接MQTT
  31. mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
  32. Serial.print("Attempting to connect to the MQTT broker: ");
  33. if (!mqttClient.connect(broker, port)) {
  34. Serial.print("MQTT connection failed! Error code = ");
  35. Serial.println(mqttClient.connectError());
  36. while (1)
  37. ;
  38. }
  39. Serial.println("You're connected to the MQTT broker!");
  40. // 订阅主题
  41. mqttClient.onMessage(onMqttMessage);
  42. mqttClient.subscribe(subscribe_topic);
  43. }
  44. void loop() {
  45. mqttClient.poll(); // 定期检查新消息
  46. }
  47. void onMqttMessage(int messageSize) {
  48. // 读取消息内容
  49. String message;
  50. for (int i = 0; i < messageSize; i++) {
  51. message += (char)mqttClient.read();
  52. }
  53. // 解析 JSON 消息
  54. StaticJsonDocument<512> doc;
  55. DeserializationError error = deserializeJson(doc, message);
  56. // 检查解析是否成功
  57. if (error) {
  58. Serial.print("JSON parse failed: ");
  59. Serial.println(error.c_str());
  60. return;
  61. }
  62. // 打印 JSON 消息的内容
  63. Serial.println("Received JSON message:");
  64. serializeJsonPretty(doc, Serial);
  65. }

(6)运行“sendToMQTTX.ino”,之后在MQTTX中指定subscribe主题,点击“发送”按钮,此时Arduino IDE的“串口监视器”将收到Hello Arduino的消息。

  1. #include "WiFiS3.h"
  2. #include <ArduinoMqttClient.h>
  3. #include <ArduinoJson.h>
  4. WiFiClient wifiClient;
  5. MqttClient mqttClient(wifiClient);
  6. // 设置WIFI
  7. char ssid[] = "VICTUS";
  8. char pass[] = "22228888";
  9. // 设置MQTT(EMQX)
  10. char mqtt_user[] = "test";
  11. char mqtt_pass[] = "test";
  12. const char broker[] = "broker.emqx.io";
  13. int port = 1883;
  14. // 指定发送主题(Arduino为信息发送方)
  15. const char publish_topic[] = "publish";
  16. void setup() {
  17. // 打开串口
  18. Serial.begin(9600);
  19. while (!Serial) {
  20. ;
  21. }
  22. // 连接网络
  23. Serial.print("Attempting to connect to WPA SSID: ");
  24. Serial.println(ssid);
  25. while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
  26. Serial.print(".");
  27. delay(5000);
  28. }
  29. Serial.println("You're connected to the network");
  30. Serial.println();
  31. // 连接MQTT
  32. mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
  33. Serial.print("Attempting to connect to the MQTT broker: ");
  34. if (!mqttClient.connect(broker, port)) {
  35. Serial.print("MQTT connection failed! Error code = ");
  36. Serial.println(mqttClient.connectError());
  37. while (1)
  38. ;
  39. }
  40. Serial.println("You're connected to the MQTT broker!");
  41. }
  42. void loop() {
  43. mqttClient.poll();
  44. publishMessage();
  45. }
  46. void publishMessage() {
  47. // 创建一个 JSON 对象
  48. StaticJsonDocument<200> doc;
  49. doc["msg"] = "Hello MQTTX";
  50. // 将 JSON 对象序列化为字符串
  51. char jsonBuffer[512];
  52. serializeJson(doc, jsonBuffer);
  53. // 向指定的主题发送 JSON 字符串
  54. mqttClient.beginMessage(publish_topic);
  55. mqttClient.print(jsonBuffer);
  56. mqttClient.endMessage();
  57. // 每隔一段时间发送一次
  58. delay(5000);
  59. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/698988
推荐阅读
  

闽ICP备14008679号