本次完成的项目,是结合乐鑫ESP32-S3-Box-Lite和EPC001开发板,实现的便携生命体征检测仪原型机。
EPC001芯片的资料
通过资料,可以了解到这块EPC001开发板是基于EPC001芯片的多参数生命体征检测开发板,芯片集成了分别用于检测脉搏波信号与心电信号的模拟前端,而且ADC精度为24bits,这是非常之高了。 配合官方提供的软件,就可以通过串口获取EPC001采集到的对应数据进行呈现,检测的波形包括脉搏波、血氧波形、心电、肌电、脑电波形,并可以实时更新检测参数如心率、血氧、血压、心律不齐指数等多种参数。
在资料包之中,还提供了"EPC001_Program_HClock_高速时钟"、"EPC001_Program_HClock_低速时钟"的源码,也提供了开发工具,但烧录要使用ARM-USB-TINY-H调试器。 我没有这样的调试器,所以不能对源码进行二次开发。不过EPC001是通过串口与上位机进行通讯的,所以可以参考上位机,对照技术手册,使用串口指令控制EPC001和从EPC001读取检测的数据。
设计想法
ESP32-S3-Box-Lite,使用的是ESP32-S3的主控,带有320x240的TTF屏幕,并提供了PMOD接口,可以与EPC001开发板的串口连接,从而控制EPC001开发板进行采集和数据回传。
于是结合两者,实现了这个"ECP001便携生命体征检测仪原型机"。
当前分享的这个版本为第一版,实现了对ECP001开发板的基础控制,可以检测一路波形信号数据,并呈现SP02数据。
因为是进行原型开发,所以系统程序的开发基于MicroPyton,界面使用LVGL开发。
在这次分享中,以ECG数据为主。 在学习使用EPC001的过程中,得到了EPC001技术人员的大力支持,解决了不少疑惑和问题,并从网络上查到了大量LVGL相关的资料和分享,都非常感谢!
开发板串口的连接
通过开发板的使用手册,可以了解到ECP001开发板上串口通讯的引脚:
实际位置位于J3的7、3引脚:
这个串口引脚,可以与官方提供的USB2TTL连接到电脑,使用官方提供的上位机软件控制PEC001开发板,并读取数据进行呈现。 在这个项目中,将其与ESP32-S3-Box-Lite的PMOD上的GPIO11、GPIO13进行连接,实现串口通讯。
数据解析规则
为了更好的理解技术手册中所描述的通讯协议,我还是用了逻辑分析仪,来辅助进行分析。 下面是官方上位机软件中,ECG部分的界面:
使用逻辑分析,可以清晰的看到EPC001回传的数据:
通过逻辑分析仪,我将所有的界面的参数的设置,测量的启停,都进行了详细的分析,并与手册一一核对。 在最开始版本提供的手册,有部分指令和解析规则是对应不上的,向官方技术人员咨询后,得到更新版本的技术手册,从而都匹配正确。
具体的通讯协议,分为两个部分,分别为:
-
控制命令发送:
-
-
下发控制命令后,EPC001会应答对应的控制命令,表示收到。 具体的控制指令包括如下:
-
-
数据上传:
-
-
当使用采集波形指令后,除了会回传控制指令接受成功,后续将会持续的自动上传检测的数据。
具体的数据上传数据包包括如下:
通过技术手册和逻辑分析仪配合,了解清楚了通讯协议以后,我还使用串口调试工具,进行了对应控制指令的发送和回传数据的接收,把这些弄清楚了,就可以开始具体的开发工作了。
MicroPyton中串口数据的读取
在ESP32-S3-Box-Lite的系统程序中,使用串口与EPC001通讯:
在MicroPython中,处理串口通讯非常快捷方便。
首先定义串口通讯引脚:
然后使用uart.write()进行发送,使用uart.any()检测是否有收到数据,使用uart.read()读取数据:
因为不同的波形数据的获取,对应不同的指令,所以可以参考实际需要,进行指令的定义:
发送对应的波形采集控制指令后,就能够接收到数据上传了。
在代码中,我适当的输出了读取到的数据:
可以看到,持续收到了0x21开头的ECG波形数据。
读取到数据之后,就可以根据技术手册的说明,进行解析。
上面的示例为EMC,ECG的上传数据规则类似,只是最开始的数据包头类型为0x21。
在MicroPython中,使用如下的方式进行解析:
上述解析过程如下:
- 检测数据包的头和尾,应为为0x21、0x0A,则表示有效的ECG数据
- 计算校验和位之前的数据包内容部分的校验和,并与收到的校验和进行对比,相同则说明数据有效
- 再取得数据中的波形数据的部分,进行下一步的处理
参考前面使用逻辑分析的结果和技术手册,可以了解波形部分的数据,是对应数字的ASCII码,使用下面的代码进行界面得到对应的数值:
如前述逻辑分析仪取得的数据:
解析后,对应的数值为:8388608
该数值,即为ADC采样的原始值(RAW),可以参考手册中的说明,转换为mV原始值和增益值:
增益值和原始值的差别,只是在于计算增益值的时候,nGain=1即可。
对应的MicroPython处理代码如下:
因为拿到过两版技术手册,所以上面的代码中,有两个计算公式。实际的处理代码,为下面的部分,与最新的技术手册对应。
界面的处理
在界面的处理上,因为是第一版,所以以简洁快速为主,基本的设置如下。
- 开机首显示首界面
- 按中键后,进入波形采集和呈现界面
- 在此界面,可以按中键,进行切换暂停和呈现状态
- 按左右键,分别为进入波形界面和SP02数据呈现界面
- 按右上角BOOT按键,则返回首界面
因为使用了LVGL进行界面的开发,所以可以很方便的使用LVGL的组件,来进行具体界面的呈现。
-
首界面:使用LVGL的image组件呈现图片
-
波形部分的显示:使用LVGl的chart组件
-
波形界面文本显示:在波形数据界面,会显示当前的参数设置,以及读取到的数据,使用LVGL的label组件即可:
-
SP02数据:使用LVGL的Table组件进行呈现:
最后,再使用按键,来处理对应界面的切换:
串口数据对接LVGL界面
通过LVGL设计好了相应的界面,再将读取到的数据,与LVGL界面关联起来,就能实时进行数据呈现:
- 波形数据的呈现:
- SP02数据的呈现:
功能展示
最终,第一版原型机实现的功能如下:
- 首界面:
- 波形界面:
- SP02数据呈现:
源码分享
完整的源码,可以查看:https://gitee.com/honestqiao/EPC001_ESP32-S3-Box-Lite
后续计划
随着对暖芯迦EPC001使用的深入,以及在MicroPython中使用LVGL的熟练,对第二版也进行了一些规划。
- 功能上
- 完善对现有波形数据的支持:
- 采用模块化的结构,进行数据解析
- 实现对PPG-绿光、PPG-红光、ECG、PPG+ECG、EMG、EEG、BP波形数据的控制和读取,以及SP02数据的读取
- 界面上
- 使用Screen/Tab的方式,方便进行切换操作
- 使用Screen/Tab的方式,方便进行切换操作