Arduinoで血中酸素濃度と体温を同時監視するデュアルセンサーシステム
必要な部品と用品
| Arduino UNO | ×1 |
| 20×4 I2C LCDディスプレイ | ×1 |
| MAX30102 心拍・酸素飽和度センサー | ×1 |
| LED(赤・緑) | 各1 |
| 220Ω抵抗 | ×2 |
| GY-906-BCC 非接触赤外線温度センサー(MLX90614) | ×1 |
| ブレッドボード(830穴) | ×1 |
プロジェクトについて
このプロジェクトは、血中酸素濃度(SpO₂)と体温を同時に測定し、設定閾値(SpO₂ 90%未満 または 体温 37℃超)を下回る/超えると赤色LEDで警告、正常なら緑色LEDで表示します。
重要な使用上の注意
- MAX30102センサーには指を自然に置くだけで測定します。強く押し付けると血流が妨げられ、正確な値が得られません。
- 測定値が安定するまで数秒待つ必要があります。
- 前回の測定値(SpO₂と体温)はEEPROMに保存され、次回起動時にLCD下部に表示されます。
ハードウェア構成
- MAX30102: I2C接続(A4=SDA, A5=SCL)。赤色・赤外線LEDとフォトダイオードを内蔵し、反射光から脈波とSpO₂を算出。
- MLX90614 (GY-906): I2C接続。非接触で物体表面温度(額や指先)を測定。
- I2C LCD (0x27, 20×4): 測定値とステータスを表示。
- LED表示: 緑=正常、赤=要注意(閾値超過)。
ソフトウェアのポイント
- SparkFun MAX3010xライブラリとAdafruit MLX90614ライブラリを使用。
- SpO₂算出は、赤/赤外線のAC/DC成分比(R値)から経験式
SpO₂ = -23.3 × (R - 0.4) + 100で求め、ローパスフィルタで平滑化。 - 指検出判定: 赤色LED反射光が閾値(30,000カウント)未満なら「指なし」とみなし、前回値を表示。
- 測定安定判定: 同一値が2.5秒継続したら確定とし、ブザー音(成功音)を鳴らす仕組みも実装可能。
ソースコード(主要部分)
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <EEPROM.h>
#include "MAX30105.h"
MAX30105 particleSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#define GREEN_LED 8
#define RED_LED 9
#define FINGER_ON_THRESHOLD 30000
#define SPO2_ALERT_THRESHOLD 90
#define TEMP_ALERT_THRESHOLD 37.0
float ESpO2 = 85.0; // 推定SpO₂初期値
float FSpO2 = 0.7; // フィルタ係数
int Temperature = 0;
void setup() {
Serial.begin(115200);
lcd.init(); lcd.backlight();
lcd.setCursor(3,1); lcd.print("Running......"); delay(3000); lcd.clear();
// EEPROMから前回値を復元
ESpO2 = readEEPROM_float(0);
Temperature = EEPROM.read(6);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
// MAX30102初期化
while (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 not found!");
delay(1000);
}
particleSensor.setup(0x7F, 4, 2, 200, 411, 16384); // 高精度・長距離モード
particleSensor.enableDIETEMPRDY();
mlx.begin();
}
void loop() {
// FIFOから赤/IRデータを取得し、AC/DC成分を計算
// 100サンプルごとにSpO₂を算出・フィルタリング
// 指検出時: MLX90614で体温取得、LCD表示、LED制御
// 指非検出時: 前回値をLCD表示
}
float readEEPROM_float(int addr) { ... }
void writeEEPROM_float(int addr, float val) { ... }
回路図
I2CバスにMAX30102、MLX90614、LCDを並列接続。各デバイスのVCC=5V(または3.3V)、GND共通。SDA=A4、SCL=A5に2×10kΩプルアップ抵抗。LEDはD8/D9に各220Ω抵抗を直列接続。
GitHubリポジトリ
完全なコードと回路図: https://github.com/DKARDU/bloodoxygen
製造プロセス
- Raspberry Pi & HDC2010:I2C温湿度センサー完全セットアップガイド
- 5ドルI2C温度センサーで作るRaspberry Pi温度ロガー
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Raspberry PiとDS18B20でマルチセンサー温度・光監視システムを構築
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- 湿度センサーの検証とキャリブレーションで精密測定を実現
- Raspberry Pi と Arduino を連携させてロボットを自作:ステップバイステップガイド
- SolidWorksでプログレッシブカットアウェイアニメーションを作成: ステップバイステップチュートリアル
- 高精度ベアリング温度センサー:正確な検知と監視
- DS18B20温度センサー:産業・コンシューマー向け高精度1-Wireデジタル温度計
- ガラス繊維製造の完全ガイド