【緊急】トイレの蓋を閉め忘れ彼女にブチギレられたので、obnizを使って解決しにいった話

# やばい状態です
現在、彼女と半同棲しているのですが、人間が共に暮らすと様々な問題が発生します。
我々の場合、それはトイレで起こりました。
僕はとてもズボラな人間で、よくトイレの蓋を閉め忘れてしまいます。
僕自身、「だから何？」程度の話なのですが、彼女はそれを許すことができないようで、この世の終わりくらいキレ散らかします。

いつもならば彼女に平謝りをして許して頂いているのですが、あまりに改善されないので、ついに彼女が僕に対して「制裁」を始めました。
**晩ご飯が豆腐とキムチだけになったのです、、、、**
さすがにいつか死んでしまう気がするので、緊急でなんとかしようと躍起になっております。

# インスパイアを受ける
そんなとき、これを見つけました。

https://twitter.com/togenkyoo/status/1413742448036126722?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1413742448036126722%7Ctwgr%5E1706c5c7d80f021a34cfa6953b83e450e9a3aa49%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Ffujiwaram.com%2Farchives%2F1042

題して「チャック開いてますよ警報機」です。
チャックが開いている状態を検知して、音声でアラートをかけてくれるというもの。
一見、全く実用性ないやんけ、、、と思えますが、冷静に考えると、
今回のトイレの開閉問題も検知をしてアラートをかけてくれたらなんとかなるかもしれません。
ということで、こちらを参考に、「トイレ開いてますよ警報機」を制作することとしました。

# 仕組み
- 図、赤印の部分に筐体を設置します
- 蓋が開いた状態が10分以上継続するとアラートをかけます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/75a91667-cd81-60bf-123d-84322488831d.png)

# 完成デモ
トイレの蓋が開けっぱなしになっていた場合、
LED点灯させ、かつアラート音を出すことで視覚・聴覚ともに訴えかけます。
（自宅トイレの写真載せるのに抵抗があり、筐体のみの掲載となります、、、）

https://twitter.com/atoms50/status/1579396269449302017?s=20&t=1N-ZbCWP1raHs343BCRNeg

# できた！と思いきや
実際に使用してみたところ、仕事をしているとトイレのアラーム音に気がつかない問題が発生しました。
僕は普段仕事をする際に、イヤホンをつけてノイキャンしているので、どれだけ大きくアラームを流しても耳に届かなかったのです。

これを受けて、アラートがかかった際にLINE botでプッシュメッセージを送るものを作成しました。これさえあれば、仕事をしていてもスマホやPCで把握することができます

https://twitter.com/atoms50/status/1579453366786478080?s=20&t=1mjwMqSPIKtCowU8mwYIJQ

（かなり圧強めにアラートをかけてきますので切迫感が出ます笑）

# 制作：環境
node v18.8.0
Visual Studio Code v1.71.0
axios 0.27.2

# 制作：用意したもの

**①obnizの設定**
- obniz Board 1Y
- 抵抗内蔵5mm赤色LED（5V用）640nm　OSR6LU5B64A－5
- 圧電スピーカー（圧電サウンダ）（13mm）PKM13EPYH4000－A0
- 超音波距離センサー　HC－SR04[101-60-142 / 20-019-100-A]
- ミニブレッドボード　BB－601（白）

事前設定や接続は、[obniz公式ドキュメント（起動とWi-Fi設定）](https://obniz.com/ja/doc/reference/board-1y/quick-start/)を参考にしました。

**②LINEBotの準備**
Botアカウントの準備は、[こちらの記事](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)を参考にしています。

# ソースコード
```JavaScript:toilet_alert
const Obniz = require('obniz');
const obniz = new Obniz('**********');

'use strict';

const line = require('@line/bot-sdk');

const config = {
    channelSecret: '***********',
    channelAccessToken: '************'
};
const client = new line.Client(config);


const main = async () => {

    const messages = [{
        type: 'text',
        text: 'お前、トイレ開けっぱなしやで！！！'
    }];

    try {
        const res = await client.broadcast(messages);
        console.log(res);        
    } catch (error) {
        console.log(`エラー: ${error.statusMessage}`);
        console.log(error.originalError.response.data);
    }
}

obniz.onconnect = async () => {
    // 超音波距離センサを利用
    const hcsr04 = obniz.wired('HC-SR04', {
        gnd: 3,
        echo: 2,
        trigger: 1,
        vcc: 0,
    });

    // LEDを利用
    const led = obniz.wired('LED', { anode: 10, cathode: 11 });

    //スピーカーを利用
    const speaker = obniz.wired('Speaker', { signal: 6, gnd: 7 });

    // obnizディスプレイ（初期表示）
    obniz.display.clear();
    obniz.display.print('obniz Ready');

    //カウント用意
    let count = 0;

    // setIntervalで定期実行
    setInterval(async () => {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // 小数点以下がたくさんあるのでここでは整数にします
        distance = Math.floor(distance);
        // 距離をコンソールに表示
        console.log(distance + ' mm');
        // 距離をobnizディスプレイに表示
        obniz.display.clear();
        obniz.display.print(distance + ' mm');

        //10cm以下になった回数をカウント
        if (distance < 100.0) {
            count += 1;
        }else {
            count = 0;
        }

        //カウントが１０以上（１０分間トイレがあきっぱなしの時）アラートをかける
        if (count >= 10) {
            //obnizの画面で警告
            obniz.display.clear();
            obniz.display.print('Close the toilet!!!');
            // LEDオン
            led.on();
            // 音を鳴らす
            speaker.play(1000); 
            //LINE botにプッシュメッセージ
            main();
        }else{
            //カウントが0に戻る（蓋が閉じる）タイミングでアラートを消す
            led.off();
            speaker.stop();
        }

        //console.log(count);
       
    }, 60000); // 60000ミリ秒 = 1分ごとに実行
};
```


■結果と今後の展望
トイレの蓋を閉じるという習慣が改善されたわけではありませんが、彼女にこんなものを制作しました、、と見せたところ、誠意は受け取って頂くことができました（よかった）

今後としては、アラートをかけるのではなく、自動で蓋を閉じるような仕組みを作れないかと考えています。
マイクロサーボに棍棒を取り付けて、蓋を押してみたのですが、物理的なパワーが足りずに蓋を閉じられないという結果に終わりました。
もっと力が強いものを代用し、解決できるか見ていくつもりです。