ハッカソンでのリアルタイムメモ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ハッカソン！人生2回目<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a></p>&mdash; sawa (@sawakoshi_yy) <a href="https://twitter.com/sawakoshi_yy/status/1319808479859634177?ref_src=twsrc%5Etfw">October 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#アイデア作成方法
①世の中で「強度」が強いキーワードと、強度が弱いキーワードを「適当」に記載

②「カラオケをする」・「カラオケに行く（する）まで」・「カラオケでの出来事」・「カラオケ後の出来事」・「カラオケルームの使い方」なキーワードをみんなで出していく

③　①×②の組み合わせを作っていく

④　③のアイデアを考える

#自チームのアイデア検討
・合コンBot
コロナの影響でカラオケもソーシャルディスタンス
遠くの人とは話せない
↓
ある程度の時間？光が明るすぎたり、距離が離れすぎてると、アドバイス＋きっかけを持たせてくれるLINEBot
２人の思い出に残りそうな（写真にも残せそうな）ドリンクをお店からサービス

感想：使える技術が少ないと考える幅も狭い。。


#コード

明るさ1回取得

```javascript
const voltage3 = obniz.ad10.start();
```

明るさ変化するたびに取得

```javascript
obniz.ad10.start((voltage) => {
    // センサーの値が変わるたびに実行される
    console.log(`changed to ${voltage} v`);
    if(voltage>4.9 && ltflg==false){
        ltflg=true;
        pushAlert(distance_m);
        console.log(`明るくなった`);
    }
    if(ltflg==true && voltage<4.5){
        ltflg=false;
        console.log(`暗くなった`);
    }
});
```

・LINEのユーザーIDは、同じユーザーであっても取得元によりIDが変わる
　→相手先コードと同じ

・自分以外のユーザーIDの取り方
相手のリクエストを受け付けるBot作る
Botを友達追加してもらう
なにか投稿してもらう
VSコードでログ見る




<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">めっちゃアドバイスしてくれる。。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/EA6NRsLTF1">pic.twitter.com/EA6NRsLTF1</a></p>&mdash; sawa (@sawakoshi_yy) <a href="https://twitter.com/sawakoshi_yy/status/1319914197140959232?ref_src=twsrc%5Etfw">October 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">池の水全部抜く。<br>手元にあるセンサ全部使う。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/gxVHGS4NAc">pic.twitter.com/gxVHGS4NAc</a></p>&mdash; sawa (@sawakoshi_yy) <a href="https://twitter.com/sawakoshi_yy/status/1319891749490180098?ref_src=twsrc%5Etfw">October 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#コード
```javascript:
// ########################################
//          obniz処理部分
//  Obniz_ID：自分のobniz ID（XXXX-XXXX）
// ########################################
const fs = require('fs');
const Obniz = require('obniz');
const line = require('@line/bot-sdk');
let ltflg = false;
let message = '';

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

const obniz = new Obniz('obnizの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 });
    // 温度センサ
    const tempsens = obniz.wired('LM60', { gnd: 4, output: 5, vcc: 6 });

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

    // setIntervalで一定間隔で処理
    setInterval(async function () {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // mに変更 小数点以下の桁が多かったので、第1位で切り捨て
        let distance_m = Math.floor(distance / 100) / 10;
        console.log(distance_m + ' m');
        // 温度を取得
        const temp = await tempsens.getWait();
        console.log('温度' + temp + '度');
        // 明るさを取得    
        obniz.io9.output(true);  // io0電圧を5Vに（電源＋）
        obniz.io11.output(false); // io2電圧を0Vに（電源−）
        const voltage = obniz.ad10.start();
        console.log('明るさ' + voltage);

        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 far!!');
            message = 'もうちょっと近づいちゃいなよ。'
            // LINEにメッセージをプッシュする関数を呼び出し
            await pushAlert(message);
        }

        //温度が低すぎるか判定
        const TEMP_LOW = 23;
        const TEMP_HIGH = 28;
        if (temp < TEMP_LOW) { 
            // obnizディスプレイに近接していることを表示
            obniz.display.clear();
            obniz.display.print('Too cold!!');
            // LINEにメッセージをプッシュする関数を呼び出し
            message = '寒いからくっついちゃおう。'
            await pushAlert(message);
        }
        if (temp > TEMP_HIGH) { 
            // obnizディスプレイに近接していることを表示
            obniz.display.clear();
            obniz.display.print('Too hot!!');
            // LINEにメッセージをプッシュする関数を呼び出し
            message = '暑いから1枚脱ごっか。'
            await pushAlert(message);
        }

        //明るすぎるか判定
        const LUMINANCE = 4.4;
        if (voltage > LUMINANCE) { 
            // obnizディスプレイに近接していることを表示
            obniz.display.clear();
            obniz.display.print('Too luminous!!');
            // LINEにメッセージをプッシュする関数を呼び出し
            message = 'もうちょっと暗くした方がいいんじゃない。'
            await pushAlert(message);
        }
    }, 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 user = 'ユーザーID';

// Messaging APIで利用するクレデンシャル（秘匿情報）です。
//const config = {
//    channelSecret: credential.channelSecret,
//    channelAccessToken: credential.channelAccessToken
//};
const config = {
    channelSecret: 'ああああ',
    channelAccessToken: 'いいいい'
};
//const userId = user;
const userId = ['ユーザーID','ユーザーID'];

const client = new line.Client(config);


// ソーシャルディスタンス内に人が近づいたらメッセージプッシュ！Messaging APIイベントを渡されて処理するところ
function pushAlert(message){
    try{
        const messageLine={
            type: 'text',
            text: message,
        };
        client.multicast(userId,
        [messageLine]
        );
        // client.pushMessage(userId, {
        //        type: 'text',
        //        text: '「肉と酒」と「きなこ」さん。もうちょっと照明をおとしてもいいんじゃない？近づいちゃいなよ。',
        // });
    }catch(err){
        console.log(err.name +  ': ' + err.message);
        process.exit(-1);
    }
    // resolveを返す
    return Promise.resolve(null);
};
```