用FireBeetle ESP32-S3自制AI血氧仪,解锁健康监测新技能!

来源:DF创客社区

作者:-

发布时间:2025-05-21

阅读量:2

在这个项目中,作者将展示如何利用AI和一些简单的硬件(ESP32-S3 和一个172x320 IPS 显示屏等),制作一个能够测量血氧饱和度(SpO2)和心率的设备。这个项目不仅有趣,还能让你深入了解AI与的结合。

需要注意的是,此设备仅用于 教育目的,它展示了机器学习和 IoT 结合的潜力,但它不是经过认证的,不能完全用于专业的健康监测或诊断。

材料清单

要完成这个项目,你需要以下材料:

  • 微控制器:我选择的是 FireBeetle 2 ESP32-S3 ,它价格实惠且功能强大,带有内置的Wi-Fi和蓝牙功能。
  • 心率和血氧:我用的是 MAX30102 ,这款小巧、易用,而且性价比很高。
  • 显示屏:1 个 IPS LCD 显示屏 (1.47” 172×320),用来实时显示测量结果。
  • 面包板和跳线:用于快速搭建电路,连接所有硬件组件。
  • :可以用USB线为ESP32供电,或者用电池组让设备更便携。
  • 电脑:需要一台电脑来编写代码并将其上传到ESP32上。
  • 工具:3D打印机

步骤 1:CAD 和 3D 打印

首先,我为项目设计了这个外壳和盖子,测量了每个组件的尺寸,并导入了可用的 3D 模型组件。

你可以下载设计文件并在 Fusion 360 中打开,根据你的需要进行修改,或者你可以直接下载 STL 文件并进行 3D 打印:

3D打印文件可以在文末下载。

我用深灰色打印了外壳,并使用换料技术,在打印过程中暂停,用双色调,深灰色和绿色打印了盖子。

步骤 2:心率传感器组装

首先,取出,并通过将传感器卡入其设计位置,将其安装在 3D 打印的盖子上。

步骤 3:显示屏组装

然后,取出显示模块,并使用两个 M2 螺钉将其安装到盖子上设计的孔位上。请务必在组装过程中注意方向。

步骤 4:电缆组装

现在,让我们将 GDI 排线连接到显示屏,并连接传感器的连接线。

步骤 5:ESP32 组装

现在,拿起外壳和 ESP32,将 Type-C 口与外壳上的设计插槽对齐,然后将其卡入背面的到位,如图所示。

步骤 6:电路连接

使用我们之前连接的线将传感器连接到 ESP32。

  • 将传感器的 SCL 引脚连接到 ESP32 上的 SCL。
  • 将传感器的 SDA 引脚连接到 ESP32 上的 SDA。
  • 将 VCC(传感器)连接到 ESP32 上的 3V。
  • 将 GND(传感器)连接到 ESP32 上的 GND。

将 GDI 连接器连接到 ESP32 上的相应连接器。

将导线焊接到位。

步骤 7:最终组装

  • 将所有电缆整齐地放置在外壳内,确保它们没有被挤压或拉伸。
  • 小心地对齐盖子并将其卡到外壳上,将其固定到位。

步骤 8:创建一个 Edge Impulse 项目

  • 转到 edgeimpulse.com 并登录到你的帐户。
  • 单击“创建新项目”。
  • 输入项目的名称。
  • 选择是否将你的项目设为私有或公开。
  • 单击“创建”。

步骤 9:导入数据

了解数据采集面板:

  • Edge Impulse 中的数据采集面板允许你上传数据、从连接的设备收集数据以及管理你的数据集。
  • 你可以从 CSV 文件上传数据,使用内置工具进行实时数据收集,或者导入预先录制的数据集。

从 Kaggle 下载数据:

  • 由于我们最初没有数据,我从 kaggle.com 下载了包含 SpO2、心率、体温和状态标签的健康数据。

导入 CSV 数据:

  • 转到数据采集面板中的“CSV 向导”。
  • 上传你下载的 Health Data.csv 文件。
  • 将“这是时间序列数据吗?”设置为“否”。
  • 选择“状态”作为你的标签。
  • 单击“完成向导”。

分割数据:

  • 再次上传 Health Data.csv
  • 选中“在训练和测试之间自动分割”的框。
  • 如果你的数据已经分开,请手动将它们上传到训练和测试数据集。

数据集概述:

  • 上传后,你将在“数据集”选项卡中看到你的数据列表。
  • 确保你的数据在训练和测试之间以 80-20% 的比例分割。

你收集的数据越多样化和准确,你的模型效果就越好。

步骤 10:了解和使用 EON Tuner

访问 EON Tuner:

  • 在你的 Edge Impulse 项目中导航到 EON Tuner 面板。
  • 单击“新建运行”,然后选择“使用模板”。
  • 选择“运动事件”模板。

(此选择基于模型需要对不同的运动模式(例如手势或身体活动)进行分类的用例。)

  • 最后,单击“启动 Tuner”。

EON Tuner 将开始优化你的模型的架构,以找到性能、准确性和资源使用之间的最佳平衡。此过程可能需要一些时间,因为它会测试多个模型配置。完成后,它将列出结果,性能最佳的配置显示在顶部,而不太理想的配置显示在底部。

了解结果:EON Tuner 显示每个模型配置的关键指标,例如延迟、RAM、ROM 和整体准确性。以下是对图像和指标的一般说明:

  • 模型配置:每个卡片代表一个不同的模型架构。
  • 例如,图像中显示的三个模型标记为 raw-dense-872、raw-dense-605 和 raw-dense-75c。
  • 性能指标:
    • 延迟:模型进行预测所需的时间。在这些示例中,所有模型的延迟均为 1 毫秒,这意味着它们非常快。
    • RAM:运行模型所需的内存。更紧凑的模型使用更少的 RAM,如第三个模型 (1 kB) 所示。
    • ROM:模型的存储大小。同样,像第三个模型这样的较小模型更有效,使用 15 kB,而前者使用 16 kB。
  • 准确性和混淆矩阵:每个卡片都包含一个混淆矩阵,以说明模型在不同类别中的表现如何:
    • 对角线值表示正确的分类。
    • 非对角线值表示错误分类。
    • 对角线单元格越暗,模型的性能越好。
  • F1 分数:将精度和召回率组合成一个指标,显示每个类别。F1 分数越高,性能越好。
  • 选择最佳模型:
    • 在此示例中,raw-dense-872 具有最高的准确率 (92%),并且在所有指标(例如,高于 0.88 的 F1 分数)中都表现出色。
    • 如果资源限制(RAM 或 ROM)更为重要,则尽管准确率较低,但较小的模型(如 raw-dense-75c(84% 准确率))可能是一个更好的选择。

步骤 11:使用 EON Tuner

一旦确定了最适合的模型,点击“添加”按钮,将其集成到你的 Edge Impulse 项目中,以便进行部署。

Edge Impulse 会自动为你创建完整的Impulse,其中包括以下组件:

  • 原始数据块:配置为正确处理你的原始输入数据。
  • 特征提取器/处理块:基于所选模型进行优化。
  • 分类器:机器学习模型本身,经过微调并准备好进行部署。

如果你不使用 EON Tuner:

如果没有 EON Tuner,你将需要手动配置管道中的每个步骤,包括:

  • 定义原始数据处理块(例如,窗口化或过滤)。
  • 选择和调整特征提取器(例如,傅里叶变换、频谱分析等)。
  • 根据你对机器学习的理解,选择分类器架构并调整其超参数。

这个手动过程需要更深入地了解数据处理和模型设计,并且通常涉及试错方法。你可以查看我之前的项目 SitSense https://www.instructables.com/SitSense/ 来获得更好的理解。

步骤 12:原始数据

可视化分析:特征资源管理器图显示了三个清晰分离的聚类(红色、绿色、紫色),表明模型在类别之间具有良好的区分度。数据似乎分布良好,具有:

  • 顶部的弯曲绿色聚类
  • 中间的混合红色和绿色点
  • 沿底部散布的紫色点

这种可视化表明,健康监测数据(脉搏、温度、SpO2)已成功分割成三个不同的类别,这对于分类准确性来说很有希望。

步骤 13:分类器

性能:

  • 96.4% 的总体准确率
  • 极低的损失 (0.17)
  • Class 2 的完美 F1 分数 (1.00)
  • 强大的混淆矩阵分数(95.3%、93.1%、100% 对角线)

设备要求:

  • 快速推理:1 毫秒
  • 高效内存:1.6K RAM
  • 紧凑存储:16.5K 闪存

数据资源管理器可视化显示了大部分正确的分类(绿点),只有极少的错误分类(红点)聚集在一个小区域中,表明模型在不同的健康状态下具有强大的性能。

这些指标表明该模型可靠,可以部署,并且适用于资源受限的 IoT 健康监测设备。

步骤 14:部署模型

  • 转到 Edge Impulse 中的“部署”面板。
  • 从可用的部署选项中,选择“Arduino 库”。
  • 单击“构建”以将模型编译为 Arduino 库。

步骤 15:准备对设备进行编程

安装 Edge Impulse 库:

  • 构建完成后,ZIP 文件将下载到你的系统。
  • 提取 ZIP 文件。
  • 复制提取的文件夹并将其粘贴到你计算机上的 Documents > Arduino > libraries 文件夹中。

修改 ei_classifier_config.h 文件:

  • 导航到提取的库文件夹内的以下路径: Documents\Arduino\libraries\SitSense_inferencing\src\edge-impulse-sdk\classifier\
  • 找到名为 ei_classifier_config.h 的文件。
  • 找到以下行: #define EI_CLASSIFIER_TFLITE_ENABLE_ESP_NN 1
  • 将值从 1 更改为 0,如下所示: #define EI_CLASSIFIER_TFLITE_ENABLE_ESP_NN 0

为什么需要进行此更改:

  • TensorFlow Lite 中的 ESP-NN(神经网络加速)功能旨在优化 ESP32 设备上的性能。
  • 但是,此设置有时可能会导致与某些模型或配置的兼容性问题。
  • 禁用它可以确保模型可靠运行,即使这意味着牺牲某些性能优化。

进行更改后,保存文件并关闭编辑器。

下载并安装库:

  • 下载 RTU https://github.com/DFRobot/DFRobot_RTU 和心率传感器库 https://github.com/DFRobot/DFRobot_BloodOxygen_S
  • 打开 Arduino IDE。
  • 确保已安装 ESP32 板管理器。
  • 如果未安装,请获取安装步骤: https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/
  • 在 Arduino IDE 中,导航到:Sketch > Include Library > Add ZIP Library。
  • 选择 RTU 库 ZIP 文件以进行安装。
  • 对心率传感器库 ZIP 文件重复此过程。
  • 下载 AI_Oximeter GitHub 存储库: https://github.com/MukeshSankhla/AI-Oximeter
  • 提取 ZIP 文件。这将包括:AI_Oximeter 代码、CAD 文件、修改后的 GDL Display Library。
  • 再次转到:Sketch > Include Library > Add ZIP Library。
  • 选择提取的 GDL Display Library ZIP 文件进行安装。

步骤 16:上传代码

  • 在 Arduino IDE 中打开 Oximeter.ino 文件。
  • 使用 USB 线将你的设备连接到 PC。
  • 在 Arduino IDE 中,转到“工具”>“板”,然后选择: DFRobot FireBeetle-2 ESP32-S3
  • 然后,转到“工具”>“端口”,然后选择与你连接的设备相对应的 COM 端口。
  • 单击 Arduino IDE 中的“上传”按钮(右侧的箭头图标)。
  • 等待上传过程完成。
  • 上传完成后,AI 血氧仪固件已成功安装在你的设备上并运行。

步骤 17:代码说明

此代码专为 AI 驱动的血氧仪而设计,该血氧仪使用 MAX30102 传感器测量 SpO2(氧饱和度)、心率和体温。它使用 TFT 显示屏显示结果,并使用 Edge Impulse 模型根据测量的数据对用户的健康状况进行分类。

MAX30102 传感器初始化

#define I2C_ADDRESS 0x57
DFRobot_BloodOxygen_S_I2C MAX30102(&Wire, I2C_ADDRESS);

TFT 显示屏初始化

DFRobot_ST7789_172x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST, TFT_BL);

特征提取

int extract_features(size_t offset, size_t length, float *out_ptr, int heartRate, float bodyTemp, int SPO2) {
float features[] = { (float)heartRate, bodyTemp, (float)SPO2 }; // Input features for the model
memcpy(out_ptr, features + offset, length * sizeof(float));
return 0// Success
}

此函数准备 Edge Impulse 模型的输入特征(心率、体温和 SpO2)。

Setup 函数

  • 初始化串口监视器、TFT 显示屏和 MAX30102 传感器。
  • 如果传感器无法初始化,则显示错误消息。
void setup() {
Serial.begin(115200);
screen.begin();
screen.fillScreen(COLOR_RGB565_GREEN); // Clears the display
while (!MAX30102.begin()) {
Serial.println("MAX30102 init fail!");
delay(1000);
}
Serial.println("MAX30102 init success!");
MAX30102.sensorStartCollect(); // Starts data collection
}

Loop 函数

  • 收集 SpO2、心率和体温数据。
  • 如果未获得有效读数,则显示“未检测到手指”消息。
  • 使用收集的特征运行 Edge Impulse 分类器。
  • 在 TFT 显示屏上显示测量值和分类结果(良好、不良或生病)。
void loop() {
MAX30102.getHeartbeatSPO2();
int SPO2 = MAX30102._sHeartbeatSPO2.SPO2;
int heartRate = MAX30102._sHeartbeatSPO2.Heartbeat;
float bodyTemp = MAX30102.getTemperature_C();

if (SPO2 == -1 || heartRate == -1) {
if (noFinger) {
screen.fillRoundRect(5516231020, COLOR_RGB565_BLACK);
screen.drawRGBBitmap(3090, (uint16_t *)finger, 110140);
noFinger = false;
}
else {
ei::signal_t signal;
signal.total_length = 3// Number of features
signal.get_data = [=](size_t offset, size_t length, float *out_ptr) -> int {
return extract_features(offset, length, out_ptr, heartRate, bodyTemp, SPO2);
};

ei_impulse_result_t result;
EI_IMPULSE_ERROR err = run_classifier(&signal, &result, false);

if (err != EI_IMPULSE_OK) {
Serial.print("Error running Edge Impulse classifier: ");
Serial.println(err);
return;
}

int classification = -1;
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
if (result.classification[ix].value > 0.5) { // Threshold for classification
classification = ix;
break;
}
}

// Display the readings and status
if (SPO2 != pSPO2 || heartRate != pHeartRate) {
screen.fillRoundRect(5516231020, COLOR_RGB565_BLACK);
screen.setCursor(1030);
screen.print("SpO2");
screen.setCursor(1070);
screen.print(SPO2);
// Display status based on classification result
}
}
delay(5000);
}

如果更改 Edge Impulse 项目的名称,则必须使用新项目名称更新 #include <AI_Oximeter_inferencing.h> 行。

#include <NewProjectName_inferencing.h>

步骤 18:结论

该项目演示了 Edge Impulse 的 AI 功能与实时传感器数据的成功集成,从而构建了 AI 驱动的血氧仪。通过利用 MAX30102 传感器、ST7789 TFT 显示屏和自定义训练的 Edge Impulse 模型,我们创建了一种紧凑而高效的设备,能够监测重要的健康参数,例如 SpO2、心率和体温。基于 AI 的分类的添加通过提供对用户基于实时数据的健康状况的直观评估(良好、不良或生病)来增强血氧仪的功能。

重要的是要注意,此设备仅用于 教育目的,展示了机器学习和 IoT 结合的潜力,它不是经过认证的医疗设备,不能完全用于专业的健康监测或诊断。


0
0
收藏

免责声明

  • 1、本文内容版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系感算商城(service@gansuan.com),我方将及时处理。
  • 2、本文的引用仅供读者交流学习使用,不涉及商业目的。
  • 3、本文内容仅代表作者观点,感算商城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
  • 4、如需转载本方拥有版权的文章,请联系感算商城(service@gansuan.com)注明“转载原因”。未经允许私自转载感算商城将保留追究其法律责任的权利。
在线客服 微信咨询 0 样品清单 浏览足迹 有奖反馈 回顶部