想在穿戴设备、健康监测、机器人上做一个能测心率和血氧的模块,MAX30102是颗非常流行的光体积描记(PPG)传感器芯片。它用红光和红外两种LED照进皮肤,通过检测反射光的脉动变化来估脉搏和血氧,走I2C接口,脚不多,但读数据有不少讲究。这篇把从接线到读心率的实操讲清楚。

I2C接线,电平得注意
MAX30102模块一般有6个脚:VIN(电源)、GND、SCL、SDA,还有INT(中断,可空)和IRD/RD(也可空)。接到Arduino上通常VIN接5V或3.3V(看模块是否带稳压)、GND接地、SDA接A4、SCL接A5,这就是走I2C。它的默认I2C地址是0x57。
要特别提醒的是电平:MAX30102芯片本身是1.8V的,很多模块板载了稳压和电平转换所以能接5V的Arduino。但如果你买的模块没有电平转换,硬接到5V的I2C线上可能会出问题。稳妥做法是接3.3V,或用带电平转换的模块。
用现成库,红外通道读心率
Arduino端最省事的是用SparkFun或Adafruit的MAX30102库。初始化时设好采样率和LED电流,然后循环读。测心率最常用的是红外LED(因为红光对脉搏的反射受肤色影响大),读出的红外通道原始值呈现脉动波形,波峰之间就是一次心跳。
要算出具体心率数值,通常还要做简单的滤波和峰检测:对红外通道的值做一个滑动平均或低通滤波,然后再用一个固定阈值或动态阈值找波峰,波峰间隔的倒数×60就是每分钟心跳。很多开源例程会封装好这部分,直接调用就行。

三个高频坑,提前绕开
第一是指头贴合的坑。MAX30102对接触非常敏感,指头压太紧会压瘪毛细血管让血流信号没了,压太松又会漏光或移动。正确方式是让指尖轻轻固定在传感器上方、压住但不要大力,静止不动读数才稳定。
第二是运动伪差。测血氧心率最怕手指移动,一旦动,读出的波形全是杂波,血氧饱和度算法很容易算飞。所以它适合静止状态下测,运动监测场景要用带抗运动干扰的运动型PPG传感器。
第三是环境光和供电纹波。强光照射会干扰红光反射,要尽量遮光;传感器对电源纹波敏感,别和电机等大电流负载共用一个脏电源,给它一个干净的3.3V。把贴合、静止、干净供电三件事捋顺,MAX30102就能稳定给你报出心率和血氧。







接3.3V更稳,我之前怼5V模块温温的
这个做穿戴设备基础心率监测很不错
MAX30102测血氧得静止,手指一动数值就飘
指头压太紧反而读不到,轻轻压住刚好
红外通道读心率比红光稳,肤色影响小