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

ESP32 專題(一) 智慧生醫 - 心率血氧機

一、前言

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

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

此次主要目標就是從無到有動手製作一台「自製指尖心率血氧機」,完成後除了拿來自用,也可以從中順手研究心血氧的量測方式及原理,甚至能進一步增加市面上大部分血氧機沒有的功能(例如長期雲端統計,連動 Line、Email、APP 在數值超標即時發送緊急通知等),結合各種 idea 打造專屬自己的心率血氧機。

免責聲明

本專案僅用於教育目的,不用於醫療用途,使用它需要自行承擔風險。
CIRCUS Pi 心率血氧機展示

二、事前準備

1. 所需材料

  1. TTGO T-Display ESP32 CH9102 WiFi 模組(16MB) x 1
  2. MAX30100 血氧感測器模組(內附 Grove 線)x 1
  3. 聚合物鋰電池-500mAh 3.7V x 1
  4. 強力雙面膠 3cm x 2
  5. 束線帶 x 2
  6. 寬型橡皮筋 x 2
  7. USB 3.0 Type-C 傳輸線 1M

2. 所需工具

  1. 烙鐵
  2. 剝線鉗

3. 所需軟體

  1. Arduino IDE 1.8.16 或更高版本。

三、硬體介紹

1. TTGO T-Display開發板

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 1. TTGO T-Display 開發板

2. MAX30100 心血氧感測器模組

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 2. M5Stack MAX30100 心血氧模組

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

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 3. 502535 500mah 3.7V 鋰電池

四、組裝說明

1. 硬體架構圖

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 4. 硬體架構圖

2. 硬體接線表

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

TTGO開發板MAX30100
3V5V
GNDGND
21(SDA)SDA(黃)
22(SCL)SCL(白)
表1. 硬體接線表

3. 組裝過程

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

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 5. 剪裁 Grove 線

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 6. MAX30100與TTGO連接

3. 將鋰電池接上 TTGO 開發板,完成後如圖 7 所示。

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

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

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

五、原理說明

1. PPG 訊號

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 9. PPG量測方式(圖片來源

2. 偵測方式

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 10. 常見的偵測方式(圖片來源

偵測注意事項

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

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

圖 11 是 PPG 訊號中的「直流」和「交流」分量,直流分量檢測組織、骨骼和肌肉反射的光訊號,以及動脈和靜脈血液的平均血容量,

交流分量則表示心動週期的收縮期和舒張期之間發生的血容量變化,藉由連續量測交流分量的收縮峰值時間就可求得瞬時心率。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 11. PPG AC、DC分量

4. 血氧(SpO2)量測

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 12. 紅血球的工作

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

圖 13. 血管示意圖

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 14. 氧合血紅蛋白與脫氧血紅蛋白

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 15. 血紅蛋白的百分比

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

ESP32 專題(一) 智慧生醫 - 心率血氧機

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

ESP32 專題(一) 智慧生醫 - 心率血氧機

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

ESP32 專題(一) 智慧生醫 - 心率血氧機

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 16. 大量受試者測試後 SaO2 與 R 值的關係

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

1. 安裝 Library

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

● 從 Arduino Library Manager 安裝

● 從 Github 安裝

● 範例程式碼

透過連結下載本次製作所使用的所有程式碼

修改 TFT_eSPI Library

TFT_eSPI Library 是一款支援多種 TFT 及開發板的 Library,但因每種開發板 IO規劃不同,用在 TTGO 開發板上需要修改設定檔;打開 TFT_eSPI/User_Setup_Select.h,將 22 行註解,將 53 行取消註解,完成後如圖 17,若覺得麻煩可直接下載已經打包好的 Library 壓縮檔 Pulse_Oximeter_libraries.zip。

圖 17. 修改TFT_eSPI Library

2. 上傳圖片

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 18. 程式中所需的圖片檔案

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 19. 使用 Arduino IDE 上傳圖片

上傳成功如圖 20。

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 20. 成功上傳圖片到 SPIFFS

3. 編譯並燒錄主程式

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

ESP32 專題(一) 智慧生醫 - 心率血氧機
圖 21 編譯並燒錄主程式 TTGO_MAX30100.ino