ヘルスバンド:高齢者を見守る信頼のスマートウェアラブルアシスタント
部品と材料
| Infineon DPS310 気圧センサー | ×1 |
| Arduino Nano R3 | ×1 |
| Espressif ESP8266 ESP-01 | ×1 |
| ジャンパーワイヤー(汎用) | ×1 |
| 3.7V LiPoバッテリー | ×1 |
必要な工具と機械
- はんだごて(汎用)
アプリとオンラインサービス
- Arduino IDE
- Blynk
プロジェクト概要
大切な人が高齢で一人暮らし? 心配はいりません。InfineonのDPS310気圧センサーを使用して、腕に装着するバンド型のバーチャルアシスタントを開発しました。これが時間のかかる見守りの仕事を引き受け、愛する人を安全な手の中に置きます!
「高齢者は現在、米国人口の約14.5%を占め、2030年までには約7400万人の高齢者がいると予測されています。医療費が高騰し、医療機関が適切なケアを提供するプレッシャーにさらされる中、高齢者の健康管理のための新しいソリューションが不可欠です。」
衝撃的な数字を調べて知った後、これが私たちの高齢者を助ける試みです!
ストーリー
数年前から祖母がアルツハイマー病の初期症状に苦しんでおり、残念ながら症状は悪化しています。これにより以下のような予期せぬ問題が生じました:
- 仕事に行こうとして徘徊する(医師に止められているのに)
- 食事を抜いたり、時には二度食べたりする
- 運動をしない
これらはすべて記憶力の低下と、自身の状態への無自覚さが原因です。
これにより母親がほぼ毎日、週7日、一日中付き添う必要がありました。この作業は非常に疲れるもので、時間もかかります。そこで、祖母の行動と活動を監視し、緊急時には家族に警告するバーチャルアシスタントを作るアイデアが生まれました。母親に休息を与え、同時に患者を安全に見守ることができます!
システムのコンポーネント / コンセプト
このシステムは主にアルツハイマー患者の問題に焦点を当てていますが、すべての高齢者が日常生活の障害を自立して乗り越えられるよう、多くの他のシステムも組み込んでいます。
Infineon気圧センサーの主な特徴の一つはそのサイズです! これが主要コンポーネントをポータブルで超汎用性の高いものにしています。システムの中心にはArduino Nanoがあり、I2CバスでDPS310気圧センサーと接続されています。アクションと行動をコード化して患者の動きをシミュレートし、これらのグラフや値から患者の状態を判断し、緊急時には家族に警告します。生成されたデータはBlynkを使用した小さなアプリで表示されます。
このシステム全体をコンパクトで見栄えの良いウェアラブルバンドに統合し、テクノロジーを患者の生活にシームレスに溶け込ませます。
機能と能力
ヘルスバンドが分析・検出できる主な機能と動き:
転倒検知
研究によると、高齢者の最大の問題はバランスを崩して転倒することです。患者は無力で、しばらくしてからしか助けが来ません。ヘルスバンドなら気圧の急激な低下を検知して自動的に家族にメッセージを送信し、怪我の悪化を防ぎます。
運動促進
高齢者に運動や散歩をさせるのは難しいですが、健康維持には不可欠です。歩数や歩いた時間を表示することで、運動のモチベーションになると考えました。祖母の場合、医師から1日1000歩と指示されていますが、数を数えるのを忘れてしまいます。カウンターがあれば彼女の助けになります!
ヘルスバンドが「波」の動きを検知すると、患者が運動を始めたと判断します。山から山、または谷から谷へが1サイクル。歩数としてサイクル数をカウントし表示する、まさに万歩計です。
発熱検知
これはシンプルで、センサーが温度も出力します。腕に装着するバンドで患者のリアルタイム体温を取得。急激な上昇や低下を自動的にメッセージで家族に警告します。
状態表示
患者のリアルタイム状態を家族に伝えます。例えば、気圧変化がほとんどなければ患者は睡眠中と判断できます。
3つの状態:睡眠中、覚醒中、運動中。(この機能はまだ完璧ではなく、時々誤判定があります。今後さらに状態を追加予定)
回路
Infineonの強力なDPS310センサーはBluetoothでアプリと同期でき、センサーのリアルタイム視覚表現を生成します。便利でしたが、私たちのコンセプトには制限がありました。
センサーのデータストリームにアクセスするため、Arduino NanoをI2Cバスで接続。これによりデータを計算し、患者が置かれている様々なシナリオを推測可能になりました。
さらにArduinoをESP8266 WiFiモジュールに接続し、モバイルアプリと通信できるようにしました。
セットアップ
すべてをセットアップする前に、センサーにピンを追加する必要があります。7ピン×2本を切り出し、はんだ付けします。ブレッドボードを使うと楽です。
DPS310気圧センサー → Arduino Nano(I2C)
- センサー Pin 1 (SDA) → Arduino アナログピン 4 (A4)
- センサー Pin 2 (SCL) → Arduino アナログピン 5 (A5)
- センサー Pin 8 (GND) → Arduino GND
注意: センサーの向きは画像の通りにしてください。
Arduino Nano → ESP8266(WiFiモジュール)
- WiFiモジュール Pin 1 → Arduino デジタルピン 11
- WiFiモジュール Pin 2 → Arduino デジタルピン 10
- WiFiモジュール Pin 7 (GND) → Arduino GND
- WiFiモジュール Pin 8 (電源) → Arduino 3.3V
注意: モジュールの向きは画像の通りにしてください。
バンドの製作
すべてのコンポーネントが小さいため、手首にすっきり収まります。実際のバンド製作にはキャンバス地とフォームを使用してコンポーネントを埋め込み、ベルクロでストラップを作りました。
- フォームを手首の幅にカット
- 各種センサーを配置し、最終サイズをカット
- 角を丸めて見た目を整える
- フォームにピンを刺して(保護と固定)、電池を小さなスロットに埋め込む
- 裏返してはんだ付け(ピンが少し出ている状態)
- テストランで動作確認
- ベルクロストリップでストラップを作成
- キャンバス地で包み、ホットグルーで固定(きれいな仕上がりと感触)
3Dプリンターがないため、将来的にはすべてのコンポーネントに完璧なスロットを持つ3Dプリントモデルにアップグレード予定です!
***最終的な3Dプリントモデルが完成したら、写真とプリントファイルでこのプロジェクトを更新します***
各種アルゴリズムのコーディング
プログラミングを始める前に、以下のライブラリをインストールする必要があります:
- Wireライブラリ(通常プリインストール済み。Arduino NanoとDPS310の通信を担当) GitHub
- DPS310気圧センサーライブラリ GitHub
- Blynkライブラリ(Arduino NanoがBlynkクラウドと通信するため) GitHub
インストール手順:Arduino IDE → スケッチ → ライブラリをインクルード → .ZIP形式のライブラリを追加 → ダウンロードしたファイルを選択 → 開く。3つすべてで繰り返し。
トライアルコードをダウンロードしてコンパイルできるか確認。Arduino Nanoにアップロードし、シリアルモニタ(IDE右上のモニターアイコン)でライブデータが取得できるか確認。うまくいけばメインコードをアップロードし、アプリ構築へ進みます。
アプリの構築
インターネット接続には、Android Play StoreからダウンロードできるプレビルドプラットフォームBlynkを使用。リンク
Arduino IDEのファイル → スケッチ例 → Blynkリストに無数の使用例があります。
アプリでデータをユーザーフレンドリーに表示。マイクロコントローラーにArduino Nano、接続タイプにWiFiを選択。認証トークンがメールで届くのでコードに入力。
ウィジェットを追加:ゲージ(リアルタイム体温)、値表示(歩数カウンター)、LCD表示(現在の状態)。これらは基本ブロックで、他の特定ケース用にさらに機能追加可能。
結論:概ね成功!
いくつかのエラーと誤読がありました。ヘルスバンドで読み取った体温は36℃(手首温度)でしたが、医療用体温計では36.8℃(わき温度)。
歩数アルゴリズムは最初誤カウントでしたが、何度か修正してかなり正確になりました。状態機能も変数と条件を追加して改善中です。
最終的に再キャリブレーションで問題を修正し、ヘルスバンドは必要なデータを正常に収集できるようになりました。祖母がこの2週間アシスタントなしで過ごせ、バンドは素晴らしく機能しました!
転倒や発熱のメッセージは、該当する状況が発生していないため未テストですが、理論上は機能します。
これは素晴らしいプロジェクトで、比較的簡単に実装できます。このバンドが命を救い、高齢者を安全な手の中に置くことを願っています!
コード
データ生成テスト
ライブラリインストール後、このプログラムを実行して動作確認。シリアルモニタにライブデータストリームが表示されればOK。
#includevoid setup() { Serial.begin(9600); while (!Serial); ifxDps310.begin(Wire); // 注意:室温なのにDPS310が60℃前後を示す場合、ヒューズビットの問題の可能性 // ifxDps310.correctTemp(); // begin()直後に1度だけ呼ぶ int temp_mr = 2, temp_osr = 2, prs_mr = 2, prs_osr = 2; int ret = ifxDps310.startMeasureBothCont(temp_mr, temp_osr, prs_mr, prs_osr); if (ret != 0) { Serial.print("Init FAILED! ret = "); Serial.println(ret); } else { Serial.println("Init complete!"); } } void loop() { unsigned char pressureCount = 20; long int pressure[pressureCount]; unsigned char temperatureCount = 20; long int temperature[temperatureCount]; int ret = ifxDps310.getContResults(temperature, temperatureCount, pressure, pressureCount); if (ret != 0) { Serial.println("FAIL! ret = "); Serial.println(ret); } else { Serial.print(temperatureCount); Serial.println(" temperature values found:"); for (int i=0; i Blynkアプリ連携版ヘルスバンド
最終プログラム。いくつかの変数と閾値は手動で入力が必要。コメントに従って調整してください。Blynkアプリでウィジェットを設定すれば、あなたのアシスタントが動き出します!
#include#include #include #define BLYNK_PRINT Serial char auth[] = "YourAuthToken"; char ssid[] = "YourNetworkName"; char pass[] = "YourPassword"; const unsigned char pressureLength = 50; unsigned char pressureCount = 0; long int pressure[pressureLength]; unsigned char temperatureCount = 0; const unsigned char temperatureLength = 50; long int temperature[temperatureLength]; // これらの閾値は現在地によって変わる。沿岸部で平均気温34℃の環境で動作確認済み int pressureFallingThresh = 1; int pressureSleepingThresh = 4; int tempFeverThresh = 39; int pressureJogThresh = 5; void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, pass); while (!Serial); ifxDps310.begin(Wire); int ret = ifxDps310.setInterruptPolarity(1); ret = ifxDps310.setInterruptSources(1, 0, 0); ifxDps310.getIntStatusFifoFull(); int interruptPin = 3; pinMode(interruptPin, INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin), onFifoFull, RISING); int temp_mr = 3, temp_osr = 2, prs_mr = 1, prs_osr = 3; ret = ifxDps310.startMeasureBothCont(temp_mr, temp_osr, prs_mr, prs_osr); if (ret != 0) { Serial.print("Init FAILED! ret = "); Serial.println(ret); } else { Serial.println("Init complete!"); } } void loop() { Blynk.run(); Serial.println("loop running"); delay(500); if (pressureCount == pressureLength && temperatureCount == temperatureLength) { Serial.print(temperatureCount); Serial.println(" temperature values found:"); for (int i=0; i tempFeverThresh) feverEmail(); Serial.println(" degrees of Celsius"); } Serial.print(pressureCount); Serial.println(" pressure values found:"); for (int i=0; i 回路図
回路図画像を参照してください。
製造プロセス
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoで地球の質量を測定:ステップバイステップDIYガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- 手動バンドソー:あらゆるプロジェクトに対応する耐久・携帯性に優れた切断ソリューション
- ハードウェア非依存ソフトウェア:スマートファクトリーへの鍵となるメリット
- スマート製造におけるROI最大化:投資回収とデータドリブンな成功
- スマート家電設計者が知っておくべきIEC電源規格