高通台灣AI黑客松|競賽說明會
|

【ESP32專題(一)】智慧生醫 – 心率血氧機

   

作者/圖片來源: CIRCUS Pi

「缺氧」是身體組織含氧量少的情形,也就是血液中的氧氣濃度低於正常水準。血氧機利用量測血氧飽和度(SpO2,血液中含氧血紅素與總血紅素的比例)來判斷血氧濃度是否低於正常水準,正常人體動脈的血氧濃度為 95 ~ 100%,如果數值低於 90% 則視為低血氧症,再低到 80% 以下將會損害大腦與心臟等器官功能。

Covid-19 新冠肺炎重症特別容易造成隱形缺氧,缺氧不會引起不適或疼痛,因此它的發作可能是隱匿性的,不會引起注意,旁人無法意識到其危險性,故需要透過血氧機即時監控身體血氧濃度,把握最佳黃金治療期。

本篇文章主要目標就是要分享如何從無到有,動手製作一台「指尖心率血氧機」,完成後除了可以拿來自用,更可以從中研究心血氧的量測方式及原理,甚至能進一步增加市面上大部分血氧機沒有的功能(例如長期雲端統計,連動 Line、Email、APP 在數值超標即時發送緊急通知,避免錯過黃金治療期),結合各種創意打造專屬自己的心率血氧機,如下所展示。

事前準備

  1. 所需材料
    TTGO T-Display ESP32 CH9102 WiFi 模組(16MB) x 1
    MAX30100 血氧感測器模組(內附 Grove 線)x 1
    聚合物鋰電池-500mAh 3.7V x 1
    強力雙面膠 3cm x 2
    束線帶 x 2
    寬型橡皮筋 x 2
  2. 所需工具
    烙鐵
    剝線鉗
  3. 所需軟體
    Arduino IDE 1.8.16 或更高版本。

硬體介紹

1.TTGO T-Display開發板

TTGO T-Display(圖 1)主要特色是將 ESP32、彩色 TFT(解析度 240×135)、鋰電池充放電路、AB 鍵按鈕,Type-C 接頭整合到一塊體積非常小的開發板上,體積優勢加上可使用鋰電池供電,並且有非常漂亮的 TFT 可顯示彩色畫面,對於喜歡 ESP32 系列並且需要彩色顯示的專案會是很好的選擇。

圖 1. TTGO T-Display 開發板

2.MAX30100 心血氧感測器模組

MAX30100(圖 2)是一款由 Maxim Integrated 開發用於量測心率及血氧的感測器,可用於簡化一般健身或檢測健康用途的穿戴式裝置設備,並且擁有非常低的待機功耗,以符合穿戴式設備的功耗要求。本次製作採用的是由 M5Stack 整合的MAX30100 血氧感測器模組,它提供了較完整的外觀及機構,避免在量測期間受到環境光干擾。

圖 2. M5Stack MAX30100 心血氧模組

3.聚合物鋰電池-500mAh 3.7V

指尖心率血氧機的電池我們採用型號為 602535(厚 6mm,寬 25mm,長 35mm)(圖 3),電壓 3.7V 容量為 500mah 的鋰電池,對於此專題初步預估待機時間約 50 天左右,可連續使用約 6 小時。

圖 3. 602535 500mah 3.7V 鋰電池

組裝說明

1.硬體架構圖

圖 4 所示為開發板與模組內部主要元件以及架構,讓讀者能更加了解各個部件的功能以及它們之間的關係,初步了解後,在設計程式或後續評估續航力都會較為容易。

圖 4. 硬體架構圖

2. 硬體接線表

請依照下表連接 TTGO 開發板與 MAX30100:

表1. 硬體接線表

3. 組裝過程

依照表 1,使用烙鐵經由連接線將 TTGO 開發板與 MAX30100 相連,此模組使用高速 I2C(400Khz),過長的連接線容易導致通訊錯誤,所以請務必將連接線縮短到 10cm 以內。

1.將 Grove 線剪裁為 7cm 左右,並用剝線鉗剝線(圖 5)。

圖 5. 剪裁 Grove 線

2.將 MAX30100 感測器模組電源及 I2C 連接到 TTGO 開發板(依照表 1),完成後如圖 6。

圖 6. MAX30100與TTGO連接

3.將鋰電池原本的接頭剪掉,換成符合 TTGO 的 JST 1.25mm 接頭,並套上熱縮套管,如圖 7 ~ 8 所示。

圖 7. 接上 JST 1.25mm 接頭

圖 8. 套上熱縮套管

4. 將鋰電池接上 TTGO 開發板(圖 9)

圖 9. 鋰電池接上 TTGO 開發板

5. 使用雙面膠將 MAX30100 感測器、電池、TTGO 開發板組合,並套上寬型的橡皮筋(圖 10),最後用束線帶固定邊緣的線即可(圖 11)。

圖 10. 套上寬型橡皮筋

圖 11. 將其餘部件組裝完成

原理說明

1. PPG 訊號

目前最常見的量測都是透過光照的方式(圖 12),對組織發送特定波長的光並利用每次心跳時血管的收縮和擴張,藉由吸光度的變化來決定血氧濃度,這種方式被稱為光體積變化描記圖法 (Photoplethysmography,簡稱 PPG)。

圖 12. PPG量測方式(圖片來源

2. 偵測方式

一般量測心率血氧的方式分為「穿透式」、「反射式」兩種(圖 13),穿透式利用指夾區上方紅光及紅外光兩種光源向下照射,穿過指甲下的組織,底下由光電感測器接收光線,一般市面上的指夾式血氧機都屬於這種類型;反射式常應用在穿戴式裝置上,同樣透過光照方式,但因為配戴在手腕上光線無法穿透故採用發射與接收在同一側的反射式量測方法;本次自製的心率血氧機就是採用「反射式」量測方式。

圖 13. 常見的偵測方式(圖片來源

偵測注意事項

我們使用的 MAX30100 因為光強度的原因,需要在血液灌注充足且較為薄的測試部位量測(例如手指或耳垂),盡可能讓光能順利的打入組織內。

3. 心率量測-PPG訊號AC分量

圖 14 是 PPG 訊號中的「直流」和「交流」分量,直流分量檢測組織、骨骼和肌肉反射的光訊號,以及動脈和靜脈血液的平均血容量,交流分量則表示心動週期的收縮期和舒張期之間發生的血容量變化,藉由連續量測交流分量的收縮峰值時間就可求得瞬時心率。

圖 14. PPG AC、DC分量

4. 血氧(SpO2)量測

4. 血氧(SpO2)量測

我們都知道身體需要氧氣,氧氣進入肺部,然後進入血液,血液會將氧氣運送到身體的各個器官(圖 15),在我們的血液中攜帶氧氣的主要方式是透過血紅蛋白,也可以將血紅蛋白分子(Hb)想像成「汽車」,而「道路」就像我們的血管(圖 16),氧氣分子進入這些汽車就可以在身體內旅行,並直接到達目的地。

圖 16. 血管示意圖

沒有氧氣的血紅蛋白我們稱之為脫氧血紅蛋白(deoxy Hb),含氧的血紅蛋白,我們將其稱為氧合血紅蛋白(oxy Hb)(圖17)。

圖 17. 氧合血紅蛋白與脫氧血紅蛋白

氧飽和度是指攜帶氧氣可用血紅蛋白的百分比。 下圖中,有 16 個血紅蛋白,16 個 Hb 中有 8 個含有氧氣。 因此氧飽和度為 50%(圖 18)(一般正常人的血氧飽和度應為 95~100%)。

圖 18. 血紅蛋白的百分比

上方說明的量測心率方式只需要使用到其中一顆 LED 即可,但需要量測血氧就需要用到兩顆不同波長的 LED,紅光為 660nm,紅外線為 940nm 的波長,那為什麼會需要兩種不同波長的光呢?因為其中的物理性質:「氧合血紅蛋白比起紅光會吸收更多的紅外線,脫氧血紅蛋白比起紅外線會吸收更多的紅光」,即氧合血紅蛋白和脫氧血紅蛋白會以特定方式吸收不同波長的光,我們就是利用這點比較血液吸收了多少紅光和紅外線來計算氧飽和度(如下列公式,根據 MAX30100 使用手冊

兩個波長之間的比率我們稱為「R」,並且 R 與 SpO2 成正比,R 由下列等式定義,IAC 為 PPG 訊號中的 AC 分量, λ1 為 650nm 波長,λ2 為 950nm 波長的光。

有了 R 值後我們就可以利用曲線近似值或是查表的方式估算 SpO2 值,但這些數據通常都是通過大量受試者的經驗收集的,年齡、膚色、整體健康狀況都會影響 SpO2 的準確性,下面公式是根據 MAX30101/MAX30102 使用手冊中給出的一個線性近似的公式(注意,沒有一個公式是適合所有人的喔!)。

圖 19 為經過大量測試後 SaO2 與 R 值的關係,可以發現血氧濃度低至 70% 後呈現線性。

圖 19. 大量受試者測試後 SaO2 與 R 值的關係

安裝 Library 及上傳圖片&程式碼

1. 安裝 Library

除了可從下方連結取得各別 Library,我們也將所有 Library 壓縮後存放在 Github 上。

2. 上傳圖片

為了方理解以及使用我們需要將 TFT 需要顯示的圖片預先上傳到 TTGO SPIFFS(所有圖片都放在 TTGO_MAX30100/data),SPIFFS 相當於 ESP32 的內建 SD 卡,只要預先將要放入 SPIFFS 的資料存在 data 資料夾內,透過 Arduino IDE 工具即可快速上傳,本次使用到的圖片如圖 20。

圖 20. 程式中所需的圖片檔案

接著我們透過 Arduino IDE 開啟此次專案 TTGO_MAX30100 程式碼後,選擇開發板為「ESP32 Dev Module」,選擇「Tool」,點選「ESP32 Sketch Data Upload」即可將專案內 data 資料夾所有內容上傳到 SPIFFS(圖 21)。

圖 21. 使用 Arduino IDE 上傳圖片

上傳成功如圖 22。

圖 22. 成功上傳圖片到 SPIFFS

3. 編譯並燒錄主程式

接著編譯並燒錄本次的主要程式碼 TTGO_MAX30100.ino(圖 23)

 

圖 23 編譯並燒錄主程式 TTGO_MAX30100.ino

訊號處理-MAX30100 原始訊號後處理

實際量測心率

我們依照上述提到 PPG 訊號的 AC 分量來計算心率,但感測器給出的原始資料包含 DC、AC 分量,並且其中包含很多雜訊,我們首先要做的是去除 DC 分量,並且使用濾波器將雜訊濾除,圖 24 為實際從感測器讀取出來的紅光原始數值,可以看到原始數值落在 2000~10000 光反射量區間進行震盪。

圖 21 紅光原始數值

接著我們透過濾波器將 DC 分量移除,移除的方式很容易,我們透過簡單的 IIR(數位濾波)濾波器,公式如下:

w(t) = x(t) + α·w(t-1)

y(t) = w(t) – w(t-1)

其中 y(t) 是濾波器的輸出, x(t) 是當前輸入樣本, w(t) 是一個中間值,其作用類似於信號 DC 值的歷史紀錄(上一次的值), α 是一個比例因子(擴大或縮小過濾器)。 如果 α 為 1,則濾波器將濾不到東西,如果為 0 則會濾掉所有東西。 這些值都不是我們想要的,但如果 α 接近 1,它會在直流頻率處創建一個窄阻帶,即濾掉 DC 分量。

對應程式如圖 25,帶入原始數值 x,回傳濾波完剩餘的 AC 分量。

圖 25. Arduino IIR 濾波器方法

圖 26 為將 PPG DC 分量去除後的波型,可以發現只剩餘 AC 分量。

圖 26. 紅光 PPG AC 分量

圖 26. 紅光 PPG AC 分量

程式功能

下面列出了此程式的基本功能:

  1. 開機顯示 Icon、相關資訊及版本。
  2. 進入主程式前需檢查各元件狀態。
  3. 透過 TFT 顯示心率、血氧、動態心率柱狀圖、剩餘電量以及充電動態。
  4. 空閒時自動進入「深度睡眠模式」以延長待機時間,並可透過 B 鍵按鈕喚醒。

功耗測試

我們希望自製專案品能像市面血氧機一樣透過外部按鈕喚醒,不使用時自動進入省電模式以延長待機時間,由於體積限制的關係,我們採用的電池容量只有 3.7V 500mah,我們希望能盡可能延長待機時間,所以使用了可信度較高的儀器量測了每個使用狀態時的功耗,整機功耗如下所示:

另外,我們也發現深度睡眠時功耗並不低,經過測量各個元件後結果如下所示:

● TTGO T-Display(實際量測功耗為 300 uA)

● M5Stack MAX30100 關機功耗(實際量測功耗為 90.4uA)

綜合上面結果,可以發現整個 MAX30100 模組都是 RT9193 這顆 LDO 在耗電,因為 EN Pin 固定啟用的關係,若是停用狀態下它的功耗只有 0.01 uA,所以如果想讓整顆 MAX30100 模組降低功耗就必須要從外部控制 RT9193 開與關(必須要自行改電路),若可以自行控制開關 MAX30100 模組關機的整體功耗就可以降為 3.21 uA(0.7+2.5+0.01)。

續航力估算

1. 續航力公式

電池續航力 = 電池容量 (mAh) / 負載電流 (mAh)

2. 續航力估算

以電池容量 500mah 為例:

  • 連續使用:預估使用時間(小時):500/83 = 約 6小時。
  • 放著不用:預估使用時間(小時):500/0.39 = 1282 小時,約 53 天。

須注意若放電 C 數超過 0.2,續航力可能就要大打折扣,因為一般的電池容量是以 0.2C 放電下去估算的,本次的最高功耗為 83 mA 並未超過 0.2C(100 mA)。

實際使用

完成上述的組裝與設定後,就讓我們來看看實際使用的狀態吧!

圖 31. 開機畫面

將我們自製的心率血氧機與市售的血氧機做比對,可以發現準確度相當地高,是不是瞬間覺得很有成就感呢?

圖 32. 與市售血氧機比對結果

小結

以上就是我們這次的 ESP32 專題系列-心率血氧機,我們從硬體、組裝到研究心率血氧量測原理,並且透過多個流程處理讀取到的原始數據,讓數據更加穩定且具有參考價值,最後也研究各個元件的功耗以評估續航力,有機會的話我們會新增其他特殊功能,讓我們的自製血氧機能更符合生活需求,本次的 ESP32 專題分享就到這邊,我們下次見~

(本文經同意轉載自CIRCUS Pi原文連結;責任編輯:謝涵如)

CIRCUS Pi

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: CIRCUS Pi

分享有趣的創作與教學,提供Maker們創作的軍火庫,DIY 零件 | 套件| 工具,官網連結

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *