esp32+mqtt协议+paltformio+vscode+微信小程序+温湿度检测

花费两天时间完成了这个项目(不完全是,属于是在resnet模型训练和温湿度检测两头跑......模型跑不出来,又是第一次从头到尾独立玩硬件,属于是焦头烂额了......,完成这个项目后,我的第一反应是写个csdn,把这两天踩过的坑全部记录下来

借鉴了一些文章以及视频,我把链接放下面,希望对大家有用

云平台使用教程:http://t.(csdnimg.cn/RHsIN   (可以跟着这个来创建自己的云平台项目

platformio使用:  https://www.bilibili.com/video/BV1Lt421n78N/?share_source=copy_web&vd_source=6e8b2cb71706b5d90c20318dbf148bf5

ardiuno教程:【2023年最新 ESP32 Arduino 教程(持续更新中)】 https://www.bilibili.com/video/BV1RM4y1a7J5/?share_source=copy_web&vd_source=6e8b2cb71706b5d90c20318dbf148bf5

软件

vscode+platformio插件(vscode插件商店里搜索进行下载):我用他们来编写以及烧录程序

arduino:我用它来检测端口信息(我感觉它不好用,同样的代码在这里就报错,虽说报错内容是头文件,但是我扩展了头文件后还是报错,所以在这个项目里面我并没有用到它来烧录程序

MQTTX:用来前期和物理云平台调试

微信开发者工具:用来编写微信小程序,用来获取云平台的数据

硬件

开发板:ESP32 DEVKI TV1

传感器:DHT11

数据引脚:gpoi4

接线实物图:

dfcf5a72b77344d693701a6afe3c15bd.jpeg

驱动:

记得下载安装驱动CP2102,然后在设备管理器的端口里面可以查看到这个就说明安装成功,要记得把自己的开发板插到自己的电脑上哦,这样才会检测到,如果安装了还是看不见,建议不断的尝试数据线,可能是数据线的质量不太行,我就是因为数据线的质量不好,哎,安了老半天还是看不见,后面借了朋友的线一下就ok了,感谢老叶。

f3460d1da9ab4defa60d5e0202d3fcf4.png

 

 

云平台

我选用的是onenet云开发平台,具体怎么创建云平台项目可以参考我上面链接里的那篇文章,(http://t.csdnimg.cn/RHsIN)我跟着他配置的。跟他不同的是,在他的1.3自定义功能部分,我定义了wendu和humi两个标识符,并且他们的数据类型是float,那个博主定义的是int类型。其他的都和那个博主的一样。

3047c2da84eb4839b9a3da402b9b7d94.png

f5b4ac1d898b46da8550c9b802110140.png

2a4addd9424d46908c18f7df26bb78da.png

欧克,别急,等创建好自己的云平台项目后,设备接入状态不会显示“开发中”,而是显示“未激活”,这时候需要下载MQTTX软件来连接我的项目,对设备进行激活。

下面的步骤中,需要先下载这个token生成工具OneNET - 中国移动物联网开放平台 (10086.cn),获取token。

首先,你需要在onenet上面记录下以下信息,

1.产品id

fe467c1326f54af8a42ba3dfeb7771da.png

2.设备名称

d626eab044eb41bb84449a7901f5411f.png

3.access_key

bbcf571e2f324689882c03fa27ada2bd.png

然后就用刚刚下载的token生成工具,根据这幅图替换掉你自己的信息,然后你就生成了token。这个token在使用mqtt协议来进行通信的时候要用到。

43ba368252954272b2825a21c836c816.png

MQTT.fx是一款基于Eclipse Paho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息,用来前期和物理云平台调试非常方便,下载链接MQTT.fx® Download (softblade.de)

下载完成后,接着进行下面的操作

0c806273f7f34cf9a6d420e583826d92.png

7f591a6932444fd88f175ce451cbbb5b.png

然后呢,就可以点击绿色的connect键进行连接,

519b7c60d0ea488bb4e409722aab08b3.png

连接成功是这样的

a892cc52c1a1450a869128be3706ab8b.png

然后进行测试,(注意,这部分可以不用插硬件,只是在测试使用mqtt协议与云平台进行通信),使用下面的json数据,点击绿色的发送按钮,对数据进行传送

{
  "id": "123",
  "version": "1.0",
  "params": {
    "wendu": {
      "value": 25.0
    },
    "humi": {
      "value": 24.6
    }
  }
}

来到自己云平台查看设备属性,可见数据发送成功。说明mqtt协议使用没问题。

745fd1629a544bd88f03ccf8812a1f71.png

接下来编写代码,使用esp32通过mqtt协议来完成数据的传送

esp32烧录代码

        在下面的代码中,不要全部用,里面有些变量需要根据自己的信息进行更改,需要更改的部分在代码里面已经说明。这里面的头文件记得在platform里面自己进行配置。

120b8a182b894783b44f9c48b03f9e96.png

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <HTTPClient.h>
#include <Ticker.h>
#include "DHT.h" // 添加 DHT 库

#define LED 2 // LED灯连接到GPIO 2,用LED灯指示设备状态

#define ONENET_TOPIC_PROP_POST "$sys/" product_id "/" device_id "/thing/property/post" // 设备属性上报请求
#define ONENET_TOPIC_PROP_SET "$sys/" product_id "/" device_id "/thing/property/set" // 设备属性设置请求
#define ONENET_TOPIC_PROP_POST_REPLY "$sys/" product_id "/" device_id "/thing/property/post/reply" // 设备属性上报响应
#define ONENET_TOPIC_PROP_SET_REPLY "$sys/" product_id "/" device_id "/thing/property/set_reply" // 设备属性设置响应
#define ONENET_TOPIC_PROP_FORMAT "{\"id\":\"%u\", \"version\":\"1.0\", \"params\":%s}"// 设备属性格式模板

const char* ssid = "填你自己的esp32要连接的Wifi名称"; // WiFi名称
const char* password = "你自己的WiFi密码"; // WiFi密码

const char* mqtt_server = "mqtts.heclouds.com"; // MQTT服务器地址
const int mqtt_port = 1883; // MQTT服务器端口

#define product_id "你自己的产品ID" // 产品ID
#define device_id "你自己的设备ID" // 设备ID
#define token "你自己的token" // token

int postMsgId = 0; // 消息ID初始值为0

// 添加 DHT11 传感器引脚和类型
#define DHTPIN 4     // DHT11传感器连接到ESP32的GPIO 4
#define DHTTYPE DHT11   // DHT11传感器类型
DHT dht(DHTPIN, DHTTYPE);  // 创建DHT对象

WiFiClient espclient; // 创建一个WiFiClient对象
PubSubClient client(espclient); // 创建一个PubSubClient对象
Ticker ticker;

void LED_Flash(int time);
void WiFiConnect();
void OneNet_Connect();
void OneNet_Prop_Post();

void setup() {
  pinMode(LED, OUTPUT); // LED灯设置为输出模式
  Serial.begin(9600); // 串口初始化,波特率9600,用于输出调试信息
  WiFiConnect(); // 连接WiFi
  ticker.attach(10, OneNet_Prop_Post); // 定时器,每10毫秒执行一次OneNetPropPost函数
  dht.begin(); // 初始化DHT传感器
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    // 如果WiFi连接断开,重新连接WiFi
    WiFiConnect();
  }

  if (!client.connected()) {
    // 如果MQTT连接断开,重新连接OneNet
    OneNet_Connect();
  }

  // 保持MQTT连接
  client.loop();
}

void LED_Flash(int time) {
  digitalWrite(LED, HIGH); // 点亮LED
  delay(time); // 延时time
  digitalWrite(LED, LOW); // 熄灭LED
  delay(time); // 延时time
}

void WiFiConnect() {
  while (WiFi.status() != WL_CONNECTED) { // 等待WiFi连接,WiFi.status()返回当前WiFi连接状态,WL_CONNECTED为连接成功状态
    WiFi.begin(ssid, password); // 连接WiFi
    LED_Flash(500); // LED闪烁,循环等待
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to the WiFi network"); // WiFi连接成功
  Serial.println(WiFi.localIP()); // 输出设备IP地址
  digitalWrite(LED, HIGH); // 点亮LED
}

void OneNet_Connect() {
  client.setServer(mqtt_server, mqtt_port); // 设置MQTT服务器地址和端口
  if (client.connect(device_id, product_id, token)) { // 连接到OneNet
    LED_Flash(500);
    Serial.println("Connected to OneNet!");
  } else {
    Serial.println("Failed to connect to OneNet!");
  }
  client.subscribe(ONENET_TOPIC_PROP_SET); // 订阅设备属性设置请求
  client.subscribe(ONENET_TOPIC_PROP_POST_REPLY); // 订阅设备属性上报响应
}

void OneNet_Prop_Post() {
  if (client.connected()) {
    float wendu = dht.readTemperature(); // 读取温度
    float humi = dht.readHumidity(); // 读取湿度
    char params[256];
    char jsonBuf[256];
    sprintf(params, "{\"wendu\": {\"value\": %.1f}, \"humi\": {\"value\": %.1f}}", wendu, humi);//注意啊,我的标识符是wendu和humi,所以这里是wendu和humi,看你自己的功能标识符是什么,如果完全和我一样,那可以用这部分代码

    Serial.println(params);
    
    sprintf(jsonBuf, ONENET_TOPIC_PROP_FORMAT, postMsgId++, params);
    Serial.println(jsonBuf);
    
    if (client.publish(ONENET_TOPIC_PROP_POST, jsonBuf)) {
      LED_Flash(500);
      Serial.println("Post property success!");
    } else {
      Serial.println("Post property failed!");
    }
  }
}

在vscode里面烧录成功后,控制台输出应该是下面这样,显示绿色的seccess

dfa17bcbe36d4361bbda46b7493454ea.png

ok,接着来到arduino,对串口进行监视

12d5ac90073448449f8bbbed4ae5d1ed.png

可以看见esp32已经连上了wifi,并且连接到了onenet平台,并且DHT11检测到的数据已经发送成功。在这个过程中,我对着DHT11呼气,可看见温度和湿度逐渐升高。(我开的是手机热点,不是连接的路由器

注意:如果连不上wifi,有可能你的wifi的AP频段是5GHz,试试在wifi设置里把它设置成2.4GHz,如果你开了wifi6协议,那么最好也关掉,因为esp可能设备比较旧,导致搜不到wifi,然后就无法连接上wifi,我因为这个卡了老半天。

9262c199234a4bd2aeb4de6256891822.png

接下来来到onenet平台查看数据是否上传成功,可以看见数据更新成功(开启实时刷新

6b133e672bb847d0b90c7ac86b2cd82d.png

0bfe408a10ec4cedaaf125d9ad01b45b.png

5a104e0c8df84e96bb27aa7e2c5011c3.png

微信小程序部分

首先记得在你的小程序里面添加request合法域名     https://iot-api.heclouds.com

小程序后台管理网址小程序 (qq.com)

e26d43017c98494e950773a0a38f6f62.png

页面wxml代码

<view class="data-values">
    <text>{{onenetData.data[0].value}}</text>
    <text>{{onenetData.data[1].value}}</text>
  </view>

页面js代码

Page({
  data: {
    onenetData: {}, // 初始化 OneNET 数据对象
  },
  onLoad(options) {
    this.fetchOnenetData(); // 页面加载时请求 OneNET 数据
  },

  fetchOnenetData() {
    const authInfo = "这个地方的token要换成你自己的,就是上面生成的那个token,必须保持和你esp32烧录代码里面的token一样";
    wx.request({
      url: 'https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=UT186Pit3y&device_name=test',
      method: "GET",
      header: {
        'Authorization': authInfo
      },
      success: (res) => {
        if (res.data && res.data.data && res.data.data.length >= 2) {
          this.setData({
            onenetData: res.data
          });
        } else {
          console.log("OneNET返回的数据格式不正确");
        }
      },
      fail: (err) => {
        console.log("OneNET数据请求失败");
        console.error(err);
      }
    });
  },
})

然后运行,可看见小程序页面和我云平台上面的数据一模一样。(页面的数据显示的有点潦草,别在意

1dee5de76dc642228fe0656f63979abd.png

 

  • 16
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,您想了解关于esp32c3如何使用MQTT协议的相关知识,对吧?那我来简单介绍一下。 首先,MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛应用于物联网设备间的通信。而ESP32-C3是一款高性价比的Wi-Fi和蓝牙双模片上系统芯片,也是一种常用的物联网设备。 为了在ESP32-C3上使用MQTT协议,您需要先安装相应的MQTT库。目前,ESP-IDF(Espressif IoT Development Framework)提供了一个名为"mqtt"的标准MQTT库,您可以通过在工程配置中添加"COMPONENTS += mqtt"来集成此库。 接下来,您需要在代码中编写MQTT客户端的相关逻辑,包括连接到MQTT服务器、订阅主题、发布消息等。下面是一个简单的示例代码,用于连接到MQTT服务器并发布一条消息: ```c #include "mqtt_client.h" static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) { // 处理MQTT事件的回调函数 } void mqtt_app_start(void) { const esp_mqtt_client_config_t mqtt_cfg = { .uri = "mqtt://test.mosquitto.org:1883", // MQTT服务器的URI }; esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler_cb, client); esp_mqtt_client_start(client); // 发布一条消息 esp_mqtt_client_publish(client, "/topic", "hello, world", 0, 0, 0); } ``` 以上代码中,您需要将".uri"字段设置为您的MQTT服务器的URI。在mqtt_event_handler_cb()函数中,您可以处理MQTT客户端的各种事件,例如连接成功、订阅成功、收到消息等。最后,通过esp_mqtt_client_publish()函数可以发布一条消息到指定的主题。 当然,这只是一个简单的示例,您可以根据实际需求编写更加复杂的MQTT客户端逻辑。希望这些信息对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笃岩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值