BLE経由で温度湿度気圧データを収集する、いわゆる環境センサを作りました。 コイン電池で1年以上動き続けます。

作ったもの

温度湿度気圧を計測し、BLEを使ってデータを送信するデバイスを作りました。 消費電力がとても小さいので、コイン電池で1,2年は動き続けるはずです。

設計データや詳細はGithubで公開しています。

Github:idt12312/ENBLE

このセンサーだけではデータをばらまくことしかできないので、 複数デバイスのデータを集めていい感じに表示するシステムも作りました。 こんな感じの構成です。

家に何個かENBLEを設置し、各センサーのデータを時系列グラフなどの形でweb browserから見ることができます。

データの蓄積と表示部分はThingsBoardというソフトを使いました。 今回は単純にデータを集めて表示するためだけに使っています。 他にも複数の拠点やUserごとにデータを分けたり、ThingsBoardのwebUI上からend device側にデータを送ったりもできます。 ホビーユースだけではなく、業務として活用されることを考慮して開発されているのだと思います。 公式ドキュメントが非常に充実しているので使いやすかったです。

ENBLEはBLEのadvertisingかGATTでしかデータを送信することができないので、直接ThingsBoardと接続することはできません。 なのでBLEのadvertisingで受信したENBLEのデータを多少加工してThingsBoard severに送信するBridge Serverを作りました。 これは完全に自分用で、ENBLEの利用例みたいなものです。このBridge ServerのコードもGithubにおいてあります。

ハードウェアについて

回路

KiCadでプリント基板を作りました。回路図はこれです。

部品は少ないのであまり意味はありませんが、回路を抽象化したブロック図です。

nRF51832のADCは自身の電源電圧を測ることができます。 なのでコイン電池を電源としてマイコンに直結してバッテリー電圧を計測しています。 (こういう使い方はあっているのだろうか。。。。)

BLEモジュール

BLE搭載マイコンモジュールとして Braveridge BVMCN5103(技適対応)を使っています。 BVMCN5103にはBLE搭載マイコンであるNordic nRF51822が入っています。 nRF51822にはARMのCortex-M0をコアに持っているので、STM32などと同じようなARMの開発環境で開発が可能です。

BVMCN5103の開発キットはamazonにも売っています。 ブレッドボードに刺さる開発ボードになっているので、簡単に実験することができます。

BLE 開発キット:BVMCN5103-CFAC-BK KIT
Braveridge
売り上げランキング: 83,675

BVMCN5103単体のモジュールもamazonに売っています。 RAM, Flashの容量が違うものもあります。

BVMCN5103-CEAA-BK 20個パック
Braveridge
売り上げランキング: 504,767

ENBLEのためのプログラムはNordicのSDKのsampleを元に、Makeを使って作成しました。 BME280からSPIでデータを吸い上げて、BLEでばらまくだけです。

消費電流を減らすために極力マイコンをSleepにしています。 BME280とSPIで通信をするときも、計測が終了するまでCPUを起こしたまま待機するのではなく、 計測開始命令を出したらすぐにSleepになり、計測が終了したら起きてデータを取りにいくという動作をします。

計測周期やdevice固有のidはGATT service経由で設定できるようになっています。 このデータは一回設定したら後は電源を切っても消えてほしくないので、不揮発領域に保存しています。

ケース

TAKACHI PS-65 Serieseのケースを使いました。 ちょうどいいサイズで、ストラップ用の穴も空いているので簡単にぶら下げるけることができます。

コイン電池ホルダーはTAKACHI BK-888を使いました。 PS-65のケースにあうサイズです。

消費電流

コイン電池で駆動するにあたり、無駄な電力を消費していないか、どのくらい電池が持ちそうかを調べるために消費電流を実測しました。

まずは検証用にadvertise intervalを2secにし、BME280での計測を10secごとに設定をして電流を測りました。 20secの間電流を測り続けるとこんな感じになっていました。

設計通り、2sec周期のadvertiseと10sec周期のBME280での計測を行うたびに消費電流が大きくなっています。 大事なのは他に消費電流が多くなってることがないということです。 プログラムを少しミスるだけで無駄に消費電流が大きくなってしまったりすることがよくありますが、 そういうことは起こってなさそうです。 Sleepしているときの電流はDMMで計測すると3.80uAでした。 マイコンやBME280のデータシートにあった値から見積もった消費電流とだいたい同じです。

advertising

advertise intervalごとに1回発生する消費電流が増加している部分を詳しくみると、 電流波形はこんな感じになっています。

この面積を計算することでadvertise interval1周期ごとに29.4uCの電荷を消費していることになります。

BME280での計測

BME280で計測をするときには次の2つのことが行われます。 まず、計測周期が来たらマイコンがwakeupしてBME280に計測開始命令を出し、BME280が計測を開始します。 マイコンは計測開始命令を出したらすぐにSleepになります。 次に一定時間後(BME280の計測が終了するまで)にSleepを解除し、BME280からデータ読み出し&データ処理を行います。

この2つの部分の消費電流波形はこのようになりました。 右の図がBME280での計測開始、左の図が計測終了直後の電流波形です。

左の図の3段の山の形はBME280のデータシートにあった消費電流波形と同じような形をしています。 左の図の先頭と、右の図にある長方形の形がマイコンによる消費電流です。 計測終了後にかなりの電流を消費していることが分かります。 BME280から取得したデータは補正が必要で、そのための計算に結構時間がかかっているんじゃないかと思います。

電池はどのくらい持つのか

消費電流の計測結果をみて、advertiseは6sec、BME280での計測は60sec周期で行うことにしました。 各動作による消費電流と周期は以下のようになります。

State Consumption Interval
advertising 29.4 μC 6.0 s
measuring (start) 4.14 μC 60 s
measuring (end) 8.07 μC 60 s
sleeping 3.80 μA constantly

これらから、1時間で消費する電荷を計算すると31.6mCになります。

3600 / 6 * 29.4μ + 3600 / 60 * (4.14μ + 8.07μ) + 3600 * 3.8μ = 32.1 mC/h

CR2032の容量は810C(225mAh)らしいので、電池は810/31.6m = 25632時間(3年弱)持つ計算になります。 電池は自己放電がありますが、1年で数%らしいのでこの見積もりは大ハズレではなさそうです。

おわりに

特にデータを使って何かするわけではありませんが、グラフを見ているだけで楽しいです。 気温や気圧が急変するときが来るのを待っています。