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

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

体温を測りたいのさ!!

前回のつづきです。

前回 : 体温を測りたいのさ!

前置き

ブログを書くにあたってこの体温計の名称がないとなんとも書きづらいのでサーミスタの型番からBLE103AT-11と呼ぶことにします。

体温計の続き...

一応、温度は測れるようになったので、使い勝手を考えて他に必要な機能を検討することにした。

体温の変化を記録するのに常にiPhoneでデータを取り続けるのは現実的に厳しそう。BLEはちょこちょこ接続が切れるし、iPhoneの電源が常にONってのも前提とはできない。
なので、BLE103AT-11はスタンドアロンでデータを記録しておいて、iPhoneがつながったときに記録したデータを転送する方法にしようと考えた。

てことは、BLE103AT-11自身が定期的に温度を測ってメモリに保存して置かなければならない。BLE103AT-11が、それように(だいたい)正確な時間も保持しておく必要がある。

計測データと時間データをまとめて送れるようなBLEのサービスやキャラクタリスティックがあるかどうか調べてみたが、ピッタリくるようなものはないみたいなので、これは自分でキャラクタリスティックを決めてサービスを定義することにした。
Temperature Measurementキャラクタリスティックが使えそうです!なのでこっちを使う方向で!(2015.10.20)


ただ時間に関しては Current Time Service (CTS) なるものがあるようなので、まずは「時間」についてはこのCTSを使ってどうにかしようと思う。

で、CTSってなに?

大雑把にいうと BLEデバイスが自分自身のもつ時計機能によって日時を提供するサービスで、それに伴ったキャラクタリスティックもいくつか定義されている。
詳細はBLEのデベロッパポータルあたりを参照。
https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx

この仕様をみると1秒以下の時間とかタイムゾーンの扱いとかいろいろと細かいところもあるのだけど、CTSを名乗るには「現時点の日時」を返せるだけで、とりあえずOKのようだ。これはキャラクタリスティックの "Current Time"で実現する。

BLEの規格によるとCTSはCurrent Timeキャラクタリスティックの Read、NotifyとCCCD(Client Characteristic Configuration Descriptor)が最低限サポートしなければならないようだが、BLE103AT-11はそれ自身がRTC(Real Time Clock)を持っていないので、なんらかの方法で起動直後に日時を設定する必要がある。
一旦BLE103AT-11に日時が設定できれば、あとはTickerで 1秒毎に割り込んで擬似的にRTCを実現できる。この設定はCurrent TimeキャラクタリスティックのWriteで実現することにした。Current Timeキャラクタリスティックに Writeを用意して、ときどき外部(今回はiPhone)から設定してあげれば現実的なのではないかなと。

てことでCTS実装

mbed BLE用にCurrent Time Serviceを実装してみたのがこちら。
https://developer.mbed.org/users/ohneta/code/BLE_CurrentTimeService/

で、これCCCDの部分がよくわからなくて未実装のままだが、ソースコードを読んでみた限りではmbed BLEライブラリがなんかいい感じでCCCDをサポートしてくれているっぽい。
ただmbed BLEではonUpdatesEnabled/onUpdatesDisabledのコールバック関数のポインタはGapオブジェクトが持つので、複数のサービスをサポートする場合はどのサービス/キャラクタリスティックへのNotifyなのかを判断するすべが必要なようだ。そこんとこがよくわからなかったのでonUpdatesEnabled/onUpdatesDisabledは未実装のままで公開した。

あと特筆すべきWriteのサポート! wてか、これがないとベースとなる時間が設定できませんからねw


Writeで書き込んだ日時をepoch timeに変換して1秒ごとにupdateするだけの簡単なコードを書いて、2日目終了。
あー、なんか疲れた、、、本当は体温計を作ろうとしていたのに、なにやってんだろ、おれ(^^;;;