ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED)_传感器怎么把信号传输到手机

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

+ [2.4 代码优化](#24__153)

前言

前面文章说过,蓝牙协议博主了解不是很深入,只进行一些基础的了解,示例的测试,和初学者一样,基本上蓝牙专栏系列博文都是一步一步摸索过来的,功夫不负有心人,到目前为止,多多少少对蓝牙 GATT 有了一定的认识。

那么我们今天就要学以致用,使用 ESP32-C3 的蓝牙 GATT,做一个数据通信的应用实例。

与本实例相关的 ESP32-C3 专栏系列博文如下:

ESP32-C3 入门专栏目录【导航】ESP32-C3 入门教程目录 【快速跳转】
❤️
ESP32-C3学习 蓝牙 篇系列博文连接:

❤️
测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

❤️
测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)
❤️
蓝牙篇系列相关博文:
ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)
ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)
ESP32-C3 学习测试 蓝牙 篇(三、认识蓝牙 GATT 协议)
ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)
ESP32-C3 学习测试 蓝牙 篇(五、添加 characteristic)
ESP32-C3 学习测试 蓝牙 篇(六、添加 Service)
ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)
❤️
本应用涉及的博文除了上面之外还有:
ESP-IDF工程结构说明:
认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)
设备和传感器驱动:
ESP32-C3入门教程 基础篇(四、I2C总线 — 与SHT21温湿度传感器通讯)
ESP32-C3入门教程 基础篇(五、RMT应用 — 控制 SK6812全彩RGB 灯)


一、整体框架

整个实例功能还是比较简单的,毕竟我们也刚接触 ESP32-C3 的蓝牙,直接用下图表示:

在这里插入图片描述
.

安卓手机 APP 我得考虑一下 ,因为我是 java 小白,虽然照猫画虎做过APP, 有时间当然搞起来没问题,但是得花些时间,而博主最近时间不太够用…… 所以这个,再看把 = =!

废话不多说,我们直接开始……

二、数据传输部分

先实现把传感器数据上传至手机的部分功能。

2.1 添加温湿度驱动组件

在我的博文 认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)中提到过,如何调整一个工程以及如何添加自己的组件代码,我们按照步骤先把需要的组件添加。

组件的添加,我们如果熟悉工程架构,可以直接把文件夹复制到工程中,那我们温湿度驱动组件,我们先用一下标准的组件添加方式,如下图:

在这里插入图片描述

当然,这里只是搭建了一个标准的组件框架,我们得把以前的 sht21 驱动代码复制到这两个文件中。

2.2 传感器数据传输程序

驱动代码移植好了,我们要使用起来,这个地方主要就是在于怎么把数据传输出去,在蓝牙系列的文章ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)中我们做过分析,我们如何传输自定义数据。

所以在那个基础之上我做了如下处理:

case ESP_GATTS_READ_EVT:
            ESP\_LOGI(GATTS_TABLE_TAG, "ESP\_GATTS\_READ\_EVT, conn\_id %d, trans\_id %d, handle %d\n", 
                                    param->read.conn_id, param->read.trans_id, param->read.handle);
            // ESP\_LOGI(GATTS\_TABLE\_TAG, "VAL\_B %d\n", heart\_rate\_handle\_table[IDX\_CHAR\_VAL\_B]);
            if(heart_rate_handle_table[IDX_CHAR_VAL_B] == param->read.handle){
                int thread;
                float T = 0;
                float H = 0;

                char th_data[20];
                thread = SHT2X\_THMeasure(I2C_MASTER_NUM);
                if(thread == ESP_ERR_TIMEOUT){}
                else{
                    T = (getTemperature()/100.0);
                    H = (getHumidity()/100.0);
                }
                sprintf(th_data,"tem:%.2f , hum:%.2f",T,H);
              esp\_ble\_gatts\_set\_attr\_value(param->read.handle,sizeof(th_data),(uint8\_t\*)th_data);
            }
            break;

温湿度的逻辑不是一定得写在这里,程序任何地方都可以。需要连续读取2才才能正确的读到实时数据。

请看下面详细说明。

再次说明: ESP_GATTS_READ_EVT 事件

这里要先再次说明一个问题,就是回调函数中断的事件,我们这个 ESP_GATTS_READ_EVT 事件。

ESP_GATTS_READ_EVT 事件,回调函数的事件,是在事件发生之后。回调函数中的事件都是在事件发生了,才会触发的!

READ 读取的数据不是靠回调函数里面写逻辑给的数据,而是一直存在的 characteristic 的 value 值。 事件只是告诉你有读事件发生!

改变 characteristic 的 value 值的逻辑,可以在程序中任意地方修改,手机读取时候只取当时的 characteristic 的 value 值。

在上一篇博文

在这里插入图片描述
.

回到我们上面给出的代码要注意的地方:

1、 是用上面的方式,需要在下一次读取的时候才能读到上一次温湿度的值,如果需要实时数据,可以采取连续读取2次的方式(下文有优化代码);

这个是一个逻辑问题,就是如何传输实时数据,比如可以另外创建一个任务,不停的周期性读取温湿度数据,放入characteristic 的 value 中。 那么每次 READ 就可以直接读取到最新的 温湿度数据。

2、还是需要注意示例中 value 的长度不能操作 20 字节(我们上一篇文章测试的结果);

在上面程序中使用了组合字符串的 sprintf 函数,注意长度不能过长。

2.3 功能测试

我们完成上述代码,测试一下。

记得添加了新的组件,最好是make clean 一下,这里就是清除一下编译,重新编译。

烧录测试:

在这里插入图片描述

数据传输成功!

再次说明这个数据逻辑问题,可以自行处理,我这里计划读取实时数据时候连续读取2次,取第2次的数据。

2.4 代码优化

本来想着让大家自己测试的,后来想想这种连续读取2次确实不太妥当,干脆自己改个,反正简单:

就是新建一个任务,如下图:

在这里插入图片描述

READ 事件中可以声明都不用做:

在这里插入图片描述

本以为没问题,没想到= =!

连接的时候就出问题了,确实不太明白:

在这里插入图片描述

后来考虑了一下,我直接在手机与设备连接上了以后再创建任务,断开了之后再删除任务不是挺好的?

于是改了一下任务创建的位置:

在 GATT 回调函数,找到设备连接上的事件,进行对应的修改(图中有点问题,下文有修改说明):

在这里插入图片描述

感觉可以,测试一下:

在这里插入图片描述

OK! 第一次就是读到已经更新过的值!

但是上面的代码 还是有个问题,就是断开链接删除任务的时候会出错,上面犯了一个错误,vTaskDelete() 的参数应该是任务句柄,我在创建任务的时候没有给任务句柄。

具体原因可以查看我的FreeRTOS 博文:

FreeRTOS记录(二、FreeRTOS任务API认识和源码简析)

所以代码还是得修改一下,如下图:

在这里插入图片描述

在这里插入图片描述
.

❤️ 到这里,我们成功实现了手机通过蓝牙实时读取开发板的温湿度数据!

额外说明:

这个地方还是得说一下,我通过创建任务的的方式可以读取实时数据,但是我多次测试下来,有时候还是会出问题,在连接的时候有可能重启,但是因为会立即重启恢复,所以到不影响使用测试。

还有一个就是设置的 THread 任务栈太小了,后来把任务放到 2048 ,就没有栈溢出的问题。

出问题的情况就是 THread 任务,如果任务时正常创建,然后手动断开,都没有问题,只有在连接过后,也没有手动断开,过了很长一段时间可能会出现。

猜测原因:估计就是在没有正常连接的时候不应该对 characteristic 的 value 进行修改操作(后面知道原因再来更新说明)。

三、控制部分

控制部分我们的目标是通过手机控制板载的 SK6812全彩RGB 灯。

3.1 添加LED驱动组件

首先还是LED驱动的组件添加,上面我们延时了通过标准架构方式添加组件,在熟悉组件的基础之上,我们可以直接把文件复制过来。

在这里插入图片描述

复制过来,我们得做个基础的测试:

具体的使用方式可以查看专栏中的博文《ESP32-C3入门教程 基础篇(五、RMT应用 — 控制 SK6812全彩RGB 灯)》,在这个工程中:

在这里插入图片描述

做个简单的测试,在我们上面的温湿度读取任务中,切换一下灯的状态:

在这里插入图片描述

上面给出的代码:

1、 一旦手机与开发板建立蓝牙连接,LED灯红绿蓝三色切换;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

外链图片转存中…(img-wyqYH3wU-1715870499682)]
[外链图片转存中…(img-3R31V5QW-1715870499682)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值