概要
家庭内で、洗面所にてお風呂上がりの着替え中にうっかり扉を開けてコンフリクトしてしまう事件が何度か発生したため、外から扉を開けずにわかる方法が欲しいと思い作成しました。
(特に、我が家はトイレに行くのに洗面所を通る必要がある、という少し変わったレイアウトのため通常の家庭よりもコンフリクトが発生しやすいです)
デモ動画
実際に動かしてみたときの動画です。
人がいると×(入れないの意味)、人がいなくなると〇に切り替わります
※少し切り替わりが遅いですが、使用したKeyestudio PIR
の人の検出に若干問題があるためです。
- 中に人がいても動きがなくなるとすぐにいない判定になっていますため、いる→いないに表示を切り替える際に若干遅延を入れてます。
全体構成
2つのobniz boardをセンサー部と表示部で使っています。
- obniz cloud
- obniz board 1Y (センサー部)
- Keyestudio PIR
- obniz board (表示部)
- Keyestudio_HT16K33
- obniz board 1Y (センサー部)
部品
センサー部
- 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は起き上がってくれず。
- 人検知したときに
- ちょっと時間がなくて今回はタイムアップとなりましたが今後トライしたいです。
- スリープ中でもwakeupできるように配線を変えてトライはしてみたのですがうまく行かずでした…
ソースコード
ブラウザアプリとして作成しています。
表示部の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
-
nbkawamura
さんが
2021/05/16
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する