半田ごてを握ったら書くブログ 2nd

半田ごてを握ったら書くブログの続きです。

体温を測りたいのさ!

動機

最近、時々何日間にもわたって微熱が続くことがあって、なんだか自分の健康に自信が持てなくってきている。身体が怠くなってきてから体温計で測ってみると、38℃台なんてことがあった。
そんなことになってるので、自分の体温のモニタリングに興味が湧いたので、簡易なものを作ってみることにした。

実験

温度を測るということで、家にLM61BIZという温度センサがあったので利用できるかなと3つ並べて同時に計測してみた。仕様範囲内(±2℃)とはいえ、結構な計測値のばらつきがでたので、こいつの利用は断念。

そこでご家庭用体温計のことをネットでいろいろ調べたところ、センサにはNTCサーミスタなるものを使っているとのこと。NTCサーミスタを求めてネットを物色したところ、秋月電子にSEMITECの103AT-11というものを発見。これを実験してみることにした。
http://akizukidenshi.com/catalog/g/gP-07257/

最終的にはBLEでリモート計測したいので、マイコンは仕事でも使っているのスイッチサイエンスの「HRM1017 BLEモジュールピッチ変換基板」を利用。
https://www.switch-science.com/catalog/1814/

これでまず実験をしてみた。

サーミスタは温度変化で抵抗値が変わるので、VccとGNDの間に3.3KΩの抵抗とサーミスタを直列に接続し、分圧抵抗としてマイコンのADコンバータで電圧を測定することで、サーミスタの抵抗値を測ってみた。
回路図はこんな感じ。

LEDは動作確認のためだけにつけてある。常時つけてるとHRM1017からの出力電流不足になる(らしい)ので注意。

計測した電圧は単純に見ただけではチンプンカンプンなので、温度を計算するために下記のようにした。(サーミスタの仕様書を参照)

AnalogIn    aIn103AT(P0_1);

float vcc = 3.3;    // Vcc値
float r1 = 3300;    // 分圧抵抗R1
    
uint16_t tmpVolt = aIn103AT.read_u16();  // 10bitデータ (0x000 - 0x2FF)
float vIn = ((float)tmpVolt / 1024.0) * vcc;    // 計測値から電圧(V)に変換
float r = r1 * vIn / (vcc - vIn);                         // 電圧からサーミスタの抵抗値を計算
float t = 1.0 / (log(r/10000.0) / 3435.0 + (1.0 / (25.0 + 273.15))) - 273.15;   // サーミスタの仕様から実際の温度に変換

(NTCサーミスタはほんと計算式大切よ♡)

これで値をシリアル出力で見ながら他の気温計と比較したり、サーミスタの温度を上げ下げしてみてイケそうなことを確認。
また、計測間隔は分単位で問題ないだろうから、測定していない時にサーミスタへの電流を止めたい。ということで、サーミスタに流す電流はPIOから供給することにした。これなら計測したい時だけでPIOをONにすることでセンサに電流が流れるので省電力になるだろうという目論見。
ホントならPIOはFETをON/OFFするようにして電流をしっかり確保したほうがいいんだろうけど、まっ、まだ実験だしw動いたのでこれでOKとしとく。

どこを測るか

実験で温度計測はうまくいけそうなので、身体のどこを測るかを考えた。
体温や体温計のことを調べると、ワキの下、口内、直腸、耳の中などで計測するのがよさ気だが、どこも常時このセンサをつけておくには憚れる場所ばかりである。唯一ワキの下だけがなんとかなりそうな場所だが、そこで正確に体温を測るにはワキを10分くらい閉めておかなければならない。そばにいる人に絶対訝しがられるので、これまた無理w
体温の分布図があるサイトをみたところ、下腹部あたりならだいたいワキと同じくらいの体温なので、そのあたりにサーミスタをとり付けば測れそうだと仮定。ズボンのベルトバックルの後ろあたりにサーミスタを入れてみたところ、ワキの下より約1 ℃程度低い温度だったので、この位置で体温を測ることにした。マイコンを入れておくケースをズボンのポケットに入れたりベルトに固定できるようにしとけば、訝しがられたり憚れることもなかろう。。。たぶんw

プロトタイプ(?)

測定場所とセンサ、回路が決まったのでとりあえずプロトタイプをつくってみる。

ケースはズボンポケットにいれていても大丈夫そうなものを選ぶ。

マイコンはピンが邪魔になるのでハンダを吸い取り外しておく。

電池はCR2023一択でw

ケースにサーミスタのリード線を通す穴をあけ、マイコンの基板をそのまま利用して電池、サーミスタ、抵抗をハンダ付けする。


ケースが小さいので基板は固定しないでそのまま放り込んでおく。リード線たちがいい具合にバランスをとってくれてケース内では安定している模様w
ただ電池が他の配線に接触しないように絶縁だけはしっかり。

ファームウェアのプロトタイプはmbed HRM1017として作成。
BLEペリフェラルとして、Health Thermometer Serviceをサポート。
他にもサポートしたいGATTがあるのがだが、とりあえず動作させてから考えることに。
あと、電池駆動のときはVccが3Vになるので、前述のサーミスタの温度変換式ではそれも考慮しておく。


iPhoneのアプリも体温データが取得できることだけができるものでいいので、とりあえず作ってみた。
iOSのBLEアプリはいままでもいくつか作っているので、そのライブラリを使って組んだだけ。 UXもなにもあったものじゃないw

センサを下腹部に仕込んでアプリを動かしてデータを取得してご家庭用体温計で測った値とと比べてみたりと、ここまで作って1日目終了。


まだやる?

iPhoneと接続されていない時でも体温を測りたいのでマイコン側でバッファリングしたり、それをしだすと計測した時間が正確に知りたくなるけどマイコンにRTCがないのでBLEのCTS(Current Time Service)を仕込んでみたり、、、
アプリもそれらに対応したり、体温変換をグラフ表示してみたり、、と、まだまだやらないとなー(^^;