心跳感測模組實驗:Arduino 入門醫療科技應用

心跳脈搏脈衝感測器套件 Arduino Pulse sensor

心跳感測模組實驗:Arduino 入門醫療科技應用

午休結束的生物課,老師讓同學把食指放在小小的感測頭上,幾秒後螢幕出現一條起伏的曲線。那不是擺設,而是每個人當下的心跳訊號。从智慧手环到临床监护,心率监测早已走入日常;而对学习者来说,只要一块 Arduino Uno 和一颗心跳感测模组,就能把「生命征象」化成能分析与应用的资料。

這篇文章會帶你做到什麼?

  • 了解兩類常用心跳感測器:類比式 Pulse Sensor、I²C 介面的 MAX30100
  • 完成 Arduino 讀值與即時監看,並給出可用的程式碼
  • 知道何時該選進階的 MAX30101/MAX32664 模組,以及常見問題與校正重點

感測原理,用白話說清楚:

多數心跳模組採用 PPG(光體積描記法)。發光元件照到手指(或耳垂),血液因心臟收縮與舒張而改變吸光量,回到感光元件的光強度就會呈現週期性的起伏,轉成電訊號後,便可計算心率(BPM)。

選哪一顆?依專案分級:

  • 入門與課堂展示:Pulse Sensor(類比輸出,接 A0 就能看波形)
  • 入門+想要心率/血氧數值:GY-MAX30100(I²C,搭配程式庫可算 HR/SpO₂)
  • 進階研究或更穩定算法:MAX30101 / MAX32664(Qwiic/SparkFun 板,演算法更完整)

提示:本文程式碼示範 Pulse SensorMAX30100;MAX30101/MAX32664 建議依供應商程式庫範例實作。

硬體接線:

Pulse Sensor(類比)

  • VCC → 5V 或 3.3V(依模組標示)
  • GND → GND
  • SIGNAL → A0(Arduino 類比輸入)

GY-MAX30100(I²C)

  • VIN → 3.3V(多數板可 3.3V;若標示可 5V 再接 5V)
  • GND → GND
  • SDA → A4(UNO)/ 21(ESP32)
  • SCL → A5(UNO)/ 22(ESP32)

程式碼範例:先看得到,再談計算

1)Pulse Sensor:先把波形讀出來(Arduino UNO)


// 讀取 Pulse Sensor 類比波形並輸出到序列監視器
const int SENSOR_PIN = A0;
void setup() {
 Serial.begin(9600);
}
void loop() {
 int v = analogRead(SENSOR_PIN);
 Serial.println(v);   // 在序列監視器用「繪圖」查看波形
 delay(10);           // 取樣間隔約 100 Hz
}
 

想要直接得到 BPM,建議安裝 PulseSensor 官方 PulseSensor Playground 程式庫,內含去雜訊與峰值偵測邏輯,比自行手刻更穩定。

2)GY-MAX30100:以程式庫計算 HR/SpO₂

安裝 MAX30100 專用程式庫(常見名稱:MAX30100_PulseOximeter)。以下為常用的穩定範例,能每秒輸出心率與血氧:


#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected() {
 Serial.println("Beat!");
}
void setup() {
 Serial.begin(115200);
 Wire.begin();
 if (!pox.begin()) {
   Serial.println("MAX30100 init FAILED");
   while (1); // 停在這裡方便排錯(接線/電源)
 }
 // 視板子/手指狀況可調整 LED 電流,過大會飽和、過小雜訊高
 pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
 pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop() {
 pox.update(); // 必須持續呼叫以更新內部濾波與偵測
 if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
   Serial.print("HR: ");
   Serial.print(pox.getHeartRate(), 0);
   Serial.print(" bpm    SpO2: ");
   Serial.print(pox.getSpO2(), 0);
   Serial.println(" %");
   tsLastReport = millis();
 }
}
 

若數值不穩定,檢查電源是否雜訊大(改用 3.3V、加電源去耦),並嘗試不同 LED 電流或更穩定的手指姿勢。

實驗步驟與觀察

  • 先用 Pulse Sensor 看波形有無規律起伏;若雜訊高,放穩手指、避開強光。
  • 改用 MAX30100 程式庫,觀察每秒輸出的 HR/SpO₂ 是否在合理範圍。
  • 做一次「前後對照」:安靜坐著 2 分鐘量測,再做 20 次深蹲後量測,觀察 HR 的變化。

常見問題與校正建議

  • 波形亂跳:降低環境光、穩定手部、加上移動平均或低通濾波。
  • BPM 偏低/偏高:Pulse Sensor 請用官方程式庫;MAX30100 調整 LED 電流、確認 I²C 連線與取樣率。
  • 不同人體差異:血流弱、手指溫度低都會影響反射光;可改量耳垂或換手指。

何時改用 MAX30101 / MAX32664?

若你的專題需要更穩定演算法、更多參數(如 HRV)或長期連續記錄,推薦改用 MAX30101/MAX32664 的模組。它們的優勢在於光學路徑與演算法設計更成熟,適合研究或長照情境。不過請記得:這些仍屬開發與教學用途,非醫療認證設備。

把專題做漂亮:三個實作方向

  • 即時可視化:用 Arduino 串 OLED/LCD 顯示 HR 與波形
  • IoT 上雲:ESP32 透過 Wi-Fi 把心率資料送到雲端平台(MQTT/ThingSpeak)
  • 安全提示:心率超出門檻時,蜂鳴器/LED 提醒,並推播到手機

把手指放上感測頭,看著波形與數字同步跳動,是學習醫療科技的最佳起點。Pulse Sensor 讓你立刻看到訊號,MAX30100 協助你取得 HR/SpO₂,而 MAX30101/MAX32664 則支援更進階的研究需求。從這個小專案開始,你就能把「生理訊號」連上 Arduino、資料與應用,做出真正有價值的健康科技作品。

特別提醒:

1. MAX30100 與 MAX30102/01 差異

• MAX30100 已算舊款,部分使用者反應血氧數值不太穩。
• 對「血氧精準度」要求高的讀者,建議用 MAX30101 或 MAX30102。

2. Pulse Sensor 精度

• Pulse Sensor 本身容易受到雜訊干擾,用官方 Library,比較穩定。
• 在科展/專題時,建議加 RC 濾波器或用 Arduino 的 Moving Average。

延伸閱讀:為您的專案挑選最佳「心」: