あけちゃダメな箱の完成版と在宅医療への応用

まずは完成版の動画をご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/2lCnQl0JT0E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

obnizの距離センサーで箱を開けたことを感知して、箱を開けると光って声がし、さらにLINEで通知もくるという仕組みです。

# 背景
前回の記事では、箱を開けると光ってブザーがなるというものを作りました。

https://qiita.com/naokiuc/items/7aecf478e8893d41f16f

前回できなかったLINE連携ができたので記事にしていて、さらに音も前回のシンプルなブザーではなく入力した声が出るようにしています。

# 環境
**ソフトウェア**
Visual Studio Code v1.60.1
Node.js v16.10.0

**ハードウェア**
[obniz Board 1Y](https://obniz.com/ja/products/obnizboard#areapdctSpec)
[LEDライト](https://obniz.io/ja/sdk/parts/LED/README.md)
[距離センサー](https://obniz.com/ja/sdk/parts/HC-SR04/README.md)
[Grove_MP3](https://obniz.com/ja/sdk/parts/Grove_MP3/README.md)
スピーカー(キャンドゥで500円の有線スピーカー)

# LINEとの連携
前回できなかったLINE連携に関して、メッセージ起点ではなくobniz起点で動かしたいためプッシュメッセージを使うことがわかり、参考にした記事がこちらです。

https://qiita.com/n0bisuke/items/7c2616068cb918ba31a5

# 登録した声を出す
単にブザーがなるよりも自分の声がしたほうが子どもたちが喜ぶと考えました。
参考にした記事がこちら。

https://qiita.com/shoito66/items/1f334deafe722c2a8cd7

ここで紹介されている[Grove_MP3](https://obniz.com/ja/sdk/parts/Grove_MP3/README.md)を使いました。

<details><summary>しかし、実際に使うまでにいくつもつまづいたので上記記事と重なる部分もありますがこちらに書いておきます。</summary><div>

まず、Grove_MP3を買うだけではObnizにつなげられません。
[GROVE - 4ピン - ジャンパオスケーブル](https://www.switch-science.com/catalog/6245/)を買う必要があります。

また、Grove_MP3で使えるマイクロSDカードは8Gのものです。
コンビニや電気屋さんで買おうとすると16G以上のものしか売っていないことがほとんどなので、こちらも通販で買うことをお勧めします。

当然ですが、Grove_MP3ではMP3の音しか再生できません。
普通に声を録音するとMP4になってしまうので、[こちらのアプリ](https://apps.apple.com/jp/app/mp3%E5%A4%89%E6%8F%9B-%E6%8A%BD%E5%87%BA-easy-mp3-converter/id1435666023)を使ってMP3に変換しました。

Grove_MP3を使用する際、「MP3」というフォルダを作って「0001.mp3」のように数字４桁のファイル名にしておく必要があります。
この4桁の数字を使うことで任意の音声を呼び出すことができます。

</div></details>

# コード
<details><summary>実際のコードはこちらです。</summary><div>

```js
'use strict';

const Obniz = require('obniz');
const obniz = new Obniz('obniz_ID');
const line = require('@line/bot-sdk');

const config = {
    channelSecret: 'チャネルシークレット',
    channelAccessToken: 'チャネルアクセストークン'
};
const client = new line.Client(config);

obniz.onconnect = async function () {
  // 超音波測距センサを利用する
  const hcsr04 = obniz.wired('HC-SR04', { gnd: 0, echo: 1, trigger: 2, vcc: 3 });
  // RGB LEDを利用
  const rgbled = obniz.wired('WS2811', { gnd: 5, vcc: 6, din: 7 });
  // MP3プレーヤーを利用
  const mp3 = obniz.wired("Grove_MP3", { gnd: 8, vcc: 9, mp3_rx: 10, mp3_tx: 11 });
  await mp3.initWait();
  //ボリュームを30に設定
  mp3.setVolume(30);

  setInterval(async function () {
      // 距離を取得
      let distance = await hcsr04.measureWait();
      console.log(distance + ' mm');
       // そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい
        //distance = Math.floor(distance);

       // 距離が8cm以上かどうかの判定
      if (distance > 80) {　// 80mm = 8cm 以上の場合　
        await main();
        ///光る
        rgbled.rgb(255, 0, 0);
        //MP3フォルダ内の「0001」から始まるMP3ファイルを再生
        mp3.play(1);
      }else {
        rgbled.rgb(0, 0, 0);
        mp3.stop();
      }
  }, 4000); // 4000ミリ秒 = 4秒おきに実行
}

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);
    }
}
```
</div></details>

# 子どもで実行
実際に子どもで試したのがこちら。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Or6FOTD1RVo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

制作過程で「あけちゃダメって言っただろ」の声が漏れててネタバレしてたためか、「フフッ」と薄い反応でした、、、
もっと喜んでくれるかと思ったのに残念！！
次はもっと秘密裏に制作する必要がありそうです。

# 医療現場での応用について
私は在宅医療に携わる医師です。
この仕組みを用いれば、在宅医療の現場にも応用できると考えました。

たとえば、この箱の中に日々の内服薬を入れておくと、箱を開けるとLINE通知が家族に飛ぶようにできるので薬を飲んだかどうかを知ることができます。

また、今回は箱の中に距離センターを入れて蓋を開けたことを検知するようにしていますが、[CDS](https://akizukidenshi.com/catalog/g/gI-00110/)を使って照度センサーとする仕組みを使えば、リビングが明るくなったらLINE通知して離れて住む家族の生活リズムを知ることもできます。
参考記事

https://zenn.dev/protoout/articles/01-obniz-nodejs-cds

また、以前書いた部屋の温度に反応する仕組みに今回の仕組みを応用すると、室温が上がると孫の声で「クーラーつけてね」と言って、離れた家族に通知が来るということも実装可能です。

https://qiita.com/naokiuc/items/171fee6d2b8503a2f0e0

ObnizとLINEがつながると、いろんな応用が効きますね！