这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 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 内核浏览器(ChromeEdgeOpera),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 跳转至

回复

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