【obniz×LINE】音と光を使い侵入防止システムを製作する

#目的
私の実家では、夏場に玄関を開放し風通しを良くしていると、野良猫が侵入し、食べ物が被害にあいます、そこで今回はobnizで侵入防止システムを製作したいと思います。(効果は保証できません)

#できたもの
距離センサーの50㎝以内に入り5秒経過したら、LEDとスピーカーで警告し、システムが作動したことをLINE Messaging APIを使用してプッシュ通知します。映像ではわかりませんが、スピーカーから11khzの音を鳴らしてます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">野生動物の侵入防止システムを作ってみました！設置してみたら効果あるかな？<a href="https://t.co/2TJMhJLdeY">https://t.co/2TJMhJLdeY</a><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a>　<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><br> <a href="https://t.co/fnvjGlw3V1">https://t.co/fnvjGlw3V1</a> <a href="https://t.co/J7YWuMazsL">pic.twitter.com/J7YWuMazsL</a></p>&mdash; Toshiki (@Hirasawa1987) <a href="https://twitter.com/Hirasawa1987/status/1288267485226172417?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#構成


##全体像
今回製作したシステムの全体像です。
[![Image from Gyazo](https://i.gyazo.com/f5fd16ce04cfc917815c8e8e2538b31d.png)](https://gyazo.com/f5fd16ce04cfc917815c8e8e2538b31d)

##配線図
obnizの配線図です。
![Untitled Sketch_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/04c25cbc-4ec3-0e47-15b0-bf830c1d126c.png)

##使用部品
- obniz Board 1Y
    - https://obniz.io/ja/products/obnizboard1y/
    - 6,300円(税抜)

- 抵抗内蔵５ｍｍ青色ＬＥＤ（５Ｖ用）　ＯＳＢ５ＳＡ５Ｂ６４Ａ－５Ｖ
    - http://akizukidenshi.com/catalog/g/gI-12519/
    - 25円(税込)
- 圧電スピーカー（圧電サウンダ）（１３ｍｍ）ＰＫＭ１３ＥＰＹＨ４０００－Ａ０
    - http://akizukidenshi.com/catalog/g/gP-04118/
    - 30円(税込)
- シャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫ
    - http://akizukidenshi.com/catalog/g/gI-02551/
    - 450円(税込)
- 100均のタッパー
- USB タイプCのUSB2.0ケーブル(家にあったものを使用) 
- モバイルバッテリー(家にあったものを使用)

##環境
- node.js　v14.5.0
- @line/bot-sdk 7.0.0
- express 4.17.1
- obniz 3.7.0

#コード
```index.js
'use strcit';

const Obniz = require('obniz');
const obniz = new Obniz('××××-××××'); // Obniz_IDに自分のIDを入れます
const line = require("@line/bot-sdk");
const express = require("express");
const PORT = process.env.PORT || 3030;

const config = {
  channelSecret: '{チャネルシークレット}',
  channelAccessToken: '{アクセストークン}'
};
const userId = '{ユーザーid}';
const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
  console.log(req.body.events);
  Promise
    .all(req.body.events.map(handleEvent))
    .then((result) => res.json(result));
});

const client = new line.Client(config);


obniz.onconnect = async function () {
  // 各センサーを呼び出す
  // 距離センサーを呼び出す
  const GP2Y0 = obniz.wired("GP2Y0A21YK0F", {
    vcc:0,
    gnd:1, 
    signal:2
    });
  // 指す場所を変えているので対応した数字に変更
  // LEDを呼び出す
  const led = obniz.wired('LED', {
    anode:5,
    cathode:6
    });
  // スピーカーを呼び出す
  const speaker = obniz.wired('Speaker', {
    signal:10,
    gnd:11
    });
  obniz.display.clear(); // 一旦クリアする
  obniz.display.print('Hello obniz!'); // Hello obniz!という文字を出す

  // setIntervalで間隔を作る
  setInterval(async function () {
    const distance = await GP2Y0.getWait();
    // 距離(mm)をコンソールに表示
    console.log(distance + ' mm');
    // displayに反映
    obniz.display.clear(); // 一旦クリアする
    obniz.display.print(distance + ' mm'); // 英語が出力できる
    // 近づいてきたら判定する
    if (distance < 500) count++;
    else count = 0;
      switch(count) {
        case 5:
          obniz.display.clear(); // 一旦クリアする
          speaker.play(11000); // スピーカー On 11khz
          led.on();// LED ON
          //LINEにメッセージ送信
          await client.pushMessage(userId, {
            type: 'text',
            text: '侵入防止システムを発動しました',
            });
        break;
      default:
        speaker.stop();// スピーカー OFF
        led.off();// LED OFF
      }
  }, 1000); // 1000ミリ秒 = 1秒
};

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```
#参考にした記事
LINEmessagingAPIの基礎部分で参考にしました。
[1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)

Push通知の部分を参考にしました。
[LINE BOTでラズパイから部屋の温度を教えてもらう【Push API】【Node.js】]
(https://qiita.com/mochifuture/items/13bed5e961a1232a660e)

#失敗
LEDはフルカラーを使用し色を使い分ける予定でしたが、途中でショートさせて焼いてしまいました。ですので、今回は青色のLEDを使用しました。

#終わりに
今回は距離センサを使ったので遮るものすべてにはんのうしてしまいます。
[公式サイト](https://blog.obniz.io/en/example/)では、カメラで画像認識を使用している作例もあり、特定の対象物にのみ反応するようにAI機能を搭載できたらいいなと思いました。