David Lin

David Lin

一個軟體工程師的隨意筆記

30 May 2021

電子模組 - MAX30100 血氧與心跳感測器

最近因為武漢肺炎(COVID-19)疫情,大家都對於症狀之一『隱性缺氧』感到擔憂。 因為這個症狀會讓確診者不知不覺失去吸收氧氣的能力,從而走向死亡。 所以大家都開始購買可以測量血氧的機器,包含 Apple Watch。XD

基於好奇心,想要研究一下血氧測量的原理,我就買了這個模組:

module

它真的很小,不會超過兩平方公分。上面有個感應器,可以把手指間放上去測定一下血液中含氧量與脈搏。 人體血液中有兩種血紅蛋白,分別為含氧的 HbO2 與普通的 Hb,這兩者對於紅光與紅外線的吸收率是不同的, 而且在心臟搏動時候,收縮與舒張時這兩個血紅蛋白的含量都不同,也可以用來測量脈搏頻率。

diagram (圖片取自 MAXIM 的 datasheet)

安裝 MAX30100 Library

# Arduino Library 的安裝位置,不同 OS 與 config 下會不相同
cd ~/Documents/Arduino/libraries

# 只要把 MAX30100 Library clone 下來就好了
git clone git@github.com:oxullo/Arduino-MAX30100.git

執行測試

首先在 Arduino IDE 上,打開範例程式 Examples -> MAX30100lib -> Tester, 編譯程式並上傳到 Arduino 上。

setup

然後把以下接腳接到 Arduino:

  1. VCC -> 5V
  2. SDA -> A4
  3. SCL -> A5
  4. GND -> GND

而且 SDA 與 SCL 需要各自接上 4.7K pull-up resistors,不然 I2C 通訊會失敗。

pullup

接下來,打開 Serial Monitor 視窗(baud 要切成 115200),看看他的輸出。

Initializing MAX30100..Success
Enabling HR/SPO2 mode..done.
Configuring LEDs biases to 50mA..done.
Lowering the current to 7.6mA..done.
Shutting down..done.
Resuming normal operation..done.
Sampling die temperature..done, temp=37.94C
All test pass.

看起來測試有通過,接下來看看它的 Raw Data 吧。

IR=77 RED=111
IR=73 RED=102
IR=77 RED=89
IR=71 RED=79
IR=60 RED=79
IR=50 RED=83
IR=62 RED=78
IR=60 RED=69
IR=60 RED=62
... (怒刪)
IR=458 RED=616
IR=506 RED=695
IR=587 RED=791
IR=703 RED=928
IR=824 RED=1113
IR=975 RED=1338
IR=1190 RED=1628
IR=1480 RED=2017
IR=1847 RED=2507
IR=2316 RED=3096
IR=2888 RED=3765
IR=3533 RED=4467
... (怒刪)
IR=13285 RED=13699
IR=12673 RED=12462
IR=11812 RED=11428
IR=11059 RED=11167
IR=11765 RED=12211
IR=12706 RED=12720
... (怒刪)
IR=14979 RED=13312
IR=14968 RED=13279
IR=14978 RED=13262
IR=14963 RED=13245
IR=14960 RED=13225
IR=14966 RED=13203
IR=14972 RED=13197
IR=14990 RED=13226
IR=15012 RED=13288
IR=15067 RED=13462
IR=15193 RED=13757
IR=15201 RED=13844
IR=16056 RED=15560
IR=17411 RED=16314

當手指接近時候,IR 與 RED 的數值都會提高,可見這兩個 LEDs 與 sensors 都沒有壞。

然後換另一個範例程式跑看看:Examples -> MAX30100lib -> Minimal,結果數值怪怪的… 把手指放在感測器上,讀出來的血氧值居然為 0%… 先確認一下我是不是還活著 = =

改跑另一個程式看看,Examples -> MAX30100lib -> RawData,結果發現 IR 有 Overflow 情況

raw plot overflow

看起來 IR 太亮了,需要調暗

#define IR_LED_CURRENT                      MAX30100_LED_CURR_7_6MA
#define RED_LED_CURRENT                     MAX30100_LED_CURR_27_1MA

// ...

sensor.setLedsCurrent(IR_LED_CURRENT, RED_LED_CURRENT);

重新編譯執行之後,讀數就好多了

raw plot better

知道問題原因之後,回頭修改一下 Minimal Example

// 調整 IR LED 的亮度
pox.setIRLedCurrent(MAX30100_LED_CURR_24MA);

press finger

Heart rate:65.04bpm / SpO2:93%
Beat!
Heart rate:64.22bpm / SpO2:93%
Beat!
Heart rate:66.85bpm / SpO2:93%
Beat!
Heart rate:66.21bpm / SpO2:93%
Beat!
Heart rate:68.68bpm / SpO2:93%
Beat!
Heart rate:67.32bpm / SpO2:93%
Beat!
Beat!
Heart rate:70.35bpm / SpO2:93%
Beat!
Heart rate:68.94bpm / SpO2:93%
Heart rate:68.94bpm / SpO2:93%
Beat!
Heart rate:46.64bpm / SpO2:93%
Heart rate:46.64bpm / SpO2:93%

得出來的結果比較合理了,而且心跳有正確記錄到~ 看起來是可以用這樣的方式檢查與紀錄自己的心率與血氧,但這只能當作參考。 畢竟這個模組並沒有經過 FDA 承認為醫療器材,所以如果要認真測量的話還是買台專業的血氧機吧。

References

comments powered by Disqus