这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【e起DIY】低功耗蓝牙温湿度计——Web实时温湿度监测

共1条 1/1 1 跳转至页

【e起DIY】低功耗蓝牙温湿度计——Web实时温湿度监测

菜鸟
2026-06-13 19:34:35     打赏

1. 背景

在完成 FRDM-MCXW71 的 DHT11 温湿度采集和 BLE 广播功能后,需要一个可视化界面来实时查看数据。虽然可以使用手机 APP(如 nRF Connect)查看 BLE 数据,但每次都需要手动订阅特征值,操作繁琐且不够直观。

因此开发了一个基于 Web Bluetooth API 的网页应用,可以直接在浏览器中连接 BLE 设备,实时显示温湿度数据和历史曲线。

2. 技术方案

2.1 Web Bluetooth API

Web Bluetooth API 是浏览器原生提供的蓝牙通信接口,无需安装插件或 APP,可以直接在网页中扫描、连接 BLE 设备并读取数据。

浏览器支持情况:

· Chrome 56+

· Edge 79+

· Opera 43+

· 需要 HTTPS 或 localhost 环境

2.2 BLE 数据格式

FRDM-MCXW71 的 BLE 服务基于 Health Thermometer Service (UUID: 0x1809):

· 温度特征:Temperature Measurement (UUID: 0x2A1C)

· 格式:IEEE 11073 浮点数(8 位指数 + 24 位尾数)

· 属性:indicate

· 单位:摄氏度

· 湿度特征:Humidity (UUID: 0x2A6F)

· 格式:16 位无符号整数

· 属性:read + notify

· 单位:0.01 %RH

两个特征都在同一个 GATT Service 下,网页需要从同一个服务中获取。

3. 实现过程

3.1 文件结构

web/
├── index.html    # 主页面
├── server.py     # 本地 HTTP 服务器
└── debug.html    # BLE 调试工具

3.2 核心代码

BLE 连接

// 连接设备
async function connectDevice() {
    const device = await navigator.bluetooth.requestDevice({
        filters: [
            { name: 'FRDM-MCXW71-TH' }
        ],
        optionalServices: [
            '00001809-0000-1000-8000-00805f9b34fb'  // HTS
        ]
    });
    
    const server = await device.gatt.connect();
    const service = await server.getPrimaryService('00001809-0000-1000-8000-00805f9b34fb');
    
    // 订阅温度和湿度通知
    const tempChar = await service.getCharacteristic('00002a1c-0000-1000-8000-00805f9b34fb');
    await tempChar.startNotifications();
    tempChar.addEventListener('characteristicvaluechanged', onTemperature);
    
    const humChar = await service.getCharacteristic('00002a6f-0000-1000-8000-00805f9b34fb');
    await humChar.startNotifications();
    humChar.addEventListener('characteristicvaluechanged', onHumidity);
}

温度数据解析

function parseTemperatureData(data) {
    const view = new DataView(data.buffer);
    const tempRaw = view.getUint32(1, true);  // little-endian
    
    // IEEE 11073 浮点数格式
    let exponent = (tempRaw >> 24) & 0xFF;
    let mantissa = tempRaw & 0x00FFFFFF;
    
    if (exponent > 127) exponent -= 256;
    if (mantissa > 0x7FFFFF) mantissa -= 0x1000000;
    
    return mantissa * Math.pow(10, exponent);
}

湿度数据解析

function parseHumidityData(data) {
    const view = new DataView(data.buffer);
    const humidityRaw = view.getUint16(0, true);  // little-endian
    return humidityRaw / 100.0;  // 单位 0.01 %RH
}

3.3 UI 设计

页面布局包含:

· 状态栏:显示连接状态和设备名称

· 数据卡片:实时显示温度和湿度

· 曲线图表:使用 Chart.js 绘制历史数据

· 历史记录:可展开的下拉列表

· 系统日志:可展开的日志区域

image.png

4. 使用方法

4.1 启动本地服务器

cd /home/actdxh/zephyr-frdm-mcxw71-review/web
python3 server.py

服务器启动后访问:http://localhost:8080

4.2 连接设备

1. 确保 FRDM-MCXW71 已烧录 BLE 应用(`my_app`)

2. 点击"连接设备"或"扫描所有"

3. 在弹出的设备列表中选择 `FRDM-MCXW71-TH`

4. 连接成功后,温度和湿度数据将实时显示

4.3 功能说明

· 实时数据:温度和湿度卡片会实时更新

· 数据曲线:最近 30 个数据点的折线图

· 历史记录:点击展开查看所有历史数据

· 系统日志:点击展开查看连接和数据更新日志

5. 调试工具

如果遇到连接问题,可以使用调试页面:http://localhost:8080/debug.html

调试功能:

· 检查浏览器蓝牙支持

· 扫描所有 BLE 设备

· 查看设备的服务和特征列表

· 详细的错误日志

6. 注意事项

6.1 浏览器兼容性

Web Bluetooth API 目前只支持 Chromium 内核浏览器(Chrome、Edge、Opera),Firefox 和 Safari 暂不支持。

6.2 安全要求

由于 Web Bluetooth API 涉及硬件访问,浏览器要求:

· HTTPS 环境(生产环境)

· 或 localhost(本地开发)

6.3 设备广播

BLE 设备需要正在广播才能被扫描到:

· 普通版 `my_app`(FRDM-MCXW71-TH):持续广播,推荐使用

· 低功耗版 `my_app_low_power`(FRDM-MCXW71-LP):每 30 秒广播 5 秒,窗口较短

6.4 连接稳定性

BLE 连接可能因信号强度、距离等因素中断。网页会自动监听断开事件并更新状态,用户可以重新连接。

7. 扩展功能

后续可以考虑的扩展:

· 数据导出(CSV/JSON)

· 多设备同时监测

· 数据阈值报警

· 历史数据持久化(localStorage)

· 响应式移动端优化

8. 参考资料

· [Web Bluetooth API 规范](https://webbluetoothcg.github.io/web-bluetooth/)

· [Web Bluetooth 示例](https://googlechrome.github.io/samples/web-bluetooth/)

· [Chart.js 文档](https://www.chartjs.org/docs/)

· [Bluetooth GATT 规范](https://www.bluetooth.com/specifications/gatt/)



共1条 1/1 1 跳转至页

回复

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