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

接线实物图:

驱动:

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

云平台

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

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

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

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

1.产品id

2.设备名称

3.access_key

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

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

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

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

连接成功是这样的

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

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

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

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

esp32烧录代码

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

#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

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

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

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

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

微信小程序部分

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

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

页面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);
      }
    });
  },
})

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/596187.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

毕设:邮件分发系统

文章目录 前言一、登录1.邮箱登录2.账号登录 二、注册三、首页四、写邮件五、收邮件六、草稿箱七、垃圾箱八、已发送九、通讯录十、用户管理十一、邮件管理十二、登录日志总结 前言 分享一下邮件分发系统 一、登录 1.邮箱登录 2.账号登录 二、注册 三、首页 首页有邮件信息&…

华为ensp中USG6000V防火墙双机热备VRRP+HRP原理及配置

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月6日20点26分 华为防火墙双机热备是一种高可用性解决方案&#xff0c;可以将两台防火墙设备组成一个双机热备组&#xff0c;实现主备切换。当主用防火墙出现故障时&…

Linux 第十九章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【数据可视化-02】Seaborn图形实战宝典

Seaborn介绍 Seaborn是一个基于Python的数据可视化库&#xff0c;它建立在matplotlib的基础之上&#xff0c;为统计数据的可视化提供了高级接口。Seaborn通过简洁美观的默认样式和绘图类型&#xff0c;使数据可视化变得更加简单和直观。它特别适用于那些想要创建具有吸引力且信…

后端接口返回二进制数据流,前端如何将其转换成对应的excel、csv和json文件格式并下载

本文主要是介绍在工作中遇到的后端接口返回一个二进制数据流&#xff0c;前端在界面上创建下载按钮并下载成对应格式的文件导出。 downloadData({start: startTime,end: endTime,exportType: 0, // 0-excel, 1-csv, 2-json }).then((res) > {download(res, startTime, endTi…

Flutter笔记:Widgets Easier组件库 - 使用标签(Tag)

Flutter笔记 Widgets Easier组件库 - 使用标签&#xff08;Tag&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【网络原理】IP协议详解

一.与IP协议相关的基本概念 IP协议&#xff0c;即网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的核心网络层协议。 网络层IP协议解决的问题 数据传输的过程中,不是直接进行的传输,而是经过层层的封装和分用的过程才能到达对端. IP协议主…

计算机是如何执行指令的

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

19 内核开发-内核源码编译

19 内核开发-内核源码编译 (1)开始准备 安装好virtual box ubuntu 系统后&#xff0c;即可下载内核代码&#xff0c;进行编译 历史内核源码地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/ 下载 linux-5.10.102.tar.gz 的包,可以使用wget 命令 创建编译目…

CasaOS玩客云安装memos开源云笔记并实现随时随地远程记笔记

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 前言 本文主要介绍如何在CasaOS玩客云&#xff0c;使用Docker本地部署21.6K stars的热门开源云笔记服务memos&#xff0c;并结合cpolar内网穿透工具打…

基于Springboot的校园志愿者管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园志愿者管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

土壤重金属含量分布、Cd镉含量、Cr、Pb、Cu、Zn、As和Hg、土壤采样点、土壤类型分布

土壤是人类赖以生存和发展的重要资源之一,也是陆地生态系统重要的组成部分。近年来, 随着我国城市化进程加快&#xff0c;矿产资源开发、金属加工冶炼、化工生产、污水灌溉以及不合理的化肥农药施用等因素导致重金属在农田土壤中不断富集。重金属作为土壤环境中一种具有潜在危害…

软件测试与管理-白盒测试-逻辑覆盖法例题

目录 知识点&#xff1a; 例题 &#xff1a; 知识点&#xff1a; 语句覆盖&#xff1a;设计足够多的测试用例&#xff0c;使得被测试程序中的“ 每条可执行语句至少被执行一次” 优点&#xff1a;可通过源码观察直观地得到测试用例&#xff0c;无须细分每个判定表达式。缺点&am…

2024-5-3学习笔记 虚拟继承原理

目录 原理 总结 前面提到过&#xff0c;解决菱形继承产生的数据二义性问题和数据冗余&#xff0c;就需要用到虚拟继承&#xff0c;关于它是如何解决的&#xff0c;我们来一起研究。 class Person { public :string _name ; // 姓名 }; class Student : virtual public Perso…

Chrome浏览器命令行妙用:使你的网上冲浪更加无障碍

引言 在当今数字化时代&#xff0c;网络浏览器已成为我们日常生活中不可或缺的工具之一。对于许多人来说&#xff0c;Google Chrome浏览器是首选&#xff0c;不仅因为它的普及度&#xff0c;更因为它提供的丰富功能和高度的可定制性。在Chrome的众多特性中&#xff0c;命令行功…

Pytorch实现图片异常检测

图片异常检测 异常检测指的是在正常的图片中找到异常的数据&#xff0c;由于无法通过规则进行识别判断&#xff0c;这样的应用场景通常都是需要人工进行识别&#xff0c;比如残次品的识别&#xff0c;图片异常识别模型的目标是可以代替或者辅助人工进行识别异常图片。 AnoGAN…

Linux-信号概念

1. 什么是信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送信号通知进程&#xff0c;进程进行后续处理 在日常生活中就有很多例子&#xff0c;比如打游戏方面王者荣耀的“进攻”&#xff0c;“撤退”&#xff0c;“请求集合”&#xff0c;“干得漂亮&#xff01…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

第四百九十二回

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容&#xff0c;本章回中将介绍SegmentedButton组件.闲话休提&#xff0c;让我们一起Talk …

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…