ボタン電池で年単位で使えるワイヤレスドアセンサーを作った

ボタン電池で数年ほど動作し続ける、ワイヤレスなドアセンサーを作りました。よくあるIoTネタですが、オフィスのトイレ個室が混雑しがちなので、自席で空きがわかると良いなというやつです。

外観と、ドアの上部に載せたところ。
f:id:NeoCat:20190507122108j:plain

仕様

センサーは、1分間ごとにドアの開閉状態を無線送信します。(リアルタイム送信もできるのですが、あえて1分間ごとのみにしています。用途的に、混雑しているかが荒く分かればよく、逆にあんまりリアルタイムに監視したくないからという理由です。)
複数のセンサー情報を集約して混雑しているか空いているかをWebページで見ることができます。

使用したもの

無線送信にはTWE-LITEを使用しました。簡単に省電力な無線システムを作ることができます。いくつかタイプがありますが、ボタン電池ホルダーが付いているPALを使いました。

無線マイコンモジュール TWELITE BLUE PAL-トワイライト ブルー パル MW-B-PAL-P 【アンテナ内蔵タイプ 標準出力(1mW級)】

実は 開閉センサーPAL|MONO-WIRELESS.COM というのが販売されているので、これを使えばあとは磁石さえ用意すればOKです。
が、そこそこ値段もするので、今回はセンサーにはリードスイッチをつけて使います。

ガラス管の金属リードがわずかに離れて2本入っており、両側のそれぞれに磁石のS極とN極を近づけると、磁力でくっついて導通するという仕組みです。

Hommy 磁気センサー 10xMKA-10110 10-15AT磁気センサー N/O SPSTコンタクトリードスイッチ

子機のケースにはタカチのSW-90Bを使用。ちょっと長さも高さも余ってしまいますが、幅の小さいケースがなく……。
SW型プラスチックケース 黒 SW-90Bの通販ならマルツオンライン

マグネットはこれ。めちゃくちゃ小さいので対向位置にくっついていても邪魔になりません。ただし位置は結構ぴったりと合わせる必要があります。

OMO Magnetics 【世界最強マグネット】 強力マグネット 強力磁石 N50 ネオジム磁石 ネオジウム磁石 円柱型 丸型 2x10mm 直径2mm 厚み10mm ニッケルメッキ 専用ケース付 20個セット

親機としてはDIPタイプのTWE-LITEを使いました。

超簡単! 無線マイコンTWELITE DIP-トワイライトディップ 2次元マッチ棒アンテナタイプ ピンヘッダ端子実装

親機からWi-Fi経由でデータを流すのにはM5Stick-Cを使いました。
M5Stick-C - スイッチサイエンス

配線

こんな感じにリードスイッチをつけます。
f:id:NeoCat:20190605101954j:plain

A1 --+-- 1〜5MΩ  -- Vcc
     |
  リードスイッチ
     |
GND -+

リードスイッチがONになると、A1がプルダウンされます。

親機側は、M5Stick-Cにくっつけました。ちょっと強引
f:id:NeoCat:20190430204116j:plain

ファームウェアの書き込みと設定

ファームウェアとして、以下のページからダウンロードできる「無線タグアプリ」を使用しました。
無線タグアプリ (App_Tag) - MONO-WIRELESS.COM

子機には子機用のバイナリ(現時点で最新のv2.1.5)を書き込みます。適当な3.3VのFTDI USBシリアルでGND/TXD<->RXD/3.3Vにつなぎ、PRGをLOWに落として電源を入れ、PRGをHIGHに戻すとプログラムモードに入ります。
接続方法は以下。 UART-USBケーブルでの書き込み - MONO-WIRELESS.COM
Mac/Linuxから書き込む際は、SDK(ソフトウエア開発環境 TWELITE SDK - MONO-WIRELESS.COM)の Tools/tweprog_py に含まれるPythonのツールを使います。

sudo pip3 install pyftdi
sudo ./tweterm.py -p ftdi:///1 -F ./App_Tag-EndDevice-BLUE.bin  # ファームウェアを指定して書き込み

M2ピンをLOWにして起動すると設定画面に入り、以下のように表示されます。

--- CONFIG/App_Tag V2-01-5/SID=0x810e____/LID=0x01/RC=9065/ST=0 ---
 a: set Application ID (0x810e____)
 i: set Device ID (1=0x01) 
 c: set Channels (20) 
 x: set Tx Power (13) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0x5A5A5A5A) 
 o: set Option Bits (0x00000441)*
 d: set Sleep Dur (60000)*
 w: set Sensor Wait Dur (30) 
 m: set Sensor Mode (0x10) 
 p: set Sensor Parameter (0)*
 P: set Sensor Parameter2 (  ) 
---
 S: save Configuration
 R: reset to Defaults

ここで、App IDやチャンネルなどを適当に設定していきます。子機が複数あるので、IDとして1, 2, 3などと違う番号をつけておきます。 オプション(o)として 0x441 を指定して、OTAは無効にしておきます。センサータイプは10(アナログセンサー)にしておきます。

親機には親機用のバイナリを書き込みます。こちらは書き込み後に + + + と入力すると設定用のインタラクティブモードに入るので、子機と同じApp ID、チャンネルを指定します。
無線受信したデータがシリアル出力されるので、これをESP32側のSerial1で受け取り、適当にパースしてWi-Fi経由でHTTP送信するようにしました。

結果

こんな感じで混雑状況がわかります。
あえて個別の開閉状態は表示しないようになっています。

空いた時にお知らせしてほしいとはみんな思うようで、早速 1liner でこのページを定期取得して空きができたらポップアップ通知するスクリプトを書いた人などが現れていますw


ちなみに親機と子機は壁2枚隔てた距離にありますが、かなり感度は良好で滅多にデータ欠損などはないようです。