这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » FRDM-MCXW71温湿度计成果贴

共1条 1/1 1 跳转至

FRDM-MCXW71温湿度计成果贴

助工
2026-06-22 01:11:51     打赏

在成果贴中,要完成的是在心率的工程上融合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初始化的代码,用来看是否准备好了

图片.png

最后把读到的数据每隔一秒通过

temp_notify();hum_notify();

发送一次

图片.png

prj.conf文件这样配置

图片.png

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

图片.png

那么程序部分已完成,接下来处理上位机程序板块

本项目使用微信开发者工具编写微信小程序。完整工程包括如下代码文件:

上位机板块这里我直接调用的老师给的资料文件里面的工程文件,下载链接为:https://pan.baidu.com/s/1iENb8JTStnTeXWI8sEO1NQ?pwd=b6sh 提取码: b6sh 

这里只需要把蓝牙的名字、UUID的服务号和特征号对其即可使用,如下图

图片.png

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

图片.png

实现效果如下图所示

图片.png

自此,便以完成FRDM-MCXW71温湿度计的基本功能


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]