用ESP32-S3做一个功能强大的智能血氧仪!
健康监测如今已经变得比以往任何时候都更重要;想象一下,你制作了一个属于自己的AI智能血氧仪,它不仅能测量血氧饱和度(SPO2)和心率,而且还集成了人工智能(AI)可以以获取非常智能的解读,这些功能可以由ESP32-S3微控制器和一块172x320 IPS显示屏实现。这个DIY项目不仅仅是完成作品制作,它是你学习产品设计、嵌入式系统和AI驱动的一个实践之旅。本文适合教育者、学生和对跨学科技术、健康创新充满热情的爱好者们。
你可以学习如何连接传感器,完成实时显示健康数据的功能,并利用Edge Impulse的力量,直接在你的设备上训练和部署AI模型。无论你是一名有热情的工程师、一名科技爱好者,还是对AI和医疗保健结合感兴趣的人,这个项目可以为你了解现代健康设备如何设计和制作提供一点参考价值。
那么,让我们撸起袖子,开干吧!一起来制作一个功能强大的智能血氧仪吧!
## 器材清单
[*]FireBeetle 2 ESP32-S3X1
[*]心率和血氧传感器 X1
[*]IPS LCD显示屏(1.47" 172x320)X1
[*]螺丝套件X1
## 工具
[*]我的3D打印机
[*]我的螺丝刀套装
## 步骤1:CAD和3D打印
首先,我们可以根据每个组件的尺寸,设计这个项目的外壳和覆盖,并导入3D模型的组件。
你可以下载设计文件并在Fusion 360中根据你的需要进行修改,或者你可以下载STL文件并进行3D打印:
[*]
[*]
[*]Fusion 360文件
我用打印了深灰色的外壳,用深灰色和绿色双色打印了覆盖面,中途暂停打印,使用了丝材更换技术。
## 步骤2:心率传感器组件
首先,我取出SPO2心率传感器,将其安装到3D打印的覆盖物上,将传感器置入其设计的位置。
## 步骤3:显示屏组装
然后,我取出显示模块,并用两个M2螺丝将其安装到覆盖物上的设计位置。在组装过程中,请确保注意方向。
## 步骤4:电缆组装
现在,让我们连接GID带缆到显示器,并连接传感器线缆。
## 步骤5:ESP32 组装
现在,取出外壳和ESP32,将Type-C端口与外壳上的设计插槽对齐,并按照图片所示将其安装到背面。
## 步骤6:电路连接
使用我们之前连接的线缆将传感器连接到ESP32
[*]将电线焊接到位。
[*]将传感器的SCL引脚连接到ESP32的SCL。
[*]将传感器的SDA引脚连接到ESP32的SDA。
[*]将VCC(传感器)连接到ESP32的3V3。
[*]将GND(传感器)连接到ESP32的GND。
[*]将GDI连接器连接到ESP32上的对应连接器。
https://dfimg.dfrobot.com/enshop/image/cache3/data/DFR1145/5.jpghttps://dfimg.dfrobot.com/5d57611a3416442fa39bffca/wiki/1d48a905a0fddf1a5dcf120a9edb7550.png
## 步骤7:最终组装
https://content.instructables.com/FJW/TZ9J/M586ZMF5/FJWTZ9JM586ZMF5.jpg?auto=webp&frame=1&width=1024&height=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDoyMzo1NC4w
## 步骤8:创建 Edge Impulse 项目
[*]点击“创建新项目”。
[*]输入项目名称。
[*]选择将您的项目保持为私人或公开。
[*]点击“创建”。
https://content.instructables.com/FVJ/F7N8/M586ZMNA/FVJF7N8M586ZMNA.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDoyODo0NC4w
https://content.instructables.com/FI4/W3AW/M586ZMNB/FI4W3AWM586ZMNB.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDoyODo0OC4w
https://content.instructables.com/F4W/MOCA/M586ZNK2/F4WMOCAM586ZNK2.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0MToxNi4w
## 步骤9:导入数据
理解数据采集面板:
Edge Impulse中的数据采集面板允许您上传数据,从连接的设备收集数据,并管理您的数据集。
您可以从CSV文件上传数据,使用内置工具进行实时数据收集,或导入预录制的数据集。
从Kaggle下载数据:
由于我们最初没有数据,我从kaggle.com下载了包含SpO2,心率,体温和状态标签的健康数据。
导入CSV数据:
在数据采集面板中转到“CSV向导”。
上传您下载的Health Data.csv文件。
将“这是时间序列数据?”设置为否。
选择“状态”作为您的标签。
点击“完成向导”。
拆分数据:
再次上传Health Data.csv。
勾选“在训练和测试之间自动拆分”。
如果您的数据已经分开了,上传它们 手动地将数据分为训练和测试数据集。
数据集概览:
上传完成后,您将在数据集标签页中看到您的数据。
确保你的数据以80-20%的比例分配到训练和测试中。
你收集的数据越多样且准确,你的模型表现就会越好。
## 步骤10:理解和使用 EON 调谐器
https://content.instructables.com/F7W/IOXA/M586ZOCX/F7WIOXAM586ZOCX.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0Mzo0NC4w
访问EON调谐器:
在您的Edge Impulse项目中导航到EON调谐器面板。
点击New Run,然后选择Use Template。
选择Motion Events模板。
(这个选择基于使用场景,其中模型需要分类不同的运动模式,如手势或体育活动。)
最后,点击Start Tuner。
EON调谐器将开始优化您的模型架构,以找到性能、准确性和资源使用之间的最佳平衡。这个过程可能需要一些时间,因为它需要测试多种模型配置。一旦完成,它将列出结果,最佳性能的配置显示在顶部,较不理想的配置显示在底部。
理解结果:EON调谐器显示每个模型配置的关键指标,例如延迟,RAM,ROM和整体准确性。以下是对图像和 指标:
模型配置:每张卡片都代表一个不同的模型架构。
例如,图片中显示的三个模型分别标记为 raw-dense-872、raw-dense-605 和 raw-dense-75c。
性能指标:
延迟:模型进行预测所需的时间。在这些示例中,所有模型的延迟都是1ms,这意味着它们非常快。
RAM:运行模型所需的内存。更紧凑的模型使用的RAM较少,如第三个模型(1 kB)。
ROM:模型的存储大小。同样,像第三个模型这样的小模型更高效,使用了15 kB的存储空间,而不是16 kB。
准确性和混淆矩阵:每张卡片都包含一个混淆矩阵,用于说明模型在不同类别间的性能表现:
对角线值表示正确的分类。
非对角线值表示分类错误。
对角线单元格越暗,模型的性能越好。
F1分数:将精确度和召回率综合成一个指标,每个类别都有显示。F1分数越高,性能越好。
选择最佳模型:
在这个例子中,raw-dense-872的准确性最高(92%),在所有指标(例如,F1分数超过0.88)上的表现都很强。
如果资源限制(RAM或ROM)更重要,那么像raw-dense-75c这样的小模型(准确性84%)可能是更好的选择,尽管准确性较低。
https://content.instructables.com/FC2/73T0/M586ZON4/FC273T0M586ZON4.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0Njo0Ny4w
https://content.instructables.com/F2C/PG6Q/M586ZOPN/F2CPG6QM586ZOPN.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0Njo0OS4w
## 步骤11:使用 EON 调谐器
https://content.instructables.com/FSO/CLMZ/M586ZOT8/FSOCLMZM586ZOT8.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0ODo0OC4w
https://content.instructables.com/F6U/Q9LD/M586ZOVQ/F6UQ9LDM586ZOVQ.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0ODo1MS4w
一旦确定了最适合的模型,点击添加将其集成到您的Edge Impulse项目中进行部署。
Edge Impulse会自动为您创建完整的冲动,其中包括以下组件:
原始数据块:配置为适当处理您的原始输入数据。
特征提取器/处理块:基于所选模型进行优化。
分类器:已进行微调并准备好部署的机器学习模型本身。
如果你不使用EON调谐器:
如果不使用EON调谐器,你需要手动配置管道中的每个步骤,包括:
[*]定义原始数据处理块(例如,窗口化或过滤)。
[*]选择和调整特征提取器(例如,傅立叶变换,频谱分析等)。
[*]根据您对机器学习的理解,选择分类器架构并调整其超参数。
[*]
这个手动过程需要更深入地理解数据处理和模型设计,通常涉及试错方法。你可以查看我之前的项目SitSense以便更好地理解。
https://content.instructables.com/FV6/R3MU/M586ZOYG/FV6R3MUM586ZOYG.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo0OToyOS4w
## 步骤12:原始数据
https://content.instructables.com/FN9/J4NM/M586ZP4J/FN9J4NMM586ZP4J.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo1NDowNy4w
https://content.instructables.com/FNH/V9XN/M586ZP7G/FNHV9XNM586ZP7G.png?auto=webp&frame=1&width=1024&fit=bounds&md=MjAyNC0xMi0yOSAwNDo1NDoxMC4w
https://content.instructables.com/FT7/FC9N/M586ZP7T/FT7FC9NM586ZP7T.png?auto=webp&frame=1&fit=bounds&md=MjAyNC0xMi0yOSAwNDo1NDoxMi4w
可视化分析:特征探索图显示了三个清晰分离的簇(红色,绿色,紫色),这表明模型在类别之间的区分度很好。数据似乎分布均匀,具有:顶部的一个弯曲的绿色簇,中间混合的红色和绿色点,底部散布的紫色点。
这个可视化结果表明,成功将健康监测数据(脉冲,温度,SpO2)分割成三个明显的类别,这对分类准确性来说是有希望的。
## 步骤13:分类器
总体准确度96.4%,非常低的损失(0.17),类别2的F1分数完美(1.00),混淆矩阵分数高(95.3%,93.1%,对角线100%)
设备需求:
快速推理:1ms,高效内存:1.6K RAM,紧凑存储:16.5K flash
数据浏览器可视化主要显示正确的分类(绿点),误分类(红点)最少,集中在一个小区域,表明模型在不同的健康状态下的性能强劲。
这些指标表明,这是一个可靠的、适合资源受限的健康监测设备的部署就绪模型。
## 步骤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和心率传感器库。
打开Arduino IDE。
确保你已经安装了ESP32开发板管理器。
如果没有,请点击这里进行安装步骤。
在Arduino IDE中,导航到:草图 > 包含库 > 添加ZIP库。
选择RTU库ZIP文件进行安装。
对心率传感器库ZIP文件重复该过程。
下载AI_Oximeter GitHub仓库。
解压ZIP文件。它将包括:AI_Oximeter代码,CAD文件,修改后的GDL显示库。
再次转到:草图 > 包含库 > 添加ZIP库。
选择解压后的GDL显示库ZIP文件进行安装。
## 步骤16:上传代码
在Arduino IDE中打开Oximeter.ino文件。
使用USB线将你的设备连接到你的电脑。
在Arduino IDE中,转到工具 > 板并选择:DFRobot FireBeetle-2 ESP32-S3。
然后,转到工具 > 端口并选择对应你已连接设备的COM端口。
点击Arduino IDE中的上传按钮(右向箭头图标)。
等待上传过程完成。
一旦上传完成,AI Oximeter固件就成功安装到你的设备上并运行。
## 步骤17:代码解释
这个代码是为一个AI驱动的血氧仪设计的,它使用MAX30102传感器测量SpO2(氧饱和度)、心率和体温。它使用TFT显示器显示结果,并使用Edge Impulse模型根据测量数据分类用户的健康状态。该代码集成了传感器数据、TFT显示和AI推理:
[*]从MAX30102传感器读取SpO2、心率和温度。
[*]将数据传递给Edge Impulse模型进行分类。
[*]在TFT屏幕上显示结果和状态(好、坏、生病)。
如果您更改了 Edge Impulse 项目的名称,则必须使用新项目名称更新 #include <AI_Oximeter_inferencing.h> 行。
#include <新项目名称_inferencing.h>
## 步骤18:结论
该项目展示了Edge Impulse的AI功能成功地与实时传感器数据集成,构建了一个AI驱动的血氧仪。通过利用MAX30102传感器,ST7789 TFT显示器,和一个自定义训练的Edge Impulse模型,我们创建了一个紧凑、高效的设备,能够监测关键的健康参数,如SpO2、心率和体温。AI基于分类的添加增强了血氧仪的功能,根据实时数据提供用户的健康状态(好、坏、生病)的直观评估。
需要注意的是,这个设备仅用于教育目的,不应被信任用于专业的健康监测或诊断。虽然它展示了机器学习和物联网的潜力,但它不是一个认证的医疗设备,不应该被用来替代医疗级设备。
感谢你和我一起进行这次旅程。如果你喜欢这个项目,请不要忘记点赞、评论,并分享你自己的经验。未来充满了无限的可能性,我很期待看到你们用这项令人惊叹的技术创建的惊人项目。
页:
[1]