運動、走路、工作等不同情境下,你的心率是否處於正常範圍?透過心率監測器,就能達到自我生理狀況的簡易判讀(提醒大家:精準量測仍需透過核可醫療器材)。市面上的智能手環廠牌不僅多,也能看見許多實測評比文章,不過多半都沒有個最優品牌定論,也意味著這塊領域目前仍在努力發展中。話雖如此,我們依舊能自製心率偵測器,作為日常監測裝置使用。

此次使用超小型MCU Arduino Micro、AM7020以及Pulse Sensor心率感測器實作一個NBIoT心率監測器;將記錄10分鐘內每分鐘心率資料,並取最大、最小、中位數,用以判斷心率狀態。

 

所需材料

  • Arduino Micro

  • AM7020(含SIM Card、天線)

  • Pulse Sensor(心率感測器)

  • 杜邦線數條

 

Arduino Micro

Arduino Micro是一塊超小型開發版,MCU為ATmega32U4,相較UNO來說不僅體積更小,Debug Serial更升級為原生USB介面;如此一來便有一組HW UART空出來,對於需要使用HW UART的Project非常有幫助。Arduino Micro 的SRAM為2.5KB,相比UNO多出0.5KB。

 

AM7020

AM7020是一款NBIoT模組,模組本身支援HTTP(S)、MQTT(S)、TLS等多項Protocol,加上專屬AM7020的Arduino Library,讓使用門檻大大降低,對初學者相當親切的一款模組。

 

Pulse Sensor(心率感測器)

Pulse Sensor為一款非侵入式的心率感測器,利用發射綠光LED並接收反射訊號來取得對應波型;當心臟透過身體泵送血液時,每次跳動都會產生一個脈搏波(有點像衝擊波),脈搏波會沿著動脈傳播到毛細管組織的最末端,感測器進而計算出心率。 

 

架構

使用Arduino Micro作為主體,並使用Analog讀取Pulse Sensor電壓數值;用Hardware Uart與AM7020溝通,AM7020則使用MQTT Protocol將心率定時上傳至Adafruit IO。

 

步驟

  1. 設定Adafruit IO

  2. 硬體配置

  3. 程式設計

 

1.設定Adafruit IO

我們需要為Adafruit IO平台建立一個Group及三個Feed,用來存放10分鐘內心率最大值、中位數、最小值,使用此方法可以很容易判斷目前心率趨勢;Group名稱為「pulseSensor」,Feed名稱依序為「max-hr」、「mid-hr」、「min-hr」(若對AdafruitIO設定還不熟悉可參考5步驟輕鬆上手Adafruit IO平台!)。

 

接下來需要為Adafruit IO平台建立一個Dashboard,將心率資料以折線圖方式呈現,Dashboard名稱設定為「pulseSensor」。

 

新增一個折線圖(圖形種類選擇Line Chart),並同時選擇三個Feed,這將會使四個資料同時顯示再同一個折線圖表上。

 

Block設定頁面如上圖所示,分別設定XY軸最大、最小值及小數點位數,並啟用網格顯示。

 

2.硬體配置

Arduino Micro

AM7020

Pulse Sensor

5V

V

V

GND

G

GND

TX

R

-

RX

T

-

4

EN

-

A0

-

S

 

3.程式架構說明

程式碼請參閱Github( https://github.com/JiekangHuang/iot_pulseSensor )

程式會使用到以下三個Library,請先去Github上下載下來放到Arduino Library資料夾底下。

 

整體通訊上我們使用MQTT與Adafruit IO溝通;通訊架構上我們分為兩層,由上到下分別為MQTT、TCP,每層架構獨自完成各自工作後再將結過傳送至下層,最終由AM7020發送到Adafruit IO。

 

重點程式碼說明

檔名iot_pulseSensor.ino

  • Line 25~30:建立MQTT通訊架構(分層架構)

  • Line 50:初始化pulseSensor

  • Line 60:NBIoT連線

  • Line 62:設定MQTT KeepAlive

  • Line 72:檢查是否有心率

  • Line 74:讀取Pulse Sensor心率

  • Line 78~81:紀錄每分鐘心率

  • Line 83~93:檢查MQTT連線狀態

  • Line 94~100:排序資料、發布資料

檔名config.h

  • Line 45~46:MQTT Broker username、password(請修改為自己的Adafruit IO帳號密碼)

 

成品

將手指緊貼在Pulse Sensor感測器上(或使用魔鬼氈,以適當緊度將感測器與手指綁在一起,別綁過緊或過鬆,都可能影響數值準確性);完成以上步驟後即可在Adafruit IO Dashboard上看到心率最大值、中位數及最小值。從這些數值中可以簡易分析出一些特徵,例如當三個數值持續上升表示可能當時正在運動、只有「最大值」突然上升則可能表示突然被嚇到等等,細分出心率的三種數值較容易判別心率趨勢及狀態。

 

小結

結合超小型微控制器Arduino Micro、Pulse Sensor及AM7020,即可自製小型心率監測器;將監測器握在手上,雖然沒有市售手環便利,但仍可作為戶外運動的檢測裝置(真是名副其實的「土炮」NBIoT心率監測器!)。

市面上許多心率監測裝置多半也標榜數值僅供參考,尤其配戴時激烈運動便很難穩定地偵測到數據;若是對這類型設備有興趣的夥伴,可以先土炮自製、體驗看看,未必需要立即購入高昂的單品。對NBIoT有興趣的朋友,可以在網站內看更多結合NBIoT的實作分享文,從空品偵測器、氣象觀測站到入侵警報系統,歡迎分享給親友一齊入坑。