冷蔵庫の開けっ放し癖をobnizを使って無理やり直した

# 前書き
そろそろ寝ようか。（「カチッ（電気を消す音」）
ん？廊下明るいな。電気消し忘れたか？

***～冷蔵庫が冬の狼の如く息をしながら開いている～***


これまで何度このような光景を目の当たりにしたか。
詰めが甘いといわんとばかりに半開きの冷蔵庫を見ながら、自分の詰めの甘さに頭を抱え、幾重の眠れぬ夜を過ごしてきた。（寝たが。）

そう、何を隠そう、私はよく冷蔵庫を閉じきれないままその場を後にしてしまう。
実家で生活していた頃は、私が冷蔵庫を閉めることができないと家族は十分理解していたため、後を追って追い気味に閉めてくれていたが、
一人暮らしをしている今は、閉めてくれる人も、怒ってくれる人もいない。

いい歳して冷蔵庫を閉めることができないのはどうなのだろうか。
猫にも笑われる。

そんな大人を構成させるべく、今回はとっておきのプロダクトをご紹介したい。

# 制作したプロダクト
冷蔵庫と冷蔵庫上に設置している電子レンジとの距離を計測し、一定以上距離が離れた場合にLINE Botへ通知を送ってくれるというものを制作した。

https://twitter.com/Yuki_Tamura_85/status/1589241441444048897

設置の都合上逆さになってしまっているが、これは冷蔵庫が閉じている状態のobnizである。
画像だと分かりずらいが、「Closed. Good Boy.」と表示している。
![IMG_4705.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885795/65715d39-fabe-8680-e110-c201d825abea.jpeg)

こちらは冷蔵庫が開いたままの状態で放置されている状態のobnizである。
こちらも逆さになってしまっているが、「Opening!!!!!」と表示している。
![IMG_4708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885795/cb7bc9c8-26a7-9893-2241-dfae981b8a3b.jpeg)

そしてLINE Botの動きがこちらだ。

https://twitter.com/Yuki_Tamura_85/status/1587124375026688000


このように、疑似的な母親がLINE Botの化身と化して私のもとに忠告を入れに来てくれるのだ。
冷蔵庫の開けっ放しにも気が付けるし、母親の懐かしさも感じることができるし、一石二鳥ではないか（私の母親は優しかったが）。

# 使用したもの
### obnizにかかる材料
* obniz Board 1Y
* ミニブレッドボード BB-601（白）
* 超音波距離センサー HC-SR04
* ブレッドボード・ジャンパーワイヤ（オス－オス） 10cmセット
### 環境等
* Node-RED（Heroku上）
* LINE messaging API

# プロダクト概要
冷蔵庫の扉上部に超音波距離センサーを設置し、冷蔵庫上に設置している電子レンジとの距離を30秒間隔で計測している。
計測時に超音波距離センサーと電子レンジの距離が5cm以上離れていた場合、LINE Botへ通知が送信される。

# 開発したフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885795/2ddc2799-906e-e0a0-a47c-513fd47a1e9f.png)

### 距離センサーの処理について
* 距離は、小数部分は切り捨てとしている。
* 5cm以上離れている場合に、冷蔵庫が開いていると判定する。

```php
msg.payload = await obnizParts.hcsr04.measureWait();

const led = obniz.wired('LED', { anode: 10, cathode: 11 });
const speaker = obniz.wired('Speaker', { signal: 6, gnd: 7 });

obniz.display.clear(); // クリア
obniz.display.print('Ready');

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

// 距離を取得
let distance = msg.payload;

// そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい
distance = Math.floor(distance);

// 距離(mm)をデバッグに表示
msg.payload = (distance + ' mm');

// obnizディスプレイに表示
// 一度消してから距離+mmの単位を表示
obniz.display.clear();
obniz.display.print(distance + ' mm');

// 冷蔵庫が開いているかどうかの判定
if (distance > 50) { // 50mm = 5cm 以上の場合
    // obnizディスプレイに'Opening!!!!!'と表示
    obniz.display.clear();
    obniz.display.print('Opening!!!!!');
}else{
    //冷蔵庫が閉まっている場合、ディスプレイに'Closed. Good Boy.'と表示
    obniz.display.clear();
    obniz.display.print('Closed. Good Boy.')
}

return msg;
```

### 初期化処理について

```php
obniz.display.clear(); // 画面を消去

obnizParts.hcsr04 = obniz.wired("HC-SR04",{ gnd:0, echo:1, trigger:2, vcc:3 });
```

### ソースコード
```
[{"id":"e42d3d96.12046","type":"obniz-repeat","z":"1635f58635da349d","obniz":"329589f7b722ade5","name":"","interval":"30000","code":"msg.payload = await obnizParts.hcsr04.measureWait();\n\nconst led = obniz.wired('LED', { anode: 10, cathode: 11 });\nconst speaker = obniz.wired('Speaker', { signal: 6, gnd: 7 });\n\nobniz.display.clear(); // クリア\nobniz.display.print('Ready');\n\n//カウント用意\n    let count = 0;\n\n// 距離を取得\nlet distance = msg.payload;\n\n// そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい\ndistance = Math.floor(distance);\n\n// 距離(mm)をデバッグに表示\nmsg.payload = (distance + ' mm');\n\n// obnizディスプレイに表示\n// 一度消してから距離+mmの単位を表示\nobniz.display.clear();\nobniz.display.print(distance + ' mm');\n\n//5cm以下になった回数をカウント\n        if (distance > 50.0) {\n            count += 1;\n        }else {\n            count = 0;\n        }\n        \n        //カウントが１０以上（１０分間冷蔵庫があきっぱなしの時）アラートをかける\n        if (count >= 10) {\n            //obnizの画面で警告\n            obniz.display.clear();\n            obniz.display.print('Close the fridge right now.');\n            // LEDオン\n            obnizParts.led.on();\n            // 音を鳴らす\n            obnizParts.Speaker.play(1000); \n        }else{\n            //カウントが0に戻る（扉が閉じる）タイミングでアラートを消す\n            obnizParts.led.off();\n            obnizParts.Speaker.stop();\n        }\n\n// 冷蔵庫が開いているかどうかの判定\nif (distance > 50) { // 50mm = 5cm 以上の場合\n    // obnizディスプレイに'Opening!!!!!'と表示\n    obniz.display.clear();\n    obniz.display.print('Opening!!!!!');\n}else{\n    //冷蔵庫が閉まっている場合、ディスプレイに'Closed. Good Boy.'と表示\n    obniz.display.clear();\n    obniz.display.print('Closed. Good Boy.')\n}\n\nreturn msg;","x":230,"y":280,"wires":[["84f07d3252236268"]]},{"id":"329589f7b722ade5","type":"obniz","obnizId":"****-****","deviceType":"obnizboard1y","name":"","accessToken":"","code":"obniz.display.clear(); // 画面を消去\r\n\r\nobnizParts.hcsr04 = obniz.wired(\"HC-SR04\",{ gnd:0, echo:1, trigger:2, vcc:3 });\r\nobnizParts.Speaker = obniz.wired(\"Speaker\",{ signal:6, gnd:7 });\r\nobnizParts.led = obniz.wired('LED', { anode:10, cathode:11 });"}]
```

# 後書き
本稿の序盤に添付している画像をご覧いただければお分かりになる通り、超音波距離センサー以外にもスピーカーとLEDライトを接続して追加機能の試みを実施した。
しかしなぜかうまく噛み合わず、プロダクトの撮影時には付属品と化していた。

ただ、そんなことはありながらも、私が作りたかったものを実装することができ、今後も利用し続けることを考えているLINE Botも併せて取り入れることができたので、個人的には満足している。

モノとしてよりよくするために、距離センサー以外のパーツと組み合わせてよりよくするための更新も進めていきたい。