概要
他に家人がいないと宅配便を時間指定にしたとき、インターフォンが聞こえないのでおちおちトイレにも座ってられない経験がある人は少なくないと思います。トイレに行く前にセットすることで落ち着いて用を足すことができる?
デモ
動作説明
トイレに行く前に、スマホからアプリを動作させます。音声センサーがドアホンの音を検出すると光センサーを確認、モニターが点灯していると判断するとアプリを実行しているブラウザのボタンを有効にします。
ボタンが有効になったらボタンを押すことで、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音声も鳴らせそうです。もう少し研究が必要ですね^^;
投稿者の人気記事
-
pman
さんが
2021/05/16
に
編集
をしました。
(メッセージ: 初版)
-
pman
さんが
2021/05/16
に
編集
をしました。
ログインしてコメントを投稿する