スマート健康モニタリングステーション:Arduino、Bluetooth、センサーで構築
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | メインマイコンボード |
| ジャンパーワイヤー(汎用) | 1セット | 配線用 |
| DHT11 温度・湿度センサー(3ピン) | 1 | 環境温度と湿度を測定 |
| 温度センサー(DS18B20等) | 1 | 防水プローブタイプ推奨 |
| 抵抗 10kΩ | 2 | プルアップ用 |
| HC-05 Bluetoothモジュール | 1 | スマホとの無線通信用 |
| 心拍センサー | 1 | 指先で心拍数を測定 |
使用するアプリとオンラインサービス
- MIT App Inventor 2 - Androidアプリ開発(ノーコード)
- Arduino IDE - スケッチの書き込み・デバッグ
プロジェクト概要
複数のセンサーとBluetooth通信、スマートフォンアプリを組み合わせ、体温・心拍数・環境温湿度をリアルタイムでモニタリングする健康管理ステーションを構築します。Arduino UNOを中核に、DHT11で環境温湿度、DS18B20で体表温度、光学式心拍センサーで心拍数を取得し、HC-05経由でスマホアプリにデータを送信します。アプリ側では数値表示やグラフ化、閾値超過時のアラート機能を実装可能です。
配線と回路図
各センサーとモジュールを以下のように接続します:
- DHT11: データピン → デジタルピン7、VCC → 5V、GND → GND
- DS18B20: データピン → デジタルピン2(4.7kΩプルアップ)、VCC → 5V、GND → GND
- 心拍センサー: 信号ピン → アナログピンA0、VCC → 5V、GND → GND
- HC-05: TX → デジタルピン10(SoftwareSerial RX)、RX → デジタルピン9(SoftwareSerial TX、分圧必要)、VCC → 5V、GND → GND
詳細な配線図はプロジェクトページのSchematicsセクションを参照してください。
Arduinoスケッチ
以下のコードをArduino IDEでコンパイル・書き込みしてください。心拍検出には割り込みベースのアルゴリズムを使用し、2ms周期で信号をサンプリングしてBPMを算出します。
#include <SoftwareSerial.h>
#include <cactus_io_AM2302.h>
#define AM2302_PIN 7
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
AM2302 dht(AM2302_PIN);
SoftwareSerial Bluetooth(10, 9); // RX, TX
String Data;
int pulsePin = 0;
int blinkPin = 13;
volatile int BPM;
volatile int Signal;
volatile int IBI = 600;
volatile boolean Pulse = false;
volatile boolean QS = false;
volatile int rate[10];
volatile unsigned long sampleCounter = 0;
volatile unsigned long lastBeatTime = 0;
volatile int P = 512;
volatile int T = 512;
volatile int thresh = 512;
volatile int amp = 100;
volatile boolean firstBeat = true;
volatile boolean secondBeat = false;
void interruptSetup() {
TCCR2A = 0x02;
TCCR2B = 0x06;
OCR2A = 0X7C;
TIMSK2 = 0x02;
sei();
}
ISR(TIMER2_COMPA_vect) {
cli();
Signal = analogRead(pulsePin);
sampleCounter += 2;
int N = sampleCounter - lastBeatTime;
if (Signal < thresh && N > (IBI / 5) * 3) {
if (Signal < T) { T = Signal; }
}
if (Signal > thresh && Signal > P) { P = Signal; }
if (N > 250) {
if ((Signal > thresh) && (Pulse == false) && (N > (IBI / 5) * 3)) {
Pulse = true;
digitalWrite(blinkPin, HIGH);
IBI = sampleCounter - lastBeatTime;
lastBeatTime = sampleCounter;
if (secondBeat) {
secondBeat = false;
for (int i = 0; i <= 9; i++) { rate[i] = IBI; }
}
if (firstBeat) {
firstBeat = false;
secondBeat = true;
sei();
return;
}
word runningTotal = 0;
for (int i = 0; i <= 8; i++) {
rate[i] = rate[i + 1];
runningTotal += rate[i];
}
rate[9] = IBI;
runningTotal += rate[9];
runningTotal /= 10;
BPM = 60000 / runningTotal;
QS = true;
}
}
if (Signal < thresh && Pulse == true) {
digitalWrite(blinkPin, LOW);
Pulse = false;
amp = P - T;
thresh = amp / 2 + T;
P = thresh;
T = thresh;
}
if (N > 2500) {
thresh = 512;
P = 512;
T = 512;
lastBeatTime = sampleCounter;
firstBeat = true;
secondBeat = false;
}
sei();
}
void setup() {
Bluetooth.begin(9600);
Serial.begin(9600);
dht.begin();
sensors.begin();
interruptSetup();
}
void loop() {
sensors.requestTemperatures();
dht.readHumidity();
dht.readTemperature();
if (isnan(dht.humidity) || isnan(dht.temperature_C)) { return; }
if (QS == true) {
Serial.print(sensors.getTempCByIndex(0));
Serial.print(" ");
Serial.print(dht.temperature_C);
Serial.print(" ");
Serial.print(dht.humidity);
Serial.print(" ");
Serial.println(BPM);
Bluetooth.print(sensors.getTempCByIndex(0));
Bluetooth.print(" ");
Bluetooth.print(dht.temperature_C);
Bluetooth.print(" ");
Bluetooth.print(dht.humidity);
Bluetooth.print(" ");
Bluetooth.println(BPM);
QS = false;
}
delay(1500);
}
スマートフォンアプリの作成(MIT App Inventor 2)
- App InventorにGoogleアカウントでログイン
- 新規プロジェクト「HealthMonitor」を作成
- デザイナー画面で以下のコンポーネントを配置:
- ListPicker(Bluetoothデバイス選択用)
- Label ×4(体温、環境温度、湿度、心拍数表示用)
- BluetoothClient(非表示コンポーネント)
- Clock(データ受信ポーリング用、タイマー間隔1000ms)
- ブロックエディターで以下のロジックを構築:
- ListPicker.BeforePicking → BluetoothClient.AddressesAndNamesを設定
- ListPicker.AfterPicking → BluetoothClient.Connectで接続
- Clock.Timer → BluetoothClient.ReceiveTextでデータ受信、スペース区切りで分割し各Labelに表示
- 「Build」→「App (save .apk to my computer)」でAPKを生成・インストール
動作確認とトラブルシューティング
- シリアルモニタ(9600bps)で「体温 環境温度 湿度 心拍数」がスペース区切りで出力されることを確認
- 心拍センサーは指先を軽く当て、動かさないように固定すると安定します
- HC-05のRXラインは必ず分圧(1kΩ+2kΩ等)して3.3Vレベルにしてください
- Bluetooth接続が不安定な場合、モジュールの電源をArduino 5Vから独立させると改善することがあります
拡張アイデア
- データをGoogleスプレッドシートやFirebaseに蓄積し、長期トレンドを可視化
- 閾値超過時にLINE Notifyやメールでアラート通知
- バッテリー駆動化し、ウェアラブルデバイスとして小型化
- SpO2センサー(MAX30100/30102)を追加し、血中酸素濃度も測定
参考リンク
- GitHubリポジトリ: Tutorials-for-arduino
- DHT11ライブラリ: Adafruit DHT Sensor Library
- OneWire / DallasTemperature: Arduino Temperature Control Library
製造プロセス
- 新A6630温度モジュール、CSI 6500機械健全性モニターに振動・温度の統合洞察を追加
- 5ドルI2C温度センサーで作るRaspberry Pi温度ロガー
- Raspberry PiとDS18B20によるプロフェッショナルな温度監視
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
- Raspberry Piでサーバークローゼットの温度を正確に監視
- Raspberry PiとDS18B20でマルチセンサー温度・光監視システムを構築
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- 高精度ベアリング温度センサー:正確な検知と監視
- DS18B20温度センサー:産業・コンシューマー向け高精度1-Wireデジタル温度計
- 自己加熱機能搭載ウェアラブルガスセンサーで高精度な健康・環境監視を実現