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

news2024/11/15 8:55:14

花费两天时间完成了这个项目(不完全是,属于是在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);
      }
    });
  },
})

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】Pod 的生命周期(二)

【云原生】Pod 的生命周期&#xff08;一&#xff09;【云原生】Pod 的生命周期&#xff08;二&#xff09; Pod 的生命周期&#xff08;二&#xff09; 6.容器探针6.1 检查机制6.2 探测结果6.3 探测类型 7.Pod 的终止7.1 强制终止 Pod7.2 Pod 的垃圾收集 6.容器探针 probe 是…

从OutputStream类看Java中的IO流操作

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

VueComponent构造函数

//创建school组件——注册给谁 在谁的结构上写const school Vue.extend({name: school,//开发者工具的显示template: <div><h2>学校名称&#xff1a;{{schoolName}}</h2><h2>学校地址&#xff1a;{{adress}}</h2> </div>,//结构data() {…

学习笔记:【QC】Android Q - data 模块

一、data init 流程图 主要分为3部分&#xff1a; 1.加载TelephonyProvider&#xff0c;解析apns-config.xml文件&#xff0c;调用loadApns将 xml中定义的数据&#xff0c;插入到TelephonyProvider底层的数据库中 2.初始化phone、DcTracker、TelephonyNetworkFactory、Conne…

Docker网络基础

简介 Docker 本身的技术依赖于近年来 Linux 内核虚拟化技术的发展,Docker 对 Linux 内核的特性有很强的依赖。Docker 使用到的与 Linux 网络有关的主要技术有:网络命名空间、veth 设备对、网桥、ipatables 、路由。 网络命名空间 为了支持网络协议栈的多个实例,Linux在网络栈…

Unity类银河恶魔城学习记录 17-1,2 p166 Aliments fx p167 Blackhole additional vfx

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; …

大型语言模型安全风险的基准评估套件

CYBERSECEVAL 2 扩展了以前的工作&#xff0c;增加了两个新的测试套件&#xff1a;解释器滥用和提示注入。 原文标题&#xff1a;CYBERSECEVAL 2: A Wide-Ranging Cybersecurity Evaluation Suite for Large Language Models 原文作者&#xff1a;Manish Bhatt, Sahana Chennab…

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

【Git】【MacOS】Github从创建与生成SSH公钥

创建账号 这一步不过多赘述&#xff0c;根据自己的邮箱新创建一个账号 配置SSH公钥 本人是macOS系统&#xff0c;首先从终端输入 cd ~/.ssh进入.ssh目录,然后通过 ls查看有没有一个叫做id_rsa.pub的文件 本人之前生成过SSH公钥,如果没有的话&#xff0c;通过 ssh-keygen -t…

双重检验锁方式实现单例模式

单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c…

Ansible自动化运维工具单模块介绍

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程&#xff0c;从而提高效率、降低成本&#xff0c;并减少人为错误。在当今复杂的IT环境中&#xff0c;自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…

xyctf(write up)

ezhttp 因为是一道http的题&#xff0c;前端代码没有什么有效信息&#xff0c;但提示说密码在某个地方&#xff0c;我们用robots建立一个robots.txt文件来看有哪个文件可以访问 补充知识&#xff1a;http请求中via字段表示从哪个网址的服务器代理而来&#xff0c;user-agent表…

【深度学习】序列模型

深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个分支领域&#xff1a;它是从数据中学习表示的一种新方法&#xff0c;强调从连续的层中进行学习&#xff0c;这些层对应于越来越有意义的表示。 1. 为什么选择序列模型&#xff1f; 循环神经网络&#xff08;RNN…

用于图生成的自回归扩散模型 笔记

1 Title Autoregressive Diffusion Model for Graph Generation&#xff08;Lingkai Kong、Jiaming Cui、Haotian Sun、Yuchen Zhuang、B. Aditya Prakash、Chao Zhang&#xff09;【PMLR 2022】 2 Conclusion This study propose an autoregressive diffusion model …

文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题

六、假设 B-TREE-SEARCH 的实现是在每个结点内采用二分查找&#xff0c;而不是线性查找。证明&#xff1a;无论怎样选择 t ( t 为 n 的函数)&#xff0c;这种实现所需的 CPU 时间都为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我…

第五十三节 Java设计模式 - 工厂模式

Java设计模式 - 工厂模式 工厂模式是一种创建模式&#xff0c;因为此模式提供了更好的方法来创建对象。 在工厂模式中&#xff0c;我们创建对象而不将创建逻辑暴露给客户端。 例子 在以下部分中&#xff0c;我们将展示如何使用工厂模式创建对象。 由工厂模式创建的对象将是…

27-代码随想录三数之和

15. 三数之和 中等 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重…

爬虫学习(2)破解百度翻译

代码 import requests import jsonif __name__ "__main__":url https://fanyi.baidu.com/sug#post请求参数处理&#xff08;同get请求一致&#xff09;headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …

今天分享一机器视觉的证书吧

工信部颁发的 人工智能 机器视觉证书 分享

ai写作工具推荐:如何用AI人工智能进行写作

AI写作工具&#xff1a;提升创作效率的秘密武器 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;包括写作。AI写作工具&#xff0c;就是利用人工智能技术&#xff0c;帮助我们进行文本生成、语言优化等工作的工…