編集履歴一覧に戻る
nbkawamuraのアイコン画像

nbkawamura が 2021年05月16日21時01分23秒 に編集

初版

タイトルの変更

+

洗面所に人がいるかを扉を開けずにチェックするデバイス

タグの変更

+

obniz

+

obnizIoTコンテスト

+

人感センサー

+

LEDマトリクス

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

# 概要 家庭内で、洗面所にてお風呂上がりの着替え中にうっかり扉を開けてコンフリクトしてしまう事件が何度か発生したため、外から扉を開けずにわかる方法が欲しいと思い作成しました。 (特に、我が家はトイレに行くのに洗面所を通る必要がある、という少し変わったレイアウトのため通常の家庭よりもコンフリクトが発生しやすいです) # デモ動画 実際に動かしてみたときの動画です。 人がいると×(入れないの意味)、人がいなくなると〇に切り替わります @[youtube](https://youtu.be/q2-9AVcZGZU) ※少し切り替わりが遅いですが、使用した`Keyestudio PIR`の人の検出に若干問題があるためです。 * 中に人がいても動きがなくなるとすぐにいない判定になっていますため、いる→いないに表示を切り替える際に若干遅延を入れてます。 # 全体構成 2つのobniz boardをセンサー部と表示部で使っています。 * obniz cloud * obniz board 1Y (センサー部) * Keyestudio PIR * obniz board (表示部) * Keyestudio_HT16K33 # 部品 ## センサー部 * obniz board 1Y * [Keyestudio PIR](https://obniz.com/ja/sdk/parts/Keyestudio_PIR/README.md) * モバイルバッテリー ![キャプションを入力できます](https://camo.elchika.com/f5be6a81f1d834fd1cc1119502a94972eb1b81bd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33353438636534342d363565342d346335392d393536302d3763613332383235303039622f66376230396364622d326138632d346661322d626135652d343665663539396237383938/) ## 表示部 * obniz board * [Keyestudio_HT16K33](https://obniz.com/ja/sdk/parts/Keyestudio_HT16K33/README.md) ![キャプションを入力できます](https://camo.elchika.com/e0d319e5a02192b5f791ca5167fd78ef9a47c142/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33353438636534342d363565342d346335392d393536302d3763613332383235303039622f31336131343939372d653634352d346133302d383865332d333138333062313165663733/) # 設計図 ## センサー部 [Keyestudio PIR](https://obniz.com/ja/sdk/parts/Keyestudio_PIR/README.md)の標準的な接続方法です。 | obniz | Keyestudio PIR | | --- | --- | | io0 | signal | | io1 | vcc | | io2 | gnd | ## 表示部 [Keyestudio_HT16K33](https://obniz.com/ja/sdk/parts/Keyestudio_HT16K33/README.md)の標準的な接続方法です。 ※センサーのドキュメントに載ってるサンプルコードのvccとgndが逆になっているので、少しだけ躓きました。 | obniz | Keyestudio_HT16K33 | | --- | --- | | io0 | gnd | | io1 | vcc | | io2 | sda | | io3 | scl | # TODO * obniz board 1Yを使って、スリープを活用して人を検知したらwakeupするようにしたいです(当初の想定) * スリープ中でもwakeupできるように配線を変えてトライはしてみたのですがうまく行かずでした… * 人検知したときに`Keyestudio PIR`から3Vが入っているにも関わらずobniz board 1Yは起き上がってくれず。 * ちょっと時間がなくて今回はタイムアップとなりましたが今後トライしたいです。 # ソースコード ブラウザアプリとして作成しています。 表示部のOBNIZ_IDは、アプリの設定として入れられるようにしています(userconfig.OBNIZ_ID_DISPLAY) ``` <html> <head> <meta charset="utf-8" /> <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script> </head> <body> <div id="obniz-debug"></div> <script> // OBNIZ_ID_HERE will be replaced at run. // インストールされたデバイス情報に書き換わる const userconfig = Obniz.App.configs(); console.log(`trying to connect: ${userconfig.OBNIZ_ID_DISPLAY}`); var obniz_display = new Obniz(userconfig.OBNIZ_ID_DISPLAY); obniz_display.onconnect = async function () { var id_timer = -1; const matrix = obniz_display.wired("Keyestudio_HT16K33", { vcc:1, gnd:0, sda:2, scl:3 }); matrix.brightness(0); obniz_display.display.clear(); matrix.clear(); var obniz_sense = new Obniz("OBNIZ_ID_HERE"); obniz_sense.onconnect = async function () { var sensor = obniz_sense.wired("Keyestudio_PIR", { signal: 0, vcc: 1, gnd: 2 }); var first = true; sensor.onchange = function (val) { if (val) { // 起動直後に誰もいなくても動きを検出するのを無視するworkaround if (first) { console.log("First time moving, ignored."); first = false; return; } console.log("Moving Something!"); obniz_sense.display.clear(); obniz_sense.display.print("Moving Something!"); // 動きがあるイベントはすぐに表示を更新する obniz_display.display.clear(); obniz_display.display.print("Busy!"); const dots = [129,66,36,24,24,36,66,129] // × matrix.clear(); matrix.dots(dots); if (id_timer != -1){ clearTimeout(id_timer); id_timer = -1; } } else { console.log("Nothing moving"); obniz_sense.display.clear(); obniz_sense.display.print("Nothing moving"); // 動きがないイベントは割と発生するので、10秒程度遅延して表示を更新する const showng = () => { obniz_display.display.clear(); obniz_display.display.print("Free!"); const dots = [60,66,129,129,129,129,66,60] // 〇 matrix.clear(); matrix.dots(dots); } id_timer = setTimeout(showng, 10000); } }; } }; </script> </body> </html> ```