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


目的

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

 シティーハンターって何?と思った方はこちら

出来上がったもの(CHになれたか)

 こうしてみると?


 
 こうなります↓ あまりメッセージがないのでキャプチャ
 

 ★参考 取得した距離とまるめた後の距離
 

 5秒単位で後ろに超音波を飛ばして、その跳ね返りから距離を測定するセンサーを使いました!
 ★参考URL
  超音波センサー

環境

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

使い方

 1.情報を受けるプログラムを起動しておく
 2.リュックからひょっこりセンサーを出しておく
   (obnizは電源にはつないカバンの中へ。センサーはボタンかな?と思われそう。)
 3.後ろから人が尾けてくる
 4.最後は決め台詞でどうぞ!

処理の流れ

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

今回できなかったけど、やってみたいこと

 1.セリフは自分→シティーハンターの音声を再生
 2.コードをさしっぱなし→電池式
 3.センサーで受けたことに対して、動作も何か入れたい

ソース

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);
};