基于nRF52832与SHT31的儿童衣物湿度监测器:低功耗蓝牙穿戴设备实战
2026/8/25 16:19:28 网站建设 项目流程

1. 项目缘起:为什么需要关注儿童衣物的湿度?

作为一名长期关注儿童健康与智能家居的开发者,我最近完成了一个小项目,它源于一个非常具体且容易被忽视的生活痛点:孩子衣物汗湿后的实时监测。很多家长,包括我自己,都遇到过类似的情况——孩子在外面疯玩一阵后,后背、腋下等部位的衣物被汗水浸湿,但孩子自己往往不会主动说,或者玩得太投入根本感觉不到。等到家长发现时,湿漉漉的衣物可能已经贴着皮肤捂了很长时间,轻则导致孩子不舒服、哭闹,重则可能引发着凉感冒,甚至皮肤问题。

传统的做法是靠家长“摸一摸”或者等孩子自己说,但这既不实时,也不精准。尤其是在温差较大的季节,或者孩子进行室内外活动转换时,这种滞后性带来的健康风险会被放大。于是,一个想法自然浮现:能不能做一个轻便、无感、能实时监测孩子衣物湿度的小设备?当湿度超过某个安全阈值时,能立即提醒看护人?这就是“Kid's Clothing Humidity Real-Time Monitor”(儿童衣物湿度实时监测器)项目的初衷。它不是一个复杂的科研仪器,而是一个旨在解决具体生活问题、提升育儿体验的实用型DIY项目。

这个项目的核心价值在于“实时”与“预警”。它通过传感器将不可见的湿度变化转化为可视、可听的数据与警报,让看护者能第一时间采取行动(如给孩子垫汗巾、更换干爽衣物),防患于未然。接下来,我将从硬件选型、原理剖析、制作步骤、算法调优到实际应用中的各种“坑”,完整地分享这个项目的实现过程与心得。

2. 核心硬件选型与电路设计思路

要实现衣物湿度的实时监测,硬件是基础。选型需要兼顾几个关键点:测量精度、功耗、体积大小、佩戴舒适性以及成本。经过多轮对比和实测,我最终确定了以下方案。

2.1 湿度传感器的抉择:电容式 vs. 电阻式

湿度传感器是项目的心脏。市面上常见的有电阻式和电容式两种。

  • 电阻式湿度传感器:利用湿敏电阻的阻值随湿度变化的原理。优点是电路简单、成本极低。但缺点非常明显:响应速度慢、精度低、一致性差,且容易因电解而老化,长期稳定性不佳。对于需要贴身穿戴、接触汗液(含电解质)的环境,电阻式传感器基本可以排除。
  • 电容式湿度传感器:利用感湿材料介电常数随湿度变化的特性。其核心是一个电容,湿度变化导致电容值改变。这类传感器响应快、精度高、稳定性好,并且可以设计得非常小巧。主流型号如Sensirion的SHT3x系列TE Connectivity的HTU21D等,都是集成数字输出的芯片,精度可达±2%RH,且带有温度补偿,非常适合本项目。

注意:切勿选择那些几块钱一个的、只有两个引脚或三个引脚的“土壤湿度传感器”模块。它们多是电阻式原理,用于粗略的土壤检测尚可,但用于精度要求高、且接触成分复杂的汗液时,数据会严重失真且漂移巨大。

我最终选择了SHT31-DIS这款传感器。理由如下:

  1. 高精度与高稳定性:典型精度±2%RH,完全满足区分“微潮”、“潮湿”、“湿透”的需求。
  2. 超小尺寸:芯片尺寸仅2.5 x 2.5 mm,加上封装也很小,易于集成到柔性穿戴设备中。
  3. 数字接口:标准的I2C接口,与微控制器通信简单,抗干扰能力强于模拟信号。
  4. 功耗极低:平均测量电流仅1.7µA,非常适合电池供电。

2.2 微控制器的选择:低功耗与无线通信是刚需

微控制器(MCU)是项目的大脑,负责读取传感器数据、处理算法、控制警报和无线通信。选择MCU时,超低功耗集成无线功能是首要考虑因素,因为设备需要长时间佩戴且能主动上报数据。

  • ESP32系列:功能强大,集成Wi-Fi和蓝牙,但即使在深度睡眠模式下,功耗对于纽扣电池供电的穿戴设备来说依然偏高。更适合作为固定式的中继网关。
  • nRF52系列(如nRF52832/nRF52840):蓝牙低功耗(BLE)领域的明星。其功耗控制极为出色,在连接间隔合理设置的情况下,一颗CR2032纽扣电池可以工作数月甚至更久。它完全满足本项目“传感器数据采集+BLE无线传输”的核心需求。

因此,我选择了nRF52832作为主控。它内置了ARM Cortex-M4内核,性能足够,拥有丰富的GPIO和ADC,并且Nordic提供的SDK和SoftDevice(蓝牙协议栈)非常成熟,开发相对便捷。

2.3 电源管理与外围电路设计

一个可靠的穿戴设备,电源设计至关重要。

  1. 供电方案:采用一颗CR2032 3V纽扣电池供电。其容量约220mAh,体积小,易于获取和更换。通过一个低压差稳压器(LDO)如MCP1700-3.0为整个系统提供稳定的3.0V电压。
  2. 功耗控制策略
    • 传感器间歇工作:SHT31本身功耗极低,但为了进一步省电,可以设置为每10秒唤醒测量一次(这个频率对于汗湿监测足够)。
    • MCU深度睡眠:在两次测量间隔,将nRF52832置于System OFF深度睡眠(Deep Sleep)模式,此时功耗可低至1µA以下。
    • 蓝牙广播/连接优化:这是耗电大户。方案有两种:
      • 方案A(无连接广播):设备不建立蓝牙连接,而是以较低频率(如每5秒一次)广播一个包含湿度数据的蓝牙广播包。手机App在后台扫描并解析。这种方式MCU功耗最低,但手机端接收数据可能不连续,且无法反向下发配置(如修改湿度阈值)。
      • 方案B(快速连接传输):设备平时深度睡眠,当传感器检测到湿度超过阈值时,MCU才唤醒并快速建立蓝牙连接,将警报信息发送给已配对的手机,然后立即断开进入睡眠。这种方式更省电,且实现了真正的“事件触发式”警报。我选择了方案B。
  3. 警报模块:选用一个微型贴片振动马达(如1020型)和一个0603封装的红色LED。当湿度超标时,MCU驱动它们工作,提供本地触觉和视觉警报。同时,通过BLE通知手机App发出声音推送。
  4. 柔性电路与封装:为了佩戴舒适,整个电路需要做在柔性PCB(FPC)上,或者使用柔软的导线连接,并将所有元件用柔软的硅胶或医用级TPU材料进行灌封,确保与皮肤接触的部分光滑、无锐角、且具备一定的防水性(防汗)。

3. 固件开发:低功耗逻辑与湿度算法实现

硬件搭好了,接下来是让设备“聪明”起来的软件部分。固件开发主要在nRF52832上,使用Nordic的nRF5 SDK和Segger Embedded Studio进行。

3.1 系统工作流程与状态机设计

整个设备的工作流程是一个精心设计的状态机,核心目标是最大化睡眠时间。

上电初始化 -> 进入深度睡眠 定时器中断唤醒(例如每10秒) -> 唤醒MCU 初始化I2C,读取SHT31温湿度数据 -> 进入湿度判断算法 IF 湿度值 < 阈值: 记录本次数据(可选) 关闭传感器与I2C 重新进入深度睡眠 ELSE IF 湿度值 >= 阈值: 触发本地警报(振动、LED闪烁) 启动蓝牙广播,尝试连接已绑定的手机 连接成功后,发送警报包(包含湿度值、时间戳) 断开蓝牙连接 关闭所有外设 进入深度睡眠(可设置一个较长的“不应期”,如5分钟,防止持续潮湿下的频繁报警)

这个流程的关键在于,绝大多数时间,MCU、传感器、蓝牙都处于关闭或深度睡眠状态,只有极短的瞬间在工作。

3.2 湿度数据的滤波与阈值判断算法

直接从传感器读出的原始数据不能直接用于判断,因为可能存在瞬时干扰(比如衣物被短暂溅到水点)或传感器本身的微小波动。我们需要一个简单的滤波算法。

我采用了一个移动平均滤波结合滞回比较的策略。

  1. 移动平均滤波:不是用单次采样值判断,而是维护一个包含最近N次(例如5次)采样值的小数组。每次新的采样值加入,并剔除最旧的值,然后计算当前平均值。

    #define SAMPLE_SIZE 5 float humidity_buffer[SAMPLE_SIZE]; int buffer_index = 0; float get_filtered_humidity(float new_humidity) { humidity_buffer[buffer_index] = new_humidity; buffer_index = (buffer_index + 1) % SAMPLE_SIZE; float sum = 0; for(int i = 0; i < SAMPLE_SIZE; i++) { sum += humidity_buffer[i]; } return sum / SAMPLE_SIZE; }

    这能有效平滑掉单次突变的噪声。

  2. 滞回比较:这是防止在阈值附近频繁触发警报的关键。我们设定两个阈值:报警阈值(上限)解除报警阈值(下限)

    • 假设设定报警阈值为65%RH,解除报警阈值设为55%RH。
    • 当滤波后的湿度从低于65%上升到超过65%时,触发报警。
    • 一旦报警触发,设备进入报警状态。此时,只有当湿度从高于55%下降到低于55%时,才认为潮湿情况解除,设备退出报警状态。
    • 这样,即使湿度在60%上下波动,也不会导致设备在“报警”和“正常”状态间疯狂切换。

3.3 蓝牙服务(BLE GATT)自定义

我们需要通过BLE向手机App传输数据。为此,在nRF52832上需要自定义一个GATT服务。

  1. 创建自定义服务UUID:例如0xFEF0
  2. 定义特征值(Characteristic)
    • 湿度数据特征:属性为Read & Notify。手机可以读取当前湿度,并且设备可以在湿度超标时主动通知(Notify)手机。数据格式可以用两个字节的整数表示湿度百分比(如65代表65%)。
    • 报警阈值特征:属性为Read & Write。允许手机App在连接后,动态修改设备的报警阈值和解除阈值。
    • 设备状态特征:属性为Read & Notify。传输设备当前状态(如正常、报警、低电量等)和电池电压。

在SDK中,这需要通过ble_gatts.h相关的API来一步步定义和添加服务。这一步需要仔细对照Nordic的GATT示例代码,确保UUID、句柄、属性权限设置正确,否则手机会无法发现或读写特征。

4. 手机端App开发与数据可视化

设备端准备好了,还需要一个终端来接收和展示信息。我选择用Flutter框架开发跨平台(iOS/Android)App,因为它开发效率高,且能很好地与蓝牙通信。

4.1 BLE通信与设备管理

在Flutter中,使用flutter_blue_plus这个插件来处理蓝牙通信。

  1. 设备扫描与过滤:App启动后扫描周围的BLE设备。我们的设备在广播包中会包含特定的Service UUID(即前面定义的0xFEF0),App只显示和列出包含此UUID的设备,避免用户看到一堆无关的蓝牙设备。
  2. 连接与服务发现:用户选择设备后,App发起连接。连接成功后,立即开始发现服务,找到我们自定义的GATT服务及其下的各个特征值。
  3. 数据订阅与监听:成功发现特征后,App向“湿度数据特征”和“设备状态特征”订阅通知(Enable Notification)。这样,一旦设备端数据有变(如触发报警),App就能实时收到回调,无需轮询。
  4. 阈值设置:App提供一个设置界面,当与设备连接时,可以将用户设定的报警上下限阈值,通过“报警阈值特征”写入设备,完成配置同步。

4.2 用户界面与警报逻辑

App的UI设计以简洁、清晰为首要目标。

  • 主界面:中央一个大圆圈,实时显示当前湿度百分比。背景色可以根据湿度值渐变(如蓝色->绿色->黄色->红色)。下方显示设备状态、电池电量、历史曲线入口按钮。
  • 警报触发:当收到设备发来的报警Notify,或者App根据收到的实时数据判断超过阈值时:
    1. 界面大圆圈变为红色并闪烁。
    2. 手机发出高优先级的推送通知(即使App在后台),并伴随持续振动和响铃,确保看护人能立刻察觉。
    3. 通知内容可包含:“宝宝衣物潮湿警报!当前湿度:XX%”。
  • 历史数据:App将接收到的湿度数据(连同时间戳)存储到本地数据库(如SQLite)。可以绘制过去1小时、6小时、24小时的湿度变化曲线,帮助家长了解孩子的活动规律和出汗情况。
  • 多设备管理:考虑到可能有多件衣物或多个孩子,App支持添加和管理多个监测设备,并可以给设备命名,如“小宝的T恤”、“大宝的运动外套”。

5. 实测、校准与遇到的“坑”

理论设计完成,进入激动人心的实测阶段。这个过程也是问题集中爆发的阶段。

5.1 传感器校准与“贴身”环境挑战

第一个大坑来自传感器本身。SHT31的出厂精度是±2%RH,但这通常是指在23°C,特定湿度环境下的实验室数据。当把它封装进一个紧贴皮肤、相对密闭的硅胶套中时,微环境发生了巨大变化。

  • 问题:直接读取的数据,在同样的环境湿度下,比裸露的传感器读数持续偏高约8-10%RH。这是因为封装材料可能吸附少量湿气,且皮肤散发的热量和微量水汽在狭小空间内形成了局部高湿环境。
  • 解决必须进行现场校准。我采用了“两点校准法”。
    1. 低点校准:将封装好的设备与一个高精度的参考湿度计(如经过计量的温湿度记录仪)一同放入装有饱和盐溶液(如氯化镁,可产生约33%RH的稳定湿度环境)的密闭容器中,静置数小时至读数稳定。记录此时传感器读数(例如显示45%RH)和实际环境湿度(33%RH)。得到一点(45, 33)。
    2. 高点校准:同样方法,放入另一种饱和盐溶液(如氯化钠,约75%RH)或专业的湿度发生器。得到另一点(例如读数85,实际75)。
    3. 计算补偿公式:根据这两点,可以计算出一个线性补偿公式实际湿度 = a * 传感器读数 + b。将这两个参数(a, b)写入设备的固件中,在每次读取原始数据后应用此公式进行补偿。经过校准后,测量误差可以控制在±3%RH以内,完全满足应用需求。

5.2 蓝牙连接稳定性与功耗的博弈

第二个坑是蓝牙连接策略。

  • 问题:最初为了确保数据可靠,我让设备在报警时保持连接直到手机确认。但发现有时手机App因系统休眠或网络切换导致连接意外断开,设备端却因未收到断开指令而一直维持在连接状态,疯狂耗电,一颗新电池一天就没电了。
  • 解决:优化连接策略,加入超时强制断开机制
    1. 设备端发起连接后,启动一个硬件看门狗(Watchdog)定时器,超时时间设为10秒。
    2. 如果在10秒内成功发送警报数据并收到手机端的确认包(可以是一个自定义的ACK特征值),则设备主动断开连接,进入睡眠。
    3. 如果10秒内未完成通信或连接异常,看门狗超时复位,设备也会强制进入睡眠状态。同时,设备记录一次“通信失败”次数,如果连续失败多次,可以尝试切换报警方式(如仅本地振动报警)。 这个机制确保了在任何异常情况下,设备都不会陷入高功耗的死循环。

5.3 佩戴舒适性与可靠性的细节打磨

这是从“能用”到“好用”的关键。

  • 问题1:皮肤过敏与透气性。早期使用的普通硅胶封装,孩子佩戴一段时间后皮肤发红。
    • 解决:更换为医用级抗过敏硅胶,并在接触皮肤的一面设计微小的透气孔阵列,在保证防护等级(IP67防汗)的同时,尽可能提升透气性。
  • 问题2:衣物摩擦与脱落。设备如何固定在衣物上?别针可能扎伤孩子,胶贴可能不牢或损伤衣物。
    • 解决:设计了一个柔软的硅胶夹子,类似一个扁平的“小螃蟹钳”,可以牢牢夹在衣领、袖口或下摆的布料上,且夹口内侧有防滑纹理。同时,封装体本身设计成扁平的流线型,减少钩挂。
  • 问题3:误报警。孩子洗手不小心溅到水,或者空气中湿度骤增(如进入浴室),可能触发报警。
    • 解决:在算法层面增加环境湿度参考。如果能加入一个同样封装但置于衣物外侧(不接触皮肤)的辅助传感器,或者通过手机App获取本地天气湿度数据,就可以计算一个“相对湿度差”。只有当“贴身湿度”显著高于“环境湿度”时,才判定为汗湿,这能极大减少环境因素导致的误报。

6. 项目总结与未来可扩展方向

经过几轮迭代,这个小设备已经在我家孩子身上稳定运行了数月。它在几次公园奔跑和体育课后都成功发出了预警,让我们能及时处理,孩子抱怨“后背黏黏的”的情况大大减少。这个项目让我深刻体会到,将技术应用于生活细节,解决一个微小但真实的痛点,所带来的满足感不亚于完成一个大型系统。

回顾整个项目,有几点核心心得:

  1. 传感器选型是基石:在消费级应用中,电容式数字温湿度传感器在精度、稳定性和体积上的综合优势无可替代,前期多投入一点成本在好的传感器上,后期会省去无数校准和调试的麻烦。
  2. 低功耗设计是灵魂:对于穿戴设备,功耗直接决定了用户体验(更换电池的频率)。必须从芯片选型、电源架构、工作流程、无线协议等每一个环节进行抠细节式的优化。深度睡眠和事件触发是黄金法则。
  3. 算法比硬件更重要:单纯的硬件数据是粗糙的。通过滤波算法、滞回比较、多传感器数据融合(如未来加入温度梯度判断)等软件算法,才能让设备变得“智能”,区分正常波动与真实风险。
  4. 用户体验在细节里:从App警报的穿透力,到设备佩戴的舒适度,再到防止误报的逻辑,每一个细节都影响着产品的最终可用性。多做实地测试,让真实用户(孩子和家长)来反馈,是打磨产品的最佳途径。

这个项目本身还有很大的扩展空间:

  • 多传感器融合:集成一个微小的温度传感器阵列,监测皮肤与衣物间的温度梯度,可以更早地预测出汗趋势,实现“预测性警报”。
  • 数据云端化与长期分析:将湿度数据同步到云端,结合活动记录(可通过手机加速计或专门的运动传感器),长期分析孩子的出汗模式,或许能为儿童健康管理提供有趣的数据洞察。
  • 形态创新:将传感器和微型电路直接纺织到衣物纤维中,做成真正的“智能织物”,实现完全无感的监测。

技术服务于生活,这个小小的湿度监测项目就是一个很好的起点。它不需要多么高深的理论,但需要跨硬件、固件、软件和产品设计的综合思考与实践。希望我的这次分享,能给有兴趣动手解决身边问题的朋友们带来一些切实的参考和启发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询