Esp32+阿里云物联网平台+DHT11+控制LED(基于PubSubClient库)

Esp32+阿里云物联网平台+DHT11+控制LED

关于本文:利用ESP32连接DHT11温湿度传感器获取温湿度,上报到阿里云物联网平台,通过阿里云物联网平台实时远程查看温湿度,并且接收平台下发的LED灯控制指令。要注意的是,阿里云有两个版本的物联网平台,我这里使用的是新版的。

关于开发中用到的【MQTT库】,找到适用的有PubSubClient和AsyncMqttClient

  • PubSubClient:使用上简单直接,不需要用户自行加密生成MQTT_PASSWD(在阿里云直接查到),但属于阻塞型库,小项目使用影响不大。
  • AsyncMqttClient:属于非阻塞型库,效率性能更强。笔者在测试连接MQTT时直接使用阿里云中的CLIENT_ID、MQTT_USRNAME、MQTT_PASSWD并没有成功,而是采用该库中的源码方式,用SHA256加密后作为密码连接MQTT才能成功。

本文采用第一种PubSubClient库方式,另一种AsyncMqttClient库方式在另一篇文章中。

1.准备工作

1.1.本地开发环境

尝试了三种开发环境:

  1. VSCode(espressif):在VSCode上安装乐鑫官方开发库;
  2. VSCode(platformIO):在VSCode上安装兼容esp32和Arduino的库platformIO;
  3. Arduino IDE

最后整个体验下来,Arduino IDE是最省心的,当然另两个也很强大,特别是platformIO。

安装必要的库

在Arduino IDE库管理中搜索并安装三个库

  • PubSubClient
  • DHT sensor
  • ArduinoJson

对应代码中的库包含

#include <PubSubClient.h>   A client library for MQTT messaging.
#include <DHT.h>
#include <ArduinoJson.h>

还有一个是“WiFi.h”,选择esp32板卡默认存在的库,不需要额外安装

1.2.新版阿里云物联网平台

注册并登录物联网平台

  • 看到左下角 公共实例 中显示具体ID才是新版,否则为旧版。
    在这里插入图片描述

  • 点击 公共实例 》进入实例设备数(查看),在查看实例界面可以看到左侧产品和设备,这里的产品是指一大类设备归属的产品,也就是新建一个产品并给产品一个归属哪一类之后就可以在这个产品上添加多个设备。
    在这里插入图片描述

  • 新建产品
    不同的产品默认的功能会有所不同,但都可以自定义添加额外的功能
    在这里插入图片描述

  • 添加功能定义(这一步很重要)
    在这里插入图片描述

因为之前已经选择添加了“卧室温度”,这里选择“室内温度”为例。
在这里插入图片描述
注意,添加功能分三种:属性、服务、事件。不同功能对应的数据定义不同,操作也不同。对比我添加的两个主灯开关,功能类型是服务和属性的区别,一个是异步调用,另一个是布尔值,标识符也不一样。这里的标识符在后面编程时会用到,例如温度标识符RoomTemp。

在这里插入图片描述

  • 添加设备,这里添加了两个设备,能看到都归属中控屏产品
    在这里插入图片描述

查看温湿度设备,有两个地方需要记录后面编程用到:

1.MQTT连接参数
在这里插入图片描述

2.设备证书三元组数据
-
3.在物模型数据查看刚刚新建的产品功能
在这里插入图片描述

1.3.硬件准备

ESP32的主控板
DHT11温湿度传感器
LED
杜邦线若干
在这里插入图片描述

2.编程

#include <WiFi.h>
#include <PubSubClient.h>  //A client library for MQTT messaging.
#include <DHT.h>
#include <ArduinoJson.h>#define LED 22              // LED接esp32引脚22
#define DHTPIN 4            // 温湿度引脚接esp32引脚4
#define DHTTYPE DHT11       // DHT 11
DHT dht(DHTPIN, DHTTYPE);   // Creats a DHT object/* 修改要连接的WIFI SSID和密码 */
#define WIFI_SSID "xxx"
#define WIFI_PASSWD "xxxxxx"/* 修改设备的三元组信息*/
#define PRODUCT_KEY "xxxxx"
#define DEVICE_NAME "TempHumi"
#define DEVICE_SECRET "3012e866383a1931cb2bc963fdfd15e"//不需要,自动生成
#define REGION_ID "cn-shanghai"/* 修改MQTT的参数,线上环境域名和端口号*/
#define MQTT_SERVER "iot-06z00bpscn7cdj.mqtt.iothub.aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
#define CLIENT_ID "k15j9kWxg8H.TempHumi|securemode=2,signmethod=hmacsha256,timestamp=1715070823046|"
#define MQTT_PASSWD "dbb0a917f61b85032abc363b7c825911d3fffaef8fbca179ff8ffcf9a587a7e"//宏定义订阅主题,可以修改ID为自己的设备名称TempHumi
#define ALINK_BODY_FORMAT "{\"id\":\"TempHumi\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"const char* topic = "/sys/k15j9kWxg8H/TempHumi/thing/service/property/set";
unsigned long lastMs = 0;
extern String WiFiAddr = "";
float HumiValue;
float TempValue;WiFiClient espClient;
PubSubClient client(espClient);//连接wifi,获取MAC地址
void wifiInit() {WiFi.begin(WIFI_SSID, WIFI_PASSWD);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("Connecting to WiFi...");}Serial.println("");Serial.println("WiFi connected");Serial.print("Camera Ready! Use 'http://");Serial.print(WiFi.localIP());WiFiAddr = WiFi.localIP().toString();Serial.println("' to connect");// 获取MAC地址uint8_t mac[6];esp_read_mac(mac, ESP_MAC_WIFI_STA);// 打印MAC地址Serial.printf("MAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}//mqtt连接
void mqttCheckConnect() {while (!client.connected()) {Serial.println("Connecting to MQTT Server ...");if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD)) {Serial.println("MQTT Connected!");} else {Serial.print("MQTT Connect err:");Serial.println(client.state());delay(5000);}}
}//上传温湿度
void mqttIntervalPost() {char param[32];char jsonBuf[128];//upload humidityHumiValue = dht.readHumidity();sprintf(param, "{\"RoomHumidity\":%0.1f}", HumiValue);//这里的RoomHumidity修改为自己的产品功能标识符sprintf(jsonBuf, ALINK_BODY_FORMAT, param);Serial.println(jsonBuf);bool b = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);// if(b){//   Serial.println("publish Humidity success");// }else{//   Serial.println("publish Humidity fail");// }// Upload temperatureTempValue = dht.readTemperature();sprintf(param, "{\"RoomTemp\":%0.2f}", TempValue);//这里的RoomTemp修改为自己的产品功能标识符sprintf(jsonBuf, ALINK_BODY_FORMAT, param);Serial.println(jsonBuf);bool c = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);// if(c){//   Serial.println("publish Temperature success");// }else{//   Serial.println("publish Temperature fail");// }
}//回调函数
void callback(char* topic, byte* payload, unsigned int length) {Serial.print("Message arrived [");Serial.print(topic);                // 打印主题信息Message arrived [/sys/k15j9kWxg8H/TempHumi/thing/service/property/set]Serial.print("] ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);   // 打印主题内容{"method":"thing.service.property.set","id":"704369436","params":{"LightSwitch":1},"version":"1.0.0"}}Serial.println();DynamicJsonDocument doc(1024);                 //创建了一个名为 doc 的动态 JSON 文档deserializeJson(doc, String((char*)payload));  //从一个名为 payload 的数据中解析 JSON 数据并将其填充到 doc 中if (doc["params"].containsKey("LightSwitch")) {//这里的LightSwitch也是一个开关标识符,同样对应主灯开关属性,注意这里是属性,不是服务或者事件。Serial.println("GOT LightSwitch CMD");digitalWrite(LED, doc["params"]["LightSwitch"]);//改变这里的属性布尔值即可控制LED开关。}
}void setup() {pinMode(LED, OUTPUT);Serial.begin(115200);dht.begin();wifiInit();client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接MQTT服务器 */client.setCallback(callback);             //设定回调方式,当ESP32收到订阅消息时会调用此方法digitalWrite(LED, LOW);
}void loop() {if (millis() - lastMs >= 5000) {lastMs = millis();mqttCheckConnect();mqttIntervalPost();}client.loop();// delay(2000);
}

3.连接线路

在这里插入图片描述

4.实现效果

  • 在本地Arduino IDE

烧录代码后串口监视器能看到WiFi连接、MQTT连接、温湿度值
在这里插入图片描述

  • 阿里云网联网端

打开实时刷新,能看到刷新时间和温湿度值
在这里插入图片描述

  • 在线调试

在主灯开关调试选择 关闭 / 打开,控制LED亮或者灭,右侧查看参数
在这里插入图片描述
在Arduino IDE端同样能看到物联网平台发出的指令,标识符LightSwitch为1点亮LED,为0就熄灭LED。
在这里插入图片描述

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

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

相关文章

【动态规划】零基础解决路径问题(C++)

目录 62.路径问题 解法&#xff08;动态规划&#xff09;&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a; 4. 填表顺序&#xff1a; 5. 返回值&#xff1a; 不同路径2.0 解法&#xff08;动态规划&#xff09;&#xff1a; …

22-LINUX--多线程and多进程TCP连接

一.TCP连接基础知识 1.套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程…

React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么&#xff1f; 1.Redux是一个专门用于状态管理的js库 2.它可以用在React、Angular、Vue的项目中&#xff0c;但基本与React配合使用。 3.作用&#xff1a;集中式管理React应用中多个组件共享的状态。 二、Redux 工作流程 三、Redux的三个核心概念 1.action 动…

振弦采集仪在岩土工程监测中的精度与可靠性评估

振弦采集仪在岩土工程监测中的精度与可靠性评估 河北稳控科技振弦采集仪是一种常用的岩土工程土体力学参数监测仪器&#xff0c;它主要用于测量岩土中的应力、应变和模量等力学参数。在岩土工程中&#xff0c;土体力学参数的精确测量对于工程设计、施工和监测都非常重要。因此…

前缀和算法专题

应用: 计算数组中某区间的和 一. 一维前缀和[模版] 答案 二. 二维前缀和[模版] 答案 三. 寻找数组的中心下标 答案 四. 除自身以外数组的乘积 答案 五. 和为k的子数组 答案 六. 和可被k整除的子数组 答案 七. 连续数组 答案 八. 矩阵区域和 答案

如何查看网站的cookie?

前言&#xff1a; 在网络世界中&#xff0c;cookie是一种常见的信息存储方式。 对于开发者和普通用户来说&#xff0c;了解如何查看CSDN的cookie是非常重要的。 本文将介绍几种常用的方法&#xff0c;帮助大家更好地理解和使用cookie&#xff1a; 代码示例&#xff1a; 通过浏…

Docker基础篇之入门使用

文章目录 1. Docker的基本组成2. Docker平台架构3. 阿里云镜像加速4. Docker的Hello World入门案例5. 总结 1. Docker的基本组成 Docker的基本组成主要是有四部分&#xff0c;分别是镜像、容器和仓库。 镜像&#xff1a;Docker镜像就是一个只读的模版&#xff0c;镜像可以用来…

【Spring】深入理解 Spring 状态机:简化复杂业务逻辑的利器

前言 在软件开发中&#xff0c;有许多场景需要处理状态转换和状态驱动的逻辑&#xff0c;比如订单处理、工作流程管理、游戏引擎等。Spring 状态机&#xff08;Spring State Machine&#xff09;是 Spring Framework 提供的一个强大的模块&#xff0c;用于帮助开发人员轻松构建…

二叉搜索树BST ——(C++)

本篇将会讲解有关二叉树的搜索原理&#xff0c;以及关于二叉搜索树的建立&#xff0c;以及二叉树搜索树的插入、删除和查找等基本操作。最后我们还会对二叉搜索树进行功能扩展&#xff0c;介绍有关搜索二叉树的 K 模型和 KV 模型。目录如下&#xff1a; 目录 1. 搜索二叉树 二叉…

前端学习CSS-2

盒子模型 盒子模型相关属性 一些盒子模型的样式示例 传统网页布局方式 浮动 浮动的三大特性 脱标&#xff1a;脱离标准流一行显示&#xff0c;顶部对齐具备行内块元素特性 定位

Java整合EasyExcel实战——1

参考&#xff1a;读Excel | Easy Excel快速使用easyexcel的来完成excel的读取https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read 准备条件 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifa…

Android 动效整理

Android自定义SeekBar&#xff0c;滑动时弹出气泡指示器显示进度 安卓开发中非常炫的效果集合_android 开发 向右上角收起炫酷动态效果-CSDN博客 https://github.com/shenghuntianlang/Android-Views?tabreadme-ov-file#decentbanner 以前收藏了很多文章&#xff0c;但是过…

【UE5.1 角色练习】08-传送技能

前言 在上一篇&#xff08;【UE5.1 角色练习】07-AOE技能&#xff09;基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标&#xff0c;我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射&#xff0c;设置按…

Python爬虫入门实例:Python7个爬虫小案例(附源码)

引言 随着互联网的快速发展&#xff0c;数据成为了新时代的石油。Python作为一种高效、易学的编程语言&#xff0c;在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例&#xff0c;帮助读者掌握爬虫技能。 一、爬虫原理 爬虫&#xff0c;又…

2024年上半年信息系统项目管理师下午真题及答案(第二批)

试题一 某项目计划工期为10个月&#xff0c;预算210万元&#xff0c;第7个月结束时&#xff0c;项目经理进行了绩效评估&#xff0c;发现实际完成了总计划进度的70%。项目的实际数据如表所示&#xff1a; 单击下面头像图片领取更多软考独家资料

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中&#xff0c;良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件&#xff0c;帮助企业做出明智的选择。 一、企业内…

深度融合大语言模型与知识图谱:思通数科企业知识库智能问答系统的创新实践

摘要 在知识经济时代&#xff0c;企业知识管理的重要性日益凸显。本文深入探讨了思通数科如何利用大语言模型和知识图谱技术&#xff0c;构建企业知识库智能问答系统&#xff0c;以促进知识的高效获取、共享、应用和创新&#xff0c;从而提升企业的知识管理水平和业务价值。 1…

钕铁硼表面磷化处理

大家都知道烧结钕铁硼易氧化、易腐蚀&#xff0c;日久将造成磁性能的衰减甚至丧失&#xff0c;所以使用前必须进行严格的防腐处理。在之前的文章中已经向大家介绍过与烧结钕铁硼表面处理相关的知识和电镀的工艺流程&#xff0c;除了电镀之外&#xff0c;钕铁硼表面处理还可采用…