LoginSignup
35
19

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-17

目的

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

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

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

 こうしてみると?


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

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

 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);
};
35
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
19