ESP32蓝牙BLE连接米家温湿度计

ESP32蓝牙BLE连接米家温湿度计

文章目录

  • ESP32蓝牙BLE连接米家温湿度计
    • 简介
    • 需要准备的东西
    • 软件调试
    • 代码实现
      • 修改查找的名称
    • 修改需要连接的服务和属性
      • 添加解析数据的代码
    • 上电演示
    • 提示

简介

最近在学习低功耗蓝牙BLE(Bluetooth Low Energy),刚好手里有个米家蓝牙温湿度计连接一下,在网上搜索了下相关资料,结合ESP32的BLE的历程完成数据获取以及对温湿度解析的工作。

需要准备的东西

  • 米家蓝牙温湿度计
  • BLE调试助手 or 谷雨蓝牙调试助手(小程序) or nRF Connect
  • ESP32开发环境

软件调试

  1. 首先我们使用谷雨蓝牙调试助手,小程序版本 搜索周边的蓝牙信号,找到名称为LWSD03MMC 的蓝牙
  2. 找到一个UUID为 EBE0CCB0打头 7DA3A6结尾 的服务
  3. 在该服务下找到UUID为EBE0CCC1打头 7DA3A6结尾的属性 权限是可读可通知
  4. 点击监听或者读取 将字符选择为16进制 等待监听一次数据

在这里插入图片描述

在这里插入图片描述

数据解析

我们收到的数据格式如下

440A357C0B

将其分开

0x44 0x0A 0x35 0x7C 0x0B

其中数据的格式是以大端模式存储的,即高位放低地址,高位放低地址 所以0x44 0x0a表示的温度信息就是 0x0a44

将其转换成10进制就是2628,对应的就是26.28℃,和表现的相差不大(更新时间的缘故),因此对于上面的数据 我们可以对他进行解析

0x0a44->温度数据->2628(DEC)->26.28℃
0x35->湿度数据->53(DEC)->53%
0x0B7C->电压数据->2940(DEC)->2.94V

在这里插入图片描述

代码实现

经过上述的讲解 我们已经可以简单的对数据进行解析,下面我们将要用ESP32的蓝牙gatt_client例程完成对蓝牙数据的解析,因为蓝牙温湿度计作为数据服务的提供者,所以是SERVER端,我们作为数据的接收者,所以是client的例程

修改查找的名称

在原本的例程中 上电会扫描周围的额蓝牙设备,直到扫描到指定名称的蓝牙设备才会停止,所以我们需要修改设备名称为LYWSD03MMC

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改需要连接的服务和属性

在代码中 是对BLE的属性做了过滤,这里我们填写上面调试得到的蓝牙UUID,注意这里是大端模式,所以上面的EB打头A6结尾就要变成A6打头EB结尾

在这里插入图片描述

添加解析数据的代码

我们在NOTIFY_EVT时间的处理中添加得到的notify信息,传入参数为收到的通知的值以及数据的长度

在这里插入图片描述

解析函数

解析函数如下所示,我们定义了一个数组,复制了传进来的数据,然后根据上面讲的大端模式,组成16位温度数据 8位湿度数据,16为电压数据 解析 让然后打印

//定义的存储数据的结构体
struct MI_SENSOR_DATA_t
{
    float temperature;
    uint8_t huminity;
    float batVoltage;
};

struct MI_SENSOR_DATA_t Mi_Sensor_data;


static void Deal_MISensor(uint8_t *rawdata,uint8_t rawdata_len)
{
    uint8_t rawdata_len_copy = rawdata_len;
    uint8_t rawdata_copy[rawdata_len_copy+2];

    uint16_t temp=0;

    memcpy(rawdata_copy, rawdata, rawdata_len_copy);
    ESP_LOGI(GATTC_My_TAG,"REC data len:%d ",rawdata_len_copy);
    esp_log_buffer_hex(GATTC_My_TAG, (unsigned char *)rawdata_copy, rawdata_len_copy);
    /*42 0a 3f 2a 0b*/
    /*0x0a42 ->温度 0x3f->湿度 0x0b2a 电量*/
    //获取温度
    temp = rawdata_copy[1];
    temp = (temp << 8)+rawdata_copy[0];
    Mi_Sensor_data.temperature=temp/100.0;
    //获取湿度
    temp &= 0x00;
    temp = rawdata_copy[2];
    Mi_Sensor_data.huminity = temp;

    //获取电池电量
    temp &= 0x00;
    temp = rawdata_copy[4];
    temp = (temp << 8)+rawdata_copy[3];
    Mi_Sensor_data.batVoltage = temp/1000.0;

    ESP_LOGI(GATTC_My_TAG,"温度:%.2f C 湿度:%d 电量:%.3f V \r\n",
            Mi_Sensor_data.temperature,
            Mi_Sensor_data.huminity,
            Mi_Sensor_data.batVoltage);
}

上电演示

在这里插入图片描述

在这里插入图片描述

提示

运行了一会儿,10分钟左右,发现电压从2.929掉到了2.885 掉电还是挺快的 如果我们更新时间比较快的话是比较耗电的,这也就是说为什么手机端的数据一个小时更新一次的原因,因此我们可以不再noitify属性,而是主动去read属性 或者设备只在需要的时候去搜索 连接 notify然后断掉,具体到的玩法后续再开发
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

如何将Postman API测试转换为JMeter以进行扩展

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;-CSDN博客跳槽涨薪的朋友们有福了&#xff0c;今天给大家推荐一个软件测试面试的刷题小程序。​编辑https://…

递归与回溯 || 排列问题

目录 前言&#xff1a; 全排列 题解&#xff1a; 全排列 II 题解&#xff1a; 子集 题解&#xff1a; 组合 题解&#xff1a; 组合总和 题解&#xff1a; 电话号码的字母组合 题解&#xff1a; 字母大小写全排列 题解&#xff1a; 优美的排列 题解&#xff1a;…

Hbase搭建教程

Hbase搭建教程 期待您的关注 ☀小白的Hbase学习笔记 目录 Hbase搭建教程 1.上传hbase的jar包并解压 2.重新登录 3.启动zookeeper 4.配置环境变量 5.关闭ZK的默认配置 6.修改hbase-site.xml文件 7.修改regionservers文件 8.将配置好的文件分发给其它节点 9.配置环境变量…

shell编程中的运算符的讲解

在Linux操作系统中也可以使用expr来进行一些数值的运算&#xff0c;expr接受表达式作为参数&#xff0c;并打印计算结果。 对于某些复杂的表达式或早期不支持内嵌算术表达式的Shell环境&#xff0c;expr 仍然是一个可行的选择。 如上图所示&#xff0c;是使用变量sum来承接加和…

【算法训练记录——Day31】

Day31——贪心算法Ⅰ 1. 理论1.1 什么是贪心1.2 什么时候用贪心1.3 贪心算法一般步骤 2.leetcode455——分发饼干3.leetcode376——摆动序列 目标&#xff1a; 理论leetcode455——分发饼干leetcode376——摆动序列leetcode53 —— 最大字序和 1. 理论 算法随想录——贪心 1…

四十七、openlayers官网示例Image Filters——给地图添加锐化、浮雕、边缘等滤镜效果

官网demo示例&#xff1a; Image Filters 这篇讲的是如何给地图添加滤镜。 一看代码&#xff0c;&#xff0c;好家伙&#xff0c;信息量满满&#xff0c;全都看不懂。。。 咱只能一段一段扒。。。 首先添加一个底图到地图上&#xff0c;这个好理解。 const imagery new Til…

第十一章:接口

接口 文章目录 接口一、简介1.1 接口是什么1.2 接口的作用1.3 接口的开发与调用1.4 接口的组成 二、RESTful API三、json-server四、接口测试工具五、接口的创建 一、简介 1.1 接口是什么 接口是前后端通信的桥梁 简单理解&#xff1a;一个接口就是 服务中的一个路由规则&am…

十分钟学会微调大语言模型

有同学给我留言说想知道怎么训练自己的大语言模型&#xff0c;让它更贴合自己的业务场景。完整的大语言模型训练成本比较高昂&#xff0c;不是我们业余玩家能搞的&#xff0c;如果我们只是想在某个业务场景或者垂直的方面加强大模型的能力&#xff0c;可以进行微调训练。 本文…

ssl证书能认证多少个域名

SSL证书能认证的域名数量取决于SSL证书的类型。不同类型的SSL证书支持不同数量的域名&#xff1a; SSL证书&#xff0c;作为网络安全的基石之一&#xff0c;起着至关重要的作用。它通过为网站提供加密连接&#xff0c;确保数据传输的安全性和完整性&#xff0c;同时验证网站的真…

spark常见问题

写文章只是为了学习总结或者工作内容备忘&#xff0c;不保证及时性和准确性&#xff0c;看到的权当个参考哈&#xff01; 1. 执行Broadcast大表时&#xff0c;等待超时异常&#xff08;awaitResult&#xff09; 现象&#xff1a;org.apache.spark.SparkException: Exception…

答应我,完成单位投稿任务用对的方法别让自己受投稿之苦

在这个信息爆炸的时代,单位的形象塑造与品牌传播已成为不可忽视的关键环节。作为单位的信息宣传员,我深知每一次对外发声的重要性,它不仅是展示我们工作成果的窗口,更是连接公众、塑造品牌形象的桥梁。然而,在传统的投稿方式中,尤其是依赖于邮箱投稿,我经历了太多次的挫败与无奈…

LeetCode 算法:合并两个有序链表 c++

原题链接&#x1f517;&#xff1a;合并两个有序链表 难度&#xff1a;简单⭐️ 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;…

PHP学习笔记--初学

笔录&#xff1a;我是从黑马里面找的资料学习的&#xff0c;如果有人看我的笔记话&#xff0c;建议去看黑马程序课程&#xff0c;更详细一些。 目录 php定义&#xff0c;平台支持&#xff1a; 静态网站&#xff1a; 动态网站&#xff1a; 服务器概念&#xff1a; IP的概念…

JavaFX 分隔符

Separator类表示水平或垂直分隔线。它分割元素&#xff0c;不产生任何动作。 我们可以设计风格&#xff0c;应用视觉效果&#xff0c;并为分隔符设置动画。 默认情况下&#xff0c;分隔符是水平的。我们可以使用setOrientation方法改变它的方向。 Separator类扩展了Node类。…

2024/6/18(RBAC,查询用户权限,细粒度授权,选课,支付宝生成二维码支付,支付结果查询需要内网穿透)

黑马程序员【学成在线项目】,P141 测试沙箱支付宝_黑马学成在线支付宝沙箱-CSDN博客 需要内网穿透

reverse-android-实战喜马拉雅-ollvm

资料 1. apk: com.ximalaya.ting.android.apk. 2020年8月 可以使用 2. 抓包分析 java层分析 so层分析 登录的算法so是在 liblogin_encrypt.so中。 32位的&#xff0c; 用 IDA打开&#xff0c;查看 静态的导出函数。 打开 一个 首先看到 IDA VIEW 是一个横向 比较多的分支&am…

【3D模型库】机械三维模型库整理

1 开拔网 简介&#xff1a;开拔网是中国较早的机械设计交流平台&#xff0c;广受行业内的各个大学&#xff0c;公司以及行业人士的欢迎。网站有非常丰富的3D模型&#xff0c;CAD图纸&#xff0c;以及各类热门软件的下载。同时我们也为行业搭建一个平台&#xff0c;提供各类设计…

AI智能盒子助力中钢天源设备工厂升级安全防护

中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司&#xff0c;主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中&#xff0c;采用并定制开发一系列厂区安全…

【C++】Template模板

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【Spine学习12】之 事件帧

1、新建事件帧&#xff1a; 2、选择第8s的攻击帧&#xff0c;点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的