學習目標
- ✓理解光學感測器以反射光變化觀察脈搏的概念。
- ✓使用固定 0x57 位址初始化並更新 MAX30101。
- ✓比較紅光、紅外線、綠光原始值與晶片溫度。
SENSOR / MAX30101
MAX30101 以 I2C 輸出紅光、紅外線、綠光與晶片溫度的原始資料。本課先把它當成光學資料感測器,練習手指遮光、更新資料與比較不同 LED 通道,不直接宣稱醫療量測結果。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
MAX30101 內含多色 LED 與光電接收器。手指放上去後,紅光、紅外線與綠光通道會收到隨時間變化的反射訊號;原始值要先濾波與校準,不能直接當作醫療數值。
接妥 3.3V、GND、SDA、SCL,位址固定為 0x57。
由 MAX3010x 函式庫設定 LED 與取樣參數。
以固定壓力放置手指,觀察紅光與紅外線原始值。
原始 count 不是心率或血氧;要做可靠估算必須進行訊號處理、校準與驗證。
MAX30101 使用 I2C;供電與邏輯電平請以所用 breakout 的規格為準。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC/VIN | 依模組規格 | 電源 | 確認模組是否接受 UNO 的 5V。 |
| GND | GND | 地線 | I2C 裝置要共地。 |
| SDA | A4 / SDA | I2C 資料 | UNO SDA。 |
| SCL | A5 / SCL | I2C 時脈 | UNO SCL。 |
已將 4 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
playrobot_max30101_setup設定 I2C 位址 0x57 並啟動感測器。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_update讀取一筆新的感測資料。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_red讀取紅光 LED 通道。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_ir讀取紅外線 LED 通道。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_green讀取綠光 LED 通道。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_temperature讀取感測晶片內部溫度。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧playrobot_max30101_initialized確認初始化是否成功。
位置:感測器 → 生醫感測器 → MAX30101 光學/心率血氧每次更新資料後列印紅光與紅外線原始值,觀察手指放上與移開的差異。
playrobot_max30101_setuparduino_delayplayrobot_max30101_updateplayrobot_max30101_redarduino_serial_printplayrobot_max30101_setuparduino_delayplayrobot_max30101_updateplayrobot_max30101_redarduino_serial_print不放手指,記錄紅光與紅外線值。
為什麼:了解背景光與感測器零點。輕放指尖,不要壓迫或晃動。
為什麼:壓力與移動都會改變反射光。列印 red、ir、green 三組原始資料。
為什麼:不同波長對皮膚與血流的反應不同。playrobot_max30101_setup:設定 I2C 位址 0x57 並啟動感測器。
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 手指放上感測器 | 原始值出現變化 | 光路由環境光轉為皮膚反射光。 |
| 手指晃動 | 數值波動變大 | 動作雜訊會影響光學量測。 |
這段程式把「MAX30101 光學/心率感測器」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <Wire.h>
#include <MAX30105.h>
MAX30105 sensor;
void setup() {
Serial.begin(115200);
Wire.begin();
if (sensor.begin(Wire, I2C_SPEED_STANDARD, 0x57)) sensor.setup();
}
void loop() {
sensor.check();
Serial.print(sensor.getRed());
Serial.print(",");
Serial.println(sensor.getIR());
delay(100);
}#include <Wire.h>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 playrobot_max30101_setup 就算接線正確也無法使用。
// VCC/VIN → 依模組規格、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL本頁接線是 VCC/VIN → 依模組規格、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 MAX30101 初始化。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (sensor.begin(Wire, I2C_SPEED_STANDARD, 0x57)) sensor.setup();先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認 0x57、供電與 SDA/SCL。
處理方式:使用 I2C 掃描器,並依模組規格改用 3.3V。
先檢查:手指是否壓太緊或 LED 電流過高。
處理方式:先輕放指尖,調整函式庫的 LED 電流與取樣設定。
先檢查:手指是否移動、環境光是否直射。
處理方式:固定模組與手指,並遮蔽強烈環境光。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:把 red 與 ir 每 100 ms 列印到序列埠。
這題要延伸「MAX30101 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:比較輕放與用力按壓時的波動。
這題要延伸「MAX30101 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:把資料送到序列繪圖器觀察週期變化。
這題要延伸「MAX30101 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
確認紅光、紅外線、綠光 LED 與光電接收架構。
確認 setup、update、red、ir、green、temperature 積木。