该项目旨在缓解更年期常见的潮热症状,它是一个由可穿戴设备制成的物联网系统,可跟踪用户在睡眠期间的皮肤温度和运动。可穿戴设备通过蓝牙 LE (BLE) 将温度和运动数据发送到风扇控制器,当皮肤温度升高时风扇会被激活,并且数据会记录在云服务中。用户还可以使用谷歌助手来改变风扇速度。
请记住,这个项目不会阻止您出现潮热,但可以让您感到放心,请务必咨询您的医生。我们认为该项目不仅对更年期的女性有益,对盗汗患者也有益,从而改善睡眠质量。
由于 COVID-19 隔离,我们想用已经在家中的电路板/传感器构建一些东西,这使得获得更多材料变得更加困难。我将尝试描述亚伯拉罕和我如何开发这个正在进行的项目,我们遇到的一些挑战以及我们如何尝试解决它们。
该项目围绕 STMicroelectronics STEVAL-BCN002V1B开发套件(又名 BlueTile)构建。
STEVAL-BCN002V1B 支持蓝牙 LE 的传感器节点开发套件具有基于 BlueNRG-2 SoC 蓝牙低功耗应用处理器的 STEVAL-BCN002V1 多传感器板。该传感器板具有加速度计、陀螺仪、磁力计、压力、湿度、飞行时间和麦克风传感器,并由通用 CR2032 纽扣电池[1]供电。
传感器板上的BlueNRG-2 SoC 可以使用默认程序使用适用于 Android 和 iOS 的STMicro Sensor Demo App连接到您的智能手机。
这些是您可以使用传感器演示应用程序执行的一些功能,您甚至可以记录数据,此功能将 CSV 文件发送到您的电子邮件。
为了对传感器板进行编程,我们使用了您获得套件时提供的 STEVAL-BCN002V1D编程板。您可以通过多种方式对传感器板进行编程,这是用户手册。
我们使用 BlueNRG-2 Navigator 来熟悉传感器板,您可以使用大量示例。这是一个数据简介。
BlueNRG -2 Navigator项目可用于Keil和Atollic 。在传感器板上运行的程序是Sensor Demo App
. 首先我们尝试在 中更改设备本地名称sensors.c
,以确保修改源代码和编程板是可行的。
为此,我们在使用 Keil 生成 hex 文件后使用了 BlueNRG-1_2 flasher实用程序。
值得一提的是,在刷新应用程序之前,必须 Service Manager OTA
先使用 flasher 实用程序加载第一个,然后为应用程序生成生成的 hex 文件。
实际设备名称是BCN-002,但不确定与本地名称有什么区别。
在文件中的Sensor_DeviceInit()
函数中sensors.c
更改了aci_gap_set_authentication_requirement
删除引脚配对。只需更改USE_FIXED_PIN_FOR_PAIRING
为DONOT_USE_FIXED_PIN_FOR_PAIRING
要为传感器板构建 BLE 客户端,您必须在此处获取更多关于 BLE 的 Service UUID 和 Characteristic UUID 。
ST Micro 有关于如何对 BlueNRG-2 进行编程的文档以及有关服务的详细信息,但我们使用BLE 扫描仪来搜索可用的服务和特性。
BlueNRG-2有 3 项服务,但传感器数据正在服务00000000-0001-11E1-9AB4-0002A5D5C51B
中。服务00000000-000E
和00000000-000F
是调试和配置。更多关于第 3 节的内容。
这些是服务下可用的特性00000000-0001-11E1-9AB4-0002A5D5C51B
001c0000-0001-11E1-AC36-0002A5D5C51B
- 环境的00000100-0001-11E1-AC36-0002A5D5C51B
- 传感器融合40000000-0001-11E1-AC36-0002A5D5C51B
- ?00000400-0001-11E1-AC36-0002A5D5C51B
- 加速度计事件00020000-0001-11E1-AC36-0002A5D5C51B
- 仪表(用于电池电量)00000040-0001-11E1-AC36-0002A5D5C51B
- 指南针20000000-0001-11E1-AC36-0002A5D5C51B
- 引领08000000-0001-11E1-AC36-0002A5D5C51B
- 声音的00E00000-0001-11E1-AC36-0002A5D5C51B
- 运动传感器02000000-0001-11E1-AC36-0002A5D5C51B
- 接近我们使用DOIT Esp32 DevKit v1尝试连接到传感器板,基于 ESP32 库管理器中的 Arduino BLE 客户端示例。
程序寻找服务00000000-0001-11E1-9AB4-0002A5D5C51B
和001c0000-0001-11E1-AC36-0002A5D5C51B
环境特性。
// The remote service we wish to connect to.
static BLEUUID serviceUUID("00000000-0001-11E1-9AB4-0002A5D5C51B");
// The characteristic of the remote service we are interested in.
static BLEUUID char1UUID("001c0000-0001-11E1-AC36-0002A5D5C51B"); //Env
在扫描 BLE 设备时,ESP32 能够看到传感器板但无法连接到它。
为确保 ESP32 草图正常工作,我们使用了健身手环(服务器)和 ESP32(客户端),连接成功,但在创建客户端时挂起。
我们遇到了 Neil Kolban 的ESP32 片段,似乎 Arduino 库在信号量方面存在问题,因此我们构建了新库并重新编程了 ESP32。
但是 ESP32 仍然无法连接到传感器板。我们尝试使用 MAC 地址进行连接,该地址是在 BLE 设备扫描时确定的。
std::string My_BLE_Address = "ec:4d:a6:01:a1:eb";
当找到 MAC 地址而不是服务 UUID 时,将调用 BLE 通告设备函数。
// We have found a device, let us now see if it contains the service we are looking for.
if (advertisedDevice.getAddress().toString()== My_BLE_Address ) {
Serial.println("Found DEVICE!");
BLEDevice::getScan()->stop();
myDevice = new BLEAdvertisedDevice(advertisedDevice);
doConnect = true;
doScan = true;
然后 ESP32 能够与传感器板建立连接,连接没有挂起。我们需要调查为什么在扫描时在传感器板上看不到服务。
BLE 客户端示例具有通知回调函数,但数据未正确显示。需要更新回调函数(由Andreas Spiess完成)以显示原始数据。
该gatt_db.c
文件包含更新特征值的函数。
/**
* @brief Update Environmental characteristic value
* @param int32_t Press Pressure in mbar
* @param uint16_t Hum humidity RH (Relative Humidity) in thenths of %
* @param int16_t Temp1 Temperature in tenths of degree
* @retval tBleStatus Status
*/
tBleStatus Environmental_Update(int32_t Press, uint16_t Hum, int16_t Temp) {
uint8_t BuffPos = 0;
我们使用 ST 传感器演示应用程序获得了一些日志。
在温度日志中,0x1B01
MSB 为 0x01 = 283 dec
,但以“十分之一度”表示,即为 28.3°C。
我们使用类似的方法来获取湿度和压力值。然后环境数据以易于理解的方式显示在控制台上。
仅包括另外两个特征:
运动传感器 (MotionFX)。这个特性在这里更多地使用了四元数。该数据将代表用户在睡眠时间的运动,也许这可以用来估计睡眠质量。
MotionFX 是 X-CUBE-MEMS1 软件的中间件库组件,在 STM32 上运行。它提供实时运动传感器数据融合。它还执行陀螺仪偏置和磁力计硬铁校准[2] 。
仪表。仪表特性以 mV 为单位发送电池电压。
所有特征都有属性:READ、NOTIFY、WRITE 等。更多信息请参见此处。 Arduino 上的 ESP32 BLE 客户端有一个 notify 和 read 回调,主要区别是当一个特征值改变时服务器会发送一个通知。
要获取数据,必须启用和禁用通知,肯定有更好的方法可以做到这一点,但似乎发送NULL
会禁用通知。
if(p1RemoteCharacteristic->canNotify())
p1RemoteCharacteristic->registerForNotify(NotifyCallback);
//Serial.println("Unregister for notifying!");
delay(100);
p1RemoteCharacteristic->registerForNotify(NULL);
此时我们已准备好配置 ESP32 以连接到 Adafruit IO。
由于我们想控制 AC 风扇的速度,我们认为如果可以使用 Google Assistant 进行语音控制会很好。
我们在 IFTTT 上创建了以下小程序:高速、低速、关闭和 自动模式来控制放置在床头柜上的小风扇。自动模式旨在根据可能指示潮热发作的皮肤温度变化打开/关闭风扇。
DOIT Esp32 DevKit v1 开发板只有 4MB 内存,因此不适合合并 BLE 和 MQTT :(
亚伯拉罕有备用的 16MB ESP32 WRover 模块,他在另一个项目中使用了这些模块。
我们使用 Abraham 的 ODOROID-GO 定制 PCB,他手工焊接了启用 ESP32 WRover 模块所需的最少组件:USB 转串口、USB 连接器、3.3V LDO 等。
仅使用了几个 GPIO,因此左侧的标头(安装 SPI tft 屏幕的位置)有足够的 GPIO 来控制继电器板。
ESP32 GPIO 不能承受 5V 电压,因此 Abraham 为 2 个继电器、电源和复位按钮制作了这个小屏蔽。
我们正在使用 Adafruit IO 记录传感器的数据,这些是我们的提要:
此功能仍需要改进,可能会在更长的时间内平均温度通知,而不仅仅是在发布之后。我们使用吹风机来提高温度,当电路板通电时,第一个脉冲是假潮热,我们需要解决这个问题,但接下来的 2 个温度峰值代表潮热事件。
传感器板放置在 3D 打印外壳内。
外壳有一个用于温度传感器和复位按钮的开口
温度传感器应该与皮肤接触,但我们需要收集更多信息,例如 HTS221 是否是皮肤温度的正确传感器。此外,我们需要确定传感器的正确位置,可能在手腕内或更靠近胸部。
传感器板有许多传感器,可用于收集更多信息,例如:
也许热敏电阻或红外温度计可能是测量皮肤温度的更好方法。此外,传感器的位置也很重要,但它必须是非侵入性的,以便在睡觉时佩戴。
除了皮肤温度升高外,潮热还可能导致女性心率加快。当身体试图降低温度时,这会导致突然出汗。这种症状还可能伴有心悸和头晕[3] 。
心率测量可以使这个项目更加稳健,也许可以用来预测潮热。
为简单起见,选择使用小型交流风扇,但生物特征数据可用于触发更复杂的执行器。
我们仍然需要修复 Arduino 草图的错误并对其进行优化。
在炎热的一天随时享受清新的微风是很好的,但在潮热时立即得到缓解就更好了!
通过这个项目,我们打算解决更年期最常见的症状之一。由于自动模式是一种简单的开/关控制,因此不需要复杂的算法和电子设备。
大部分时间都花在弄清楚如何让 BLE 设备按预期工作。我们利用 bluetile 小尺寸和低功耗的优势构建了一个小型应用程序,该应用程序可以扩展到我们目前提供的内容之外。
希望你喜欢它!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !