トイレ使用中表示を作る

すっかり忘れていた実家のスマートホーム化、唐突に思い出したので再開します。

前回(というか初回)は換気警告でした。

hollyhockberry.hatenablog.com

今回は緊急時には結構深刻なトイレ使用中表示を設置してみます。

イメージはこんなかんじ。
トイレに設置したセンサが現在の状態をサーバに送り、リビングあたりに使用中表示をします。他の部屋でも状態を知りたいのでスマートフォン用のダッシュボードも用意できるといいですね。

構成

人感センサ HC-SR501
人感センサ制御 M5StampC3
データベース, ダッシュボード Raspberry pi zero
使用中表示 M5ATOM

人感センサHC-SR501で付近に人がいることを検出して、Raspberry pi上のデータベースにポストします。
データベースの最新データを利用して使用中ランプを点灯させたり、ダッシュボード上に表示したり自由自在ですね。
使用中ランプの点灯消灯もRaspberry piでできますが、設置の都合上ランプの制御専用にM5ATOMを利用します。

データベース

人感センサの値を保持しておくデータベースを準備します。
センシングしたデータにはInfluxDBがもってこいですね。セットアップ手順は適当に検索すればいっぱい出てきます。当ブログでも以前プレゼンス管理ごっこした時にも利用したのでそちらにも少し書いてますのでどうぞ。

hollyhockberry.hatenablog.com

今回も test という名前のデータベースを作成します。

人感センサ

人感センサの HC-SR501 は検出した時にHi(3.3V)を出力するのでESP32のGPIOに入力するだけです。
信号が変化したときにデータベースにポストすればOKです。

InfluxDBのライブラリがありますが、文字列をPOSTで送るだけなので自前で実装しちゃいます。

公式ドキュメント によると weather というMeasurementにタグlocationus-midwesttemperatureを82で登録するには下記のようにします。

weather,location=us-midwest temperature=82 1465839830100400200
  |    -------------------- --------------  |
  |             |             |             |
  |             |             |             |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+

今回は先ほど作成したDB、testというMeasurementにタグidで識別子(MACアドレスにします)を指定し、existに人感センサを読んだ結果を登録するので、

test,id=##:##:##:## exsit=1

こんな感じのペイロードになります。Stringクラスで文字列を結合していけば簡単に作れますね。

ソースコードはこんな感じなります。実際はWiFiの接続やスリープの設定などやっているのでごちゃっとしていますが、肝心なところはGPIOのReadとHTTPClientによるPOSTだけです。

github.com

基板むきだしなのもアレなのでケースも作っておきます。

使用中表示

使用中表示も簡単です。データベースから最新の状態を取得して、それに応じて表示すれば良いわけです。

InfluxDBにはSQLみたいなクエリ言語 InfluxQLが用意されています。
Raspberry piのアドレスをhttp://iot.localとした場合、保存されたexistの最新を取得するにはこんな感じです。

http://iot.local:8086/query?pretty=true&db=test&q=SELECT%20*%20FROM%20test%20ORDER%20BY%20time%20DESC%20LIMIT%201

ご覧のようにjson形式で返ってきますのでexistの値に応じてLEDを点灯して使用中を表示します。
細かいことはすっ飛ばしてできたファームウェアはこちらになります。

github.com

ファームウェアができたので表示灯を作成します。
なんとなく新幹線のトイレ表示灯をイメージして作成しようとすると、ある程度の範囲が発光して見えないとねぇ・・と思うわけですがどうやって作ればいいのかわからない。
手当たり次第にググってたらカッティングシートでアクリル面発光するサイトを見つけました。

minkara.carview.co.jp

カッティングシートの糊部分が光るそうで、これなら簡単にできそうです。

早速アクリル板を切り出してカッティングシートを貼ってみます。

スキージーでぐりぐりやったんですけど気泡が入っちゃいましたが、黒カッティングシートでピクトグラムをカットして試運転してみます。

思ったよりちゃんと面発光してくれました。これは簡単でいいですね。

ダッシュボード

表示灯のない場所からも使用状況を見たいのでダッシュボードを用意します。
簡単にいい感じのダッシュボードを作ることができるGrafanaを使います。
セットアップしたのがちょっと前なので8.4.4を入れています。今は8.5.0がリリースほやほやみたいですね。

grafana.com

Raspberry Pi Zeroで実験したので Ubuntu and Debian(ARMv7) でセットアップしました。

セットアップやInfluxDBとの接続はググるといっぱい出てくるので省略します。

ダッシュボードのパネルですが、使用状況のグラフを表示してもしょうがないので最新の状態を表示します。クエリは先ほどファームウェアに実装したものと同じで良いですね。

値を表示する場合は Visualizationsで Stat を選択します。また、そのままでは生の値が表示されるだけなので Value mappingsで表示を変更します。

簡素ですが状態に応じてパネルが変化しました。とりあえずはこれで良しとします。

完成

こんな感じでちょっとラグがあるけどうまく動きました!参考程度にはなりそうですね。

入り口付近に設置してみました。
配線が見えない位置から見ると結構いけてますね。