查看所有文章
心跳感測模組實驗: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 Sensor 與 MAX30100;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。
