nbkawamuraのアイコン画像
nbkawamura 2021年05月16日作成
製作品 製作品 閲覧数 870
nbkawamura 2021年05月16日作成 製作品 製作品 閲覧数 870

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

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

概要

家庭内で、洗面所にてお風呂上がりの着替え中にうっかり扉を開けてコンフリクトしてしまう事件が何度か発生したため、外から扉を開けずにわかる方法が欲しいと思い作成しました。
(特に、我が家はトイレに行くのに洗面所を通る必要がある、という少し変わったレイアウトのため通常の家庭よりもコンフリクトが発生しやすいです)

デモ動画

実際に動かしてみたときの動画です。
人がいると×(入れないの意味)、人がいなくなると〇に切り替わります

ここに動画が表示されます

※少し切り替わりが遅いですが、使用したKeyestudio PIRの人の検出に若干問題があるためです。

  • 中に人がいても動きがなくなるとすぐにいない判定になっていますため、いる→いないに表示を切り替える際に若干遅延を入れてます。

全体構成

2つのobniz boardをセンサー部と表示部で使っています。

  • obniz cloud
    • obniz board 1Y (センサー部)
      • Keyestudio PIR
    • obniz board (表示部)
      • Keyestudio_HT16K33

部品

センサー部

表示部

設計図

センサー部

Keyestudio PIRの標準的な接続方法です。

obniz Keyestudio PIR
io0 signal
io1 vcc
io2 gnd

表示部

Keyestudio_HT16K33の標準的な接続方法です。
※センサーのドキュメントに載ってるサンプルコードの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>
1
ログインしてコメントを投稿する