基礎(chǔ)知識之心率傳感器
1. 什么是心率傳感器?
心率傳感器是一種用于測量人體心跳率的傳感器。它可以通過監(jiān)測心臟的電活動或血流來提供實時的心率數(shù)據(jù),并將心率數(shù)據(jù)轉(zhuǎn)換為電信號或數(shù)字信號。心率是指心臟每分鐘跳動的次數(shù),通常以“bpm”(每分鐘跳動次數(shù))為單位。
本文引用地址:http://m.butianyuan.cn/article/202403/456220.htm圖1:max30102光電式心率血氧傳感器、XD-58C Pulse Sensor脈沖傳感器
2. 心率傳感器是如何工作的?
心率傳感器的工作原理可以分為兩種常見的方法:光電傳感和電生理傳感。
光學(xué)心率傳感器
光電傳感:這是最常見的心率傳感器工作原理。它使用了光敏元件(例如光電二極管或光敏電阻)來測量皮膚上的血流變化,從而推導(dǎo)出心率數(shù)據(jù)。有些設(shè)備也可以估計血液中的氧氣水平。
光學(xué)心率傳感器是是智能穿戴設(shè)備中最為普及的用于心率檢測的傳感器之一。它采用電光溶劑脈搏波描記法(PPG)來測量心率及其他生物計量指標(biāo)。
PPG測量原理:通過電容燈光射向皮膚,透過皮膚組織反射回的光被光敏傳感器接受并轉(zhuǎn)換成電信號,再經(jīng)過電信號轉(zhuǎn)換成數(shù)字信號,再根據(jù)血液的吸光率算出心率。簡化測量過程就是:發(fā)射光——轉(zhuǎn)換成電信號——轉(zhuǎn)換成數(shù)字信號。
圖2:光學(xué)心率傳感器的基本結(jié)構(gòu)與運行
光學(xué)心率傳感器使用四個主要技術(shù)元件來測量心率:
光學(xué)心率傳感器可生成測量心率的PPG波形并將該心率數(shù)據(jù)作為基礎(chǔ)生物計量值,但是利用PPG波形可以測量的對象遠(yuǎn)不止于此。圖3是經(jīng)過簡化的PPG信號,該信號代表了多個生物計量的測量結(jié)果。
圖 3:典型的PPG波形
下面我們進(jìn)一步詳細(xì)解讀某些光學(xué)心率傳感器可以測得的結(jié)果:
光學(xué)心率傳感器選擇綠光作為光源的原因
圖 4:光譜
選擇綠光作為測量光源是考慮到以下幾個特點:
圖 5: 光電式心率傳感電路
電極式心率傳感器
電生理傳感:這種傳感器利用人體的生物電活動來測量心率。即心臟在每次心跳時都會產(chǎn)生一個小電流,具有電檢測功能的心率監(jiān)測器通過檢測和跟蹤該電流,實現(xiàn)心率的測量。 常用的電生理傳感器是心電圖(ECG)傳感器,通過測量心臟產(chǎn)生的電信號來確定心率。
工作過程如下:
電極式心率傳感器與傳統(tǒng)醫(yī)院獲取心電圖儀器的區(qū)別
無論是光電傳感還是電生理傳感,心率傳感器通常會將采集到的數(shù)據(jù)發(fā)送給處理器或設(shè)備進(jìn)行分析和顯示。這樣,用戶就可以實時了解自己的心率情況。
需要注意的是,不同型號的心率傳感器可能采用不同的工作原理和技術(shù)細(xì)節(jié),但基本原理是類似的:通過測量血流變化或心臟電信號來推導(dǎo)心率數(shù)據(jù)。
3. 常見的設(shè)備類型
4. 主要的心率傳感器供應(yīng)商
5. 參考案例
深入:使用脈沖傳感器和Arduino檢測,測量和繪制心率 (lastminuteengineers.com)
MAX30102脈搏血氧儀和心率傳感器與Arduino接口 (lastminuteengineers.com)
AD8232 ECG模塊引腳排列,與Arduino接口,應(yīng)用 (microcontrollerslab.com)
下面是個人案例,使用Mircopython編寫程序驅(qū)動RP2040讀取Max30102的數(shù)據(jù)。
電路連接
程序代碼
驅(qū)動文件包含三個.py文件。
前面兩個文件可在后面鏈接中下載:https://github.com/n-elia/MAX30102-MicroPython-driver/tree/main/max30102
檢測心率.py程序如下
from machine import SoftI2C, Pin, Timer
from utime import ticks_diff, ticks_us
from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM
BEATS = 0 # 存儲心率
FINGER_FLAG = False # 默認(rèn)表示未檢測到手指
def display_info(t):
# 如果沒有檢測到手指,那么就不顯示
if FINGER_FLAG is False:
return
print('心率: ', BEATS)
def main():
global BEATS, FINGER_FLAG # 如果需要對全局變量修改,則需要global聲明
# 創(chuàng)建I2C對象(檢測MAX30102)
i2c = SoftI2C(sda=Pin(16), scl=Pin(17), freq=400000) # Fast: 400kHz, slow: 100kHz
# 創(chuàng)建傳感器對象
sensor = MAX30102(i2c=i2c)
# 檢測是否有傳感器
if sensor.i2c_address not in i2c.scan():
print("沒有找到傳感器")
return
elif not (sensor.check_part_id()):
# 檢查傳感器是否兼容
print("檢測到的I2C設(shè)備不是MAX30102或者M(jìn)AX30105")
return
else:
print("傳感器已識別到")
print("使用默認(rèn)配置設(shè)置傳感器")
sensor.setup_sensor()
# 對傳感器進(jìn)行設(shè)定
sensor.set_sample_rate(400)
sensor.set_fifo_average(8)
sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)
t_start = ticks_us() # Starting time of the acquisition
MAX_HISTORY = 32
history = []
beats_history = []
beat = False
while True:
sensor.check()
if sensor.available():
# FIFO 先進(jìn)先出,從隊列中取數(shù)據(jù)。都是整形int
red_reading = sensor.pop_red_from_storage()
ir_reading = sensor.pop_ir_from_storage()
if red_reading < 1000:
print('No finger')
FINGER_FLAG = False # 表示沒有放手指
continue
else:
FINGER_FLAG = True # 表示手指已放
# 計算心率
history.append(red_reading)
# 為了防止列表過大,這里取列表的后32個元素
history = history[-MAX_HISTORY:]
# 提取必要數(shù)據(jù)
minima, maxima = min(history), max(history)
threshold_on = (minima + maxima * 3) // 4 # 3/4
threshold_off = (minima + maxima) // 2 # 1/2
if not beat and red_reading > threshold_on:
beat = True
t_us = ticks_diff(ticks_us(), t_start)
t_s = t_us/1000000
f = 1/t_s
bpm = f * 60
if bpm < 500:
t_start = ticks_us()
beats_history.append(bpm)
beats_history = beats_history[-MAX_HISTORY:] # 只保留最大30個元素數(shù)據(jù)
BEATS = round(sum(beats_history)/len(beats_history), 2) # 四舍五入
if beat and red_reading < threshold_off:
beat = False
if __name__ == '__main__':
tim = Timer(period=1000, mode=Timer.PERIODIC, callback=display_info)
main()
評論