婴儿猝死综合症(SIDS)在不到一岁的婴儿中发生了很多。响应时间来帮助这些婴儿是至关重要的。(通常少于几分钟)。必须尽快将警报发送给护理人员。专用系统将监测包括体温、呼吸、炉膛率在内的生命体征,实时向护理人员发送紧急警报。
这里我使用nRF5340作为核心来收集数据和传输数据,使用手机作为网关来存储数据并将数据推送到云端进行进一步的分析和聚合。我选择 MAX30102 传感器来收集健康,因为它能够同时获取心率和氧气数据。
MAX30102 能够记录原始 IR 数据,详细的分析/算法必须在主机 MCU 中完成。有几个参数需要微调,例如光的脉冲宽度、强度,以优化我们应用的性能。经过几周的微调,我决定继续使用 MAX32664 生物传感器集线器。生物传感器中枢嵌入了复杂的心率/SPO2 计算算法,能够在手指接触后 10 秒内生成稳定可靠的数据。MAX30205被选用于人体温度检测,因为它在人体温度范围内具有很高的精度,±0.1°C。APA102 (DotStar) 用于指示状态,与 NeoPixel 相比,它很小,适合婴儿穿戴。
数据可视化包括电话可视化和网络可视化。当手机获取数据时,它会显示在手机应用程序中,并带有图表和关键指标。手机还充当了将数据推送到云端的大门。通过 MQTT 协议和Grafana仪表板,我能够在短时间内构建一个即用型仪表板。
nrf5340 模块负责获取数据和暴露 GATT 服务。
我使用 MAX30102 分线板进行原型设计。
这是简单原型设计的接线图。
我尝试了 SparkFun MAX3010x 脉冲和接近传感器库和 DFRobot_MAX30102 库。
脉搏血氧仪是氧饱和度 (SpO2) 的非侵入性测量。氧饱和度定义为基于血红蛋白和脱氧血红蛋白的检测,测量溶解在血液中的氧气量。使用两种不同的光波长来测量 HbO2 和 Hb 吸收光谱的实际差异。血流受 HbO2 和 Hb 浓度的影响,它们的吸收系数使用两个波长 660 nm(红光谱)和 940 nm(红外光谱)测量。脉搏是通过计算每个峰值之间的时间间隔来测量的,通常会使用快速傅里叶变换来获得稳定的心率结果。
如果您对这些原则感兴趣,请随时查看以下参考资料:
Sparkfun 脉搏血氧仪传感器集成了 MAX32664 生物传感器集线器和 MAX30101 传感器。MAX32664传感器集线器是一款Cortex M4处理器,可处理所有算法计算、数字滤波、压力/位置补偿、高级R波检测和自动增益控制。它比处理裸露的 MAX30101 传感器更容易测量心率和 SPO2。
我决定将 MAX32664 与 MAX30102 传感器一起使用,以实现稳定且轻松的编程。请参见下面的比较。
MAX30205 是一款易于使用的人体温度传感器,在 35 C 左右的人体温度范围 +/- 0.1 内具有高精度。
它使用3.3V输入和I2C接口。获取温度只是一个 I2C 命令。
APA102 是一个快速的 SPI RGB led,也可以通过 bit bang 驱动。我使用这个 LED 来指示心跳和系统状态。
在我看来,Zephyr 对初学者绝对不友好,但是一旦你掌握了整体结构,它就可以非常强大,特别是对于大型项目。我最喜欢 Zephyr 的地方在于,您可以在不同的板上使用完全相同的代码库。即,如果我使用 BLE 和 I2C 为 nRF5340 编写代码,我可以为 nRF52832 甚至 STM32WB55 使用完全相同的代码,外围设备只需要较小的引脚映射。大多数代码保持不变,将遗留代码移植到更新的硬件/平台的工作更少。
对于这个项目,我为 MAX30101、MAX32664、MAX30205 创建了自定义驱动程序,APA102 代码已经存在,使用 SPI 或 bit bang。
对于 MAX30101,我使用心率算法从 Sparkfun Arduino 库移植代码。我必须在 board 目录中创建一个 nrf5340dk_nrf5340_cpuapp.overlay 文件来为传感器添加额外的定义。有关突出显示的代码,请参见代码部分。
MAX32664 和 MAX30205 遵循相同的流程,端口驱动,写入覆盖,在真实传感器上进行测试。APA102的驱动也写好了,可以在driver/samples文件夹下找到。
还要检查我的github 上的源代码。
这一步花了我一半的时间,因为它对我来说是一个全新的框架,我必须深入了解它。但我很高兴有机会了解这个用于复杂 MCU 项目的出色框架。而且文件写得很好。支持许多板和传感器。
Zephyr的整体布局:
本项目使用 Flutter 搭建 nRF5340 和云之间的桥梁。该应用程序不断收到来自 nRF5340 的通知,包括心率数据、体温,然后通过 MQTT 协议将数据传输到云端。
与具有大量可使用小部件的普通 Android 相比,Flutter 非常适合快速原型设计。对于这个项目,我主要使用flutter_blue小部件、fl_chart小部件和mqtt_client 。Flutter_blue 用于与 nRF5340 传感器通信并从 bio-hub 传感器获取最新读数。fl_chart 用于以折线图格式显示结果,mqtt_client 用于将数据推送到 AWS IoT 核心。
我首先使用带有一些虚拟数据的 fl_chart 来生成一个带有计时器的折线图,每秒吐出随机数据。
其次,我使用 flutter_blue 从 nRF5340 获取传感器数据。数据存储在 8 字节数组中,并通过 BLE 通知传输。前 4 字节数据是心率,后 4 字节数据是体温。
例如,以下通知中的数据为 3F 62 03 63 00 90 D6 41
0x3F = 63 bpm,心率
0x62 = 98 %,SPO2 水平
0x03 = 状态码,03 表示联系
0x63 = 99,来自 MAX32664 的置信度
0x00 0x90 0xD6 0x41 为 IEEE 754 格式,转换为浮点数为 26.82 °C。
第三,mqtt_client 用于将所有相关数据推送到云端,以便进一步监控和分析。
在 Zephyr 中,可以通过 pm_power_state_force、pm_power_state_set 等内置 api 进行电源管理。有不同级别的电源状态,例如 PM_STATE_ACTIVE、PM_STATE_STANDBY。
我试图测量和优化设备的功耗。空闲电流约为 1mA,仅 BLE 广告。连接 BLE 后,传感器数据采集也开始,电流消耗增加到 2mA。启用睡眠模式后,电流消耗可降至 200uA。
请参见下面的电流测量。
云集成是通过 AWS IoT 核心完成的。数据通过加密的 MQTT 推送到 AWS IoT Core。数据可以在 AWS IoT 中心测试部分进行可视化。然后,我使用 AWS IoT Sitewise 存储数据,并使用 Grafana 的内置 IoT 站点插件将其可视化。
有很多物联网平台可供adafruit.io 、ubidots.com 、thingspeak.com 、thingsboard.io 、kaaproject.org等创客使用。我选择 AWS MQTT 作为后端和 Grafana 前端是因为它的简单性和灵活性。
我做了两个版本的PCB,第一个由于手工焊接nRF5340芯片的难度而不太成功。
这是原理图,基本上我使用 nRF5340 DK 和 Sparkfun Bio-Sensor Hub 作为参考,稍作修改。
然后将 PCB 发送到 JLCPCB 进行制造。
我手工焊接所有版本的 PCB。
第一个版本仅使用 MAX30102 传感器,它没有 MAX32664 生物集线器传感器。所以很难得到稳定的心率结果。
然后我转到第 1 版
外壳3D打印
3D 模型是在 Fusion 360 中设计的。
外壳做成乌龟形状,对婴儿更友好。
下面是成品,基本功能按预期工作。但是,固件在投入使用之前仍需要大量的打磨和优化。
我使用nRF53-DK和Power profiler Kit创建了一个婴儿生命体征监测系统,它可以实时监测婴儿的生命体征数据。父母可以远程监控宝宝的健康状况,并在出现心率异常、发烧引起的高温以及与 SPO2 水平相关的呼吸问题等紧急情况时设置警报。
nRF53 适用于具有 RTOS 支持和易于移植的库的专业/复杂的可穿戴项目。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !