振り向かずに「俺に何か用かい？さっきから尾けてきてるね」とシティーハンターっぽく言えるようになるプロダクト

#目的
　昨今ソーシャルディスタンスと言われ、人と人との距離があくようになりましたね。
　そんな中で後ろから近づいてくる人がいたら、怖いですよね。
　__早く気づいて__、先手を打ってシティーハンターっぽく話しかける準備をするためのツールを作りました。
　（セリフはお好みです。）
　そう、まずは気づくことが大事なのです！

　シティーハンターって何？と思った方は[こちら](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%86%E3%82%A3%E3%83%BC%E3%83%8F%E3%83%B3%E3%82%BF%E3%83%BC "シティーハンター")

#出来上がったもの（CHになれたか）
　こうしてみると？
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何かを近づけてみる <a href="https://t.co/V8FJNOvpCJ">pic.twitter.com/V8FJNOvpCJ</a></p>&mdash; Sugizo (@Sugizo50073508) <a href="https://twitter.com/Sugizo50073508/status/1317375274770575360?ref_src=twsrc%5Etfw">October 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
　
　こうなります↓　あまりメッセージがないのでキャプチャ
　![ushiro.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/027c567a-2026-253e-7896-6a4b76d06e68.png)

　★参考　取得した距離とまるめた後の距離
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/0a8a5f24-45a6-52af-5a75-92f9f97260a1.png)


　5秒単位で後ろに超音波を飛ばして、その跳ね返りから距離を測定するセンサーを使いました！
　★参考URL
　　[超音波センサー](https://obniz.io/ja/sdk/parts/HC-SR04/README.md "超音波センサー")

#環境
　Node.js v14.9.0
　Visual Studio Code v1.49.3
　@line/bot-sdk

#使い方
　１．情報を受けるプログラムを起動しておく
　２．リュックからひょっこりセンサーを出しておく
　　　（obnizは電源にはつないカバンの中へ。センサーはボタンかな？と思われそう。）
　３．後ろから人が尾けてくる
　__４．最後は決め台詞でどうぞ！__

#処理の流れ
　センサーで検知！
　→obnizで拾う
　→サーバのプログラムで受ける
　→LINEサーバ
　→LINEのトーク画面にプッシュ！

#今回できなかったけど、やってみたいこと
　１．セリフは自分→シティーハンターの音声を再生
　２．コードをさしっぱなし→電池式
　３．センサーで受けたことに対して、動作も何か入れたい

#ソース
```javascript:alert_distance
// ########################################
//          obniz処理部分
//  Obniz_ID：自分のobniz ID（XXXX-XXXX）
// ########################################
const fs = require('fs');
const Obniz = require('obniz');

// 外だしファイルからobniz_idを取得
const obniz_setting = JSON.parse(fs.readFileSync('./credential/obniz.json', 'utf8'));

const obniz = new Obniz(obniz_setting.id);

// obnizと接続確立したとき
obniz.onconnect = async () => {
    obniz.display.clear();
    obniz.display.print('obniz Ready');
}
obniz.onconnect = async function () {
    // 超音波測距センサを利用する
    const hcsr04 = obniz.wired('HC-SR04', { gnd: 0, echo: 1, trigger: 2, vcc: 3 });

    // ディスプレイ
    obniz.display.clear(); // クリア
    obniz.display.print('Stay away!');
    //obniz.display.print('Hello obniz!'); // Hello obniz! と表示

    // setIntervalで一定間隔で処理
    setInterval(async function () {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        console.log(distance);
        // mに変更 小数点以下の桁が多かったので、第1位で切り捨て
        let distance_m = Math.floor(distance / 100) / 10;
        // 距離(m)をターミナルに表示
        console.log(distance_m + ' m');
        // obnizディスプレイに表示
        // 一度消してから距離+mmの単位を表示
        obniz.display.clear();
        obniz.display.print(distance_m + ' m');
        const SOCIAL_DISTANCE = 2.0;
        // 距離が一般的なソーシャルディスタンス未満かどうかの判定
        if (distance_m < SOCIAL_DISTANCE) { 
            // obnizディスプレイに近接していることを表示
            obniz.display.clear();
            obniz.display.print('Too close!!');
            // LINEにメッセージをプッシュする関数を呼び出し
            await pushAlert(distance_m);
        }

    }, 5000); // 5000ミリ秒 = 5秒おきに実行
}


// ########################################
//          LINEBot イベント処理部分
//  channelSecret：LINE Developers → チャネル基本設定 → チャネルシークレット
//  channelAccessToken：LINE Developers → Messaging API設定 → チャネルアクセストークン（長期）
// ########################################
// Messaging APIで利用するクレデンシャル（秘匿情報）です。
const credential = JSON.parse(fs.readFileSync('./credential/credential.json', 'utf8'));
const user = JSON.parse(fs.readFileSync('./credential/line_user.json', 'utf8'));

const config = {
    channelSecret: credential.channelSecret,
    channelAccessToken: credential.channelAccessToken
};
const userId = user.source.userId;

const line = require('@line/bot-sdk');
const client = new line.Client(config);
// ソーシャルディスタンス内に人が近づいたらメッセージプッシュ！Messaging APIイベントを渡されて処理するところ
function pushAlert(distance_m){
    try{
        client.pushMessage(userId, {
                type: 'text',
                text: '後ろに、、、いるよ、、、距離 '+ distance_m +'m',
        });
    }catch(err){
        console.log(err.name +  ': ' + err.message);
        process.exit(-1);
    }
    // resolveを返す
    return Promise.resolve(null);
};
```