MAX30102采集心率数据
一个100行的代码调试都可能会让程序员遇到很多挫折,所以,面对挫折,我们永远不能低头。
关于MAX30102驱动配置程序,网上搜索博客有一堆资料,c/c++写的驱动代码都有,
可参考博客:
软件流程:
* 中断向量初始化
* 串口初始化
* 定时器初始化
* IIC初始化
* max30102初始化
* 循环读取max30102数据寄存器的值
* 每隔10s计算一次心率值
基本的单片机配置不用多说,不会的可以区正点原子官网下载例程好好学一学
stm32系列基本上都是库函数,非常适合新手上手
我这里使用的是stm32f405单片机
单片机调试会出现很多莫名其妙的bug,有软件产生的,有硬件产生的,要学会逐个问题的分析排查
调试max30102尤其要注意的点;
* 搞清楚测心率是红灯还是红外,官方英文手册有写:红灯是心率模式,红灯+红外是血氧模式
* 一定要保证IIC配置正确,这样才能读到数据
* 一定要注意max30102的采样频率,采样频率的设置直接关系到心率计算的准确度
* 根据采样频率如设置100hz,说明每10ms采样一个数据,那么就可以采用定时器每定时10ms设置标志位,然后再在应用程序里判断标志位从而把数据读出来
* 读取数据可采用fifo模式,需看懂官方手册,如何利用fifo读取数据以及每个数据是如何组成的,如心率模式下,读FIFO是六个字节,前后三个字节都是红灯数据
* 10s即可读到1000个数据,利用此1000个数据即可计算心率值
硬件准备就绪,软件驱动配置正确的情况下,将手指头贴在max30102上面静止不动,采集数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 112539 112514 112534 112523 112548 112631 112578 112663 112591 112636 112669 112644 112436 112386 112262 112296 112183 112234 112138 112155 112143 112205 112162 112158 112178 |
采集到数据后需要对数据进行预处理,再经过心率提取算法,计算出心率值,可先离线分析,再将代码实现在单片机上。
数据预处理部分基本上包含如下:
* 环境光处理(硬件处理)
* 去除运动伪影
* 维纳滤波衰减噪声(适合运动下测量)
* 巴特沃兹去低频噪声
* rolling去除基线漂移,只能线性补偿,非线性待测试解决
* 均值滤波->滑动平均使波形更平滑
python实现效果如下:
经过和华为watch测试对比,静止情况下,误差在1%之内
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性