pmanのアイコン画像

宅配便の時間指定でトイレ行くのにビクビクしないシステム

pman 2021年05月16日に作成  (2021年05月16日に更新)

概要

他に家人がいないと宅配便を時間指定にしたとき、インターフォンが聞こえないのでおちおちトイレにも座ってられない経験がある人は少なくないと思います。トイレに行く前にセットすることで落ち着いて用を足すことができる?

デモ

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

動作説明

トイレに行く前に、スマホからアプリを動作させます。音声センサーがドアホンの音を検出すると光センサーを確認、モニターが点灯していると判断するとアプリを実行しているブラウザのボタンを有効にします。

ボタンが有効になったらボタンを押すことで、obniz に取り付けられたスピーカーからブザーが鳴らすことができますので、在宅であることを知らせます。

無事トイレから出たらアプリを終了させましょう。

部品

部品 今回使用したもの
obniz obniz Boad 1Y
音検出 keyestudio Analog Sound module
モニタON検出 keyestudio Photocell module
保留音 keyestudio Passive Buzzer module
電源 ELECOM モバイルバッテリー DE-M01L-5230 (販売終了品)

壁に取り付けるため、100均ショップで購入したパンチングボードを使用しました。
モバイルバッテリーは、消費電力が低すぎるのか手持ちでは古いタイプのものでないと途中で電源供給が終了されてしまうものが多いです。

結線

obniz
IO0 Analog Sound module - Signal
IO3 Photocell module - Signal
IO4 Photocell module - Vcc
IO10 Keyestudio_Buzzer - Signal

その他、モジュールの Vcc/GND は obniz Board 1Y から供給される USB Vcc/GND と接続しています。
もともとスリープ運用を検討し、スリープ中でも電源が必要なものはそちらから、動作中のみで良いものは IO から取るつもりでした。

音声センサー(Analog Sound module)に取り付けられている半抵抗を調整し、インターホンにのみ反応するように感度を調整します。
また、光センサー(Photocell)については、音声センサーが周囲の音に誤反応しても、モニター点灯を検出することで誤反応を避けるようにしています。

ソースコード

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script>
  </head>
  <body>
    <div id="obniz-debug"></div>
    <div class="container">
      <div class="text-center">
        <h3>ちょっと待って下さい</h3>
        <button class="btn btn-primary" id="on" disabled="disabled">待っててください</button>
      </div>
    </div>

    <script>
      //type in your obniz ID
      var obniz = new Obniz("OBNIZ_ID_HERE");
      $("#on").hide();

      //during obniz connection
      obniz.onconnect = async function() {
      	// io3: Photocell Sig
	      // io4: Photocell Vcc
	      obniz.io4.output(true);

	      // Keyestudio_Buzzer sig: 10
	      var speaker = obniz.wired("Keyestudio_Buzzer", {signal: 10});
	      console.log("obniz Connected.");
	
	      obniz.onloop = async function() {
		      var mic = await obniz.io0.inputWait();
		      var val = await obniz.ad3.getWait();

		      console.log(mic + ': ' + val);

      		if (mic && val >= 1.0) {
            $("#on").prop("disabled", false);
            $("#on").show();
		      }
	      	await obniz.wait(100);
	      }
        $("#on").click(function() {
          		playsound(880, 600);
		          playsound(880, 50);
		          playsound(880, 50);
		          playsound(0, 200);
        });
		    
        async function playsound(freq, length) {
			    speaker.play(freq);
			    await obniz.wait(length * 0.9);
			    speaker.stop();
			    await obniz.wait(length * 0.1);
		    }
      };
    </script>
  </body>
</html>

振り返り

当初音声センサーに反応してスリープ解除、LINE通知で作ったのですが、音声センサーからスリープ解除、Wifi接続してLINE通知まで10秒程度、Wifi接続にトラブルともう十数秒、といったところでした。

いろんなサンプル見ながら、node.js で動くものを作ってギリギリ実用かなあ、と思ったのですが LINE 通知がブラウザアプリから呼び出す手段がどうにも見つからず断念して今の形になってしまいました^^;

最後に実験していて気が付きましたがインターホンの通話ボタンを押さないと外部へ音が聞こえないんですね…音声モジュールもプラグイン書けばPCM音声も鳴らせそうです。もう少し研究が必要ですね^^;

ログインしてコメントを投稿する