我用的是EVB_Air724UG_A13开发板, 模块是之前在某宝买的MAX30102模块。接上SDL,SDA,VCC,GND,开始撸代码。

1、开始对MAX30102进行初始化
local function maxm_max30102_init()
if i2c.setup(i2cid,i2c.FAST,i2cslaveaddr) ~= i2c.FAST then
log.info("i2cfail")
return
end
log.info("i2copen", "max30102")
log.info("max30102ID", string.byte(maxim_max30102_read_reg(0xFF,1),1))
--中断使能寄存器
maxim_max30102_write_reg(0x02,0xC0) --FIFO满中断 FIFO 读就绪中断
maxim_max30102_write_reg(0x03,0x00)
--FIFO 读写溢出计数指针清理
maxim_max30102_write_reg(0x04,0x00) --WR COUNT
maxim_max30102_write_reg(0x05,0x00) --OVF COUNT
maxim_max30102_write_reg(0x06,0x00) --RD COUNT
--FIFO CONFIG
maxim_max30102_write_reg(0x08,0x0F) --平均值1,不覆盖,剩余15中断触发
--MODE CONFIG
maxim_max30102_write_reg(0x09,0x03) --SPO2 模式 RED AND IR
--SPO2 CONFIG
maxim_max30102_write_reg(0x0A,0x27) --SPO2_ADC range = 4096nA SPO2 sample rate (100 Hz), LED pulseWidth (400uS)18BAT
maxim_max30102_write_reg(0x0C,0x34) --Choose value for ~ 7mA for LED1
maxim_max30102_write_reg(0x0D,0x34) --Choose value for ~ 7mA for LED2
maxim_max30102_write_reg(0x10,0x7F) --Choose value for ~ 25mA for Pilot LED
end
2、读取中断数据,对数据进行保存
function maxim_max30102_read_fifo()
local intt = maxim_max30102_read_reg(0x00,2) --清除中断
local cnt = maxim_max30102_read_reg(0x04,3)
local num = cnt:byte(1) - cnt:byte(3)
if num <= 0 then num = num + 32 end
num = num * 6
local readdata = maxim_max30102_read_reg(0x07,num)
-- log.info("max30102",cnt:byte(1),cnt:byte(2),cnt:byte(3),string.len(readdata),intt:byte(1))
if cnt:byte(2) > 0 then log.info("cnt", cnt:byte(2)) end
for i = 1, num, 6 do
reddatatemp = bit03(string.byte(readdata,i))
reddatatemp = reddatatemp * 256
reddatatemp = reddatatemp + string.byte(readdata,i+1)
reddatatemp = reddatatemp * 256
reddatatemp = reddatatemp + string.byte(readdata,i+2)
irdatatemp = bit03(string.byte(readdata,i+3))
irdatatemp = irdatatemp * 256
irdatatemp = irdatatemp + string.byte(readdata,i+4)
irdatatemp = irdatatemp * 256
irdatatemp = irdatatemp + string.byte(readdata,i+5)
if datacut > 500 then
table.remove(myreddata,1)
table.remove(myirdata,1)
table.insert(myreddata,reddatatemp)
table.insert(myirdata,irdatatemp)
else
myreddata[datacut] = reddatatemp
myirdata[datacut] = irdatatemp
datacut = datacut + 1
end
end
end
3、对数据进行分析,得出心率值
hr = algorithm.HeartRateAndOxygen(myreddata,myirdata)
log.info("max30102:", hr);
完美完成!!!