
心率传感器是一种用于监测心脏跳动频率和节律的电子设备,广泛应用于医疗健康、运动健身、智能穿戴等领域。其核心是通过物理或生物信号转换技术,将心脏活动转化为可测量的电信号或光学信号,再经处理后输出心率数据.

| 引脚名称 | 描述 |
|---|---|
| GND | GND(电源输入负极) |
| VCC | VCC(电源输入正极) |
| A | IIC数据传输引脚 |
| L | IIC通信时钟引脚 |
供电电压:3.3V - 5V
连接方式:PH2.0 4P端子线
安装方式:螺丝固定

示例程序(UNO开发板):点击下载
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
int Bpm_value;
void setup(){
Serial.begin(9600);
particleSensor.begin(Wire, I2C_SPEED_FAST);
particleSensor.setup(); //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}
void loop(){
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true)
{
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
Bpm_value = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
Bpm_value += rates[x];
Bpm_value /= RATE_SIZE;
}
}
Serial.print("Bpm_value = ");
Serial.print(Bpm_value);
Serial.println(" bpm");
}
示例程序(ESP32开发板—基于Python语言,不能用Arduino IDE上传代码):
from machine import I2C, Pin
import time
MAX3010X_I2C_ADDR = 0x57
REG_FIFOWRITEPTR = 0x04
REG_FIFOOVERFLOW = 0x05
REG_FIFOREADPTR = 0x06
REG_FIFODATA = 0x07
REG_FIFOCONFIG = 0x08
REG_MODECONFIG = 0x09
REG_PARTICLECONFIG = 0x0A
REG_LED1_PA = 0x0C
REG_LED2_PA = 0x0D
REG_MULTILEDCONFIG1= 0x11
REG_MULTILEDCONFIG2= 0x12
REG_PARTID = 0xFF
EXPECTED_PARTID = 0x15
def _mask_write(i2c, addr, reg, mask, bits):
cur = i2c.readfrom_mem(addr, reg, 1)[0]
cur &= mask
cur |= bits
i2c.writeto_mem(addr, reg, bytes([cur]))
class MAX3010x:
def __init__(self, i2c, address=MAX3010X_I2C_ADDR):
self.i2c = i2c
self.address = address
def read_reg(self, reg):
return self.i2c.readfrom_mem(self.address, reg, 1)[0]
def write_reg(self, reg, val):
self.i2c.writeto_mem(self.address, reg, bytes([val & 0xFF]))
def soft_reset(self):
_mask_write(self.i2c, self.address, REG_MODECONFIG, 0xBF, 0x40)
t0 = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), t0) < 100:
if (self.read_reg(REG_MODECONFIG) & 0x40) == 0:
return True
time.sleep_ms(1)
return False
def setup(self):
self.soft_reset()
_mask_write(self.i2c, self.address, REG_FIFOCONFIG, 0b11100000, 0x40)
_mask_write(self.i2c, self.address, REG_FIFOCONFIG, 0xEF, 0x10)
_mask_write(self.i2c, self.address, REG_MODECONFIG, 0xF8, 0x03)
_mask_write(self.i2c, self.address, REG_PARTICLECONFIG, 0x9F, 0x60)
_mask_write(self.i2c, self.address, REG_PARTICLECONFIG, 0xE3, 0x00)
_mask_write(self.i2c, self.address, REG_PARTICLECONFIG, 0xFC, 0x03)
self.write_reg(REG_LED1_PA, 0x4F)
self.write_reg(REG_LED2_PA, 0x4F)
_mask_write(self.i2c, self.address, REG_MULTILEDCONFIG1, 0xF8, 0x01)
_mask_write(self.i2c, self.address, REG_MULTILEDCONFIG1, 0x8F, 0x20)
self.write_reg(REG_FIFOREADPTR, 0)
self.write_reg(REG_FIFOOVERFLOW, 0)
self.write_reg(REG_FIFOWRITEPTR, 0)
def read_fifo_red_ir(self):
if self.read_reg(REG_FIFOREADPTR) == self.read_reg(REG_FIFOWRITEPTR):
return None
data = self.i2c.readfrom_mem(self.address, REG_FIFODATA, 6)
red = ((data[0] << 16) | (data[1] << 8) | data[2]) & 0x3FFFF
ir = ((data[3] << 16) | (data[4] << 8) | data[5]) & 0x3FFFF
return red, ir
lastBeatTime = 0
threshold = 2000
peak = 0
trough = 999999
amp = 0
IBI = 600
firstBeat = True
secondBeat = False
rate = [600] * 10
rate_index = 0
def checkForBeat(ir_value):
global threshold, peak, trough, amp
global lastBeatTime, firstBeat, secondBeat
global IBI, rate, rate_index
now = time.ticks_ms()
signal = ir_value
if signal < threshold and signal < trough:
trough = signal
if signal > threshold and signal > peak:
peak = signal
if signal > threshold and (time.ticks_diff(now, lastBeatTime) > 300):
IBI = time.ticks_diff(now, lastBeatTime)
lastBeatTime = now
if firstBeat:
firstBeat = False
secondBeat = True
return False
if secondBeat:
secondBeat = False
for i in range(len(rate)):
rate[i] = IBI
rate[rate_index] = IBI
rate_index = (rate_index + 1) % len(rate)
amp = peak - trough
threshold = trough + amp * 0.5
peak = threshold
trough = threshold
return True
if time.ticks_diff(now, lastBeatTime) > 2500:
threshold = signal * 0.97
peak = threshold
trough = threshold
firstBeat = True
secondBeat = False
return False
def read_bpm(timeout_ms=8000):
i2c = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
sensor = MAX3010x(i2c)
sensor.setup()
start = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start) < timeout_ms:
data = sensor.read_fifo_red_ir()
if not data:
time.sleep_ms(5)
continue
red, ir = data
if ir < 20000:
continue
if checkForBeat(ir):
avg_IBI = sum(rate) / len(rate)
bpm = 60000 / avg_IBI
new_bpm = bpm - 80
if new_bpm < 0:
return 0
else:
return int(new_bpm)
return 0
import machine
while True:
xinlv = read_bpm()
print(('心率值(BMP):' + str(xinlv)))
示例程序(UNO开发板):点击下载

示例程序(ESP32开发板):点击下载

Arduino环境搭建
准备配件:
电路接线图:

Micropython环境搭建
准备配件:
电路接线图:
不会使用库文件的参考这里:库文件安装使用
库文件:点击下载
米思齐UNO开发板库文件安装步骤(使用代码前先下载安装米思齐库文件):参考链接
米思齐ESP32开发板库文件下载安装步骤(使用代码前先下载安装米思齐库文件):参考链接
视频教程:点击查看

器件连接好线之后,将上述程序上传到开发板之后,即可看到心率传感器模块数据测试。