来源:DF创客社区
发布时间:2025-05-21
阅读量:2
在这个项目中,作者将展示如何利用AI和一些简单的硬件(ESP32-S3 和一个172x320 IPS 显示屏等),制作一个能够测量血氧饱和度(SpO2)和心率的设备。这个项目不仅有趣,还能让你深入了解AI与医疗设备的结合。
需要注意的是,此设备仅用于 教育目的,它展示了机器学习和 IoT 结合的潜力,但它不是经过认证的医疗设备,不能完全用于专业的健康监测或诊断。
材料清单
要完成这个项目,你需要以下材料:
首先,我为项目设计了这个外壳和盖子,测量了每个组件的尺寸,并导入了可用的 3D 模型组件。
你可以下载设计文件并在 Fusion 360 中打开,根据你的需要进行修改,或者你可以直接下载 STL 文件并进行 3D 打印:
3D打印文件可以在文末下载。
我用深灰色打印了外壳,并使用换料技术,在打印过程中暂停,用双色调,深灰色和绿色打印了盖子。
首先,取出血氧心率传感器,并通过将传感器卡入其设计位置,将其安装在 3D 打印的盖子上。
然后,取出显示模块,并使用两个 M2 螺钉将其安装到盖子上设计的孔位上。请务必在组装过程中注意方向。
现在,让我们将 GDI 排线连接到显示屏,并连接传感器的连接线。
现在,拿起外壳和 ESP32,将 Type-C 口与外壳上的设计插槽对齐,然后将其卡入背面的到位,如图所示。
使用我们之前连接的线将传感器连接到 ESP32。
将 GDI 连接器连接到 ESP32 上的相应连接器。
将导线焊接到位。
edgeimpulse.com
并登录到你的帐户。
了解数据采集面板:
从 Kaggle 下载数据:
导入 CSV 数据:
Health Data.csv
文件。
分割数据:
Health Data.csv
。
数据集概述:
你收集的数据越多样化和准确,你的模型效果就越好。
访问 EON Tuner:
(此选择基于模型需要对不同的运动模式(例如手势或身体活动)进行分类的用例。)
EON Tuner 将开始优化你的模型的架构,以找到性能、准确性和资源使用之间的最佳平衡。此过程可能需要一些时间,因为它会测试多个模型配置。完成后,它将列出结果,性能最佳的配置显示在顶部,而不太理想的配置显示在底部。
了解结果:EON Tuner 显示每个模型配置的关键指标,例如延迟、RAM、ROM 和整体准确性。以下是对图像和指标的一般说明:
一旦确定了最适合的模型,点击“添加”按钮,将其集成到你的 Edge Impulse 项目中,以便进行部署。
Edge Impulse 会自动为你创建完整的Impulse,其中包括以下组件:
如果你不使用 EON Tuner:
如果没有 EON Tuner,你将需要手动配置管道中的每个步骤,包括:
这个手动过程需要更深入地了解数据处理和模型设计,并且通常涉及试错方法。你可以查看我之前的项目 SitSense https://www.instructables.com/SitSense/
来获得更好的理解。
可视化分析:特征资源管理器图显示了三个清晰分离的聚类(红色、绿色、紫色),表明模型在类别之间具有良好的区分度。数据似乎分布良好,具有:
这种可视化表明,健康监测数据(脉搏、温度、SpO2)已成功分割成三个不同的类别,这对于分类准确性来说很有希望。
性能:
设备要求:
数据资源管理器可视化显示了大部分正确的分类(绿点),只有极少的错误分类(红点)聚集在一个小区域中,表明模型在不同的健康状态下具有强大的性能。
这些指标表明该模型可靠,可以部署,并且适用于资源受限的 IoT 健康监测设备。
安装 Edge Impulse 库:
修改 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
#define EI_CLASSIFIER_TFLITE_ENABLE_ESP_NN 0
为什么需要进行此更改:
进行更改后,保存文件并关闭编辑器。
下载并安装库:
https://github.com/DFRobot/DFRobot_RTU
和心率传感器库
https://github.com/DFRobot/DFRobot_BloodOxygen_S
。
https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/
。
https://github.com/MukeshSankhla/AI-Oximeter
。
Oximeter.ino
文件。
DFRobot FireBeetle-2 ESP32-S3
。
此代码专为 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 函数:
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 函数:
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(5, 5, 162, 310, 20, COLOR_RGB565_BLACK);
screen.drawRGBBitmap(30, 90, (uint16_t *)finger, 110, 140);
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(5, 5, 162, 310, 20, COLOR_RGB565_BLACK);
screen.setCursor(10, 30);
screen.print("SpO2");
screen.setCursor(10, 70);
screen.print(SPO2);
// Display status based on classification result
}
}
delay(5000);
}
如果更改 Edge Impulse 项目的名称,则必须使用新项目名称更新 #include <AI_Oximeter_inferencing.h>
行。
#include <NewProjectName_inferencing.h>
该项目演示了 Edge Impulse 的 AI 功能与实时传感器数据的成功集成,从而构建了 AI 驱动的血氧仪。通过利用 MAX30102 传感器、ST7789 TFT 显示屏和自定义训练的 Edge Impulse 模型,我们创建了一种紧凑而高效的设备,能够监测重要的健康参数,例如 SpO2、心率和体温。基于 AI 的分类的添加通过提供对用户基于实时数据的健康状况的直观评估(良好、不良或生病)来增强血氧仪的功能。
重要的是要注意,此设备仅用于 教育目的,展示了机器学习和 IoT 结合的潜力,它不是经过认证的医疗设备,不能完全用于专业的健康监测或诊断。