在成果贴中,要完成的是在心率的工程上融合SHT30的温湿度采集功能,并创建蓝牙UUID的相关服务函数供手机端可以读取到数据,以及上位机关于数据传输的显示功能
下面开始代码的融合编写,
首先克隆好心率程序
然后在程序上把之前调SHT30驱动时的头文件加进来
#include <stdio.h>#include <zephyr/kernel.h> #include <zephyr/device.h> #include <zephyr/drivers/sensor.h>#include <zephyr/sys/printk.h>
然后
用两个独立的 BLE 服务分别承载温度和湿度
每个服务都支持读和通知
真正发出去的值来自 temperature_centi 和 humidity_centi
是否发送通知由客户端订阅状态控制
代码如下:
static int16_t temperature_centi = 2534; /* 25.34 C */static uint16_t humidity_centi = 5678; /* 56.78 % */static bool temp_notify_enabled;static bool hum_notify_enabled;
static void temp_ccc_changed(const struct bt_gatt_attr *attr, uint16_t value){ temp_notify_enabled = (value == BT_GATT_CCC_NOTIFY);}
static void hum_ccc_changed(const struct bt_gatt_attr *attr, uint16_t value){ hum_notify_enabled = (value == BT_GATT_CCC_NOTIFY);}
static ssize_t read_temp(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, uint16_t len, uint16_t offset){ return bt_gatt_attr_read(conn, attr, buf, len, offset, &temperature_centi, sizeof(temperature_centi));}
static ssize_t read_hum(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, uint16_t len, uint16_t offset){ return bt_gatt_attr_read(conn, attr, buf, len, offset, &humidity_centi, sizeof(humidity_centi));}
#define BT_UUID_TEMP_SVC BT_UUID_DECLARE_128(0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, \ 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe)
#define BT_UUID_TEMP_CHRC BT_UUID_DECLARE_128(0x11, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, \ 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe)
#define BT_UUID_HUM_SVC BT_UUID_DECLARE_128(0x20, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, \ 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe)
#define BT_UUID_HUM_CHRC BT_UUID_DECLARE_128(0x21, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, \ 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe)
BT_GATT_SERVICE_DEFINE(temp_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_TEMP_SVC), BT_GATT_CHARACTERISTIC(BT_UUID_TEMP_CHRC, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ, read_temp, NULL, &temperature_centi), BT_GATT_CCC(temp_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE));
BT_GATT_SERVICE_DEFINE(hum_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_HUM_SVC), BT_GATT_CHARACTERISTIC(BT_UUID_HUM_CHRC, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ, read_hum, NULL, &humidity_centi), BT_GATT_CCC(hum_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE));
static void temp_notify(void){ if (temp_notify_enabled) { bt_gatt_notify(NULL, &temp_svc.attrs[2], &temperature_centi, sizeof(temperature_centi)); }}
static void hum_notify(void){ if (hum_notify_enabled) { bt_gatt_notify(NULL, &hum_svc.attrs[2], &humidity_centi, sizeof(humidity_centi)); }}
然后再主函数中增加一段SHT30初始化的代码,用来看是否准备好了

最后把读到的数据每隔一秒通过
temp_notify();hum_notify();发送一次

prj.conf文件这样配置

同时把设备树文件移植过来,如下图

那么程序部分已完成,接下来处理上位机程序板块
本项目使用微信开发者工具编写微信小程序。完整工程包括如下代码文件:
上位机板块这里我直接调用的老师给的资料文件里面的工程文件,下载链接为:https://pan.baidu.com/s/1iENb8JTStnTeXWI8sEO1NQ?pwd=b6sh 提取码: b6sh
这里只需要把蓝牙的名字、UUID的服务号和特征号对其即可使用,如下图

然后点击顶部的真机调试,他会弹出二维码,微信扫描二维码即可出现界面

实现效果如下图所示

自此,便以完成FRDM-MCXW71温湿度计的基本功能
我要赚赏金
