Closed15

【電子工作好き集まれ!】 IoTLTハッカソン ~ #obniz 縛り!

ぜらちんぜらちん

電子工作好きってわけではないけど。
参加したので色々と記録を残しておく。
テーマは『運動』
obnizで運動・・・?

ぜらちんぜらちん

走行距離とかかった時間をLINE Botに入力。
時速を計算。
算出した時速によってテンポの違うエレクトリカルパレードを流す。

ぜらちんぜらちん

まずはLINE Botでユーザーからの入力を受け取り、時速を計算するところまで作る。

ぜらちんぜらちん

テキストどおりにやってるのにできないのなんなの。
npm i -g ngrokでワーニング出てるのは関係ないの??

ぜらちんぜらちん

これは関係ないの?こんなの出たことあったかな。

npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.

changed 51 packages, and audited 52 packages in 6s

7 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
ぜらちんぜらちん

LINE2回メッセージ受け取れない。

現状のプログラムではユーザーからの入力1回に対して返信(リプライ)をすると処理が終了します。
そのため走行距離とかかった時間を2回に分けて入力させようとすると、ユーザーとのやり取りをデータベースに保持する必要があるので、今から実装するのは時間的に厳しいかも知れません。
走行距離とかかった時間を同時に入力させて関数内で分解して処理する方が楽だと思います。

ぜらちんぜらちん

だめだ。できなかった。
一応コードは残しておく。

'use strict'; // エラー判定を厳しくする(推奨)

// ########################################
//               初期設定など
// ########################################

// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');

// ローカル(自分のPC)でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;

// Messaging APIで利用するクレデンシャル(秘匿情報)です。
const config = {
  channelSecret: 'チャネルシークレット',
  channelAccessToken: 'チャネルアクセストークン'
};

// ########################################
//  LINEサーバーからのWebhookデータを処理する部分
// ########################################

// LINE SDKを初期化します
const client = new line.Client(config);

// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
  // 入力されたのがテキストメッセージ以外であれば半角数字入力を促すメッセージを表示
  if (event.type !== 'message' || event.message.type !== 'text') {
    return client.replyMessage(event.replyToken, {
    type: 'text',
    text: '走行距離(km)とかかった時間を『/』で区切り半角数字で入力してください。'
    });
  }

  let mes = event.message.text; // ユーザーが入力した走行距離(km)とかかった時間(分)
  let index = mes.indexOf('/');
  let kyori = Number(mes.substring(0, index)); // 距離
  let jikan = Number(mes.substring(index+1, mes.length)); // 時間

  // 時速計算(距離÷時間)小数点以下は切り捨て ×60で時速にする
  let sokudo = String(Math.floor((kyori / jikan) * 60)); 

  // 計算した時速を返す
  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: '時速' + sokudo + 'kmです。'
  });

}

// obniz部分は省略(別途記載)

// ########################################
//          Expressによるサーバー部分
// ########################################

// expressを初期化します
const app = express();

// HTTP GETによって '/' のパスにアクセスがあったときに 'Hello LINE BOT! (HTTP GET)' と返事します
// これはMessaging APIとは関係のない確認用のものです
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));

// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {

  // 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
  if (req.body.events.length === 0) {
    res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
    console.log('検証イベントを受信しました!'); // ターミナルに表示します
    return; // これより下は実行されません
  } else {
    // 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
    console.log('受信しました:', req.body.events);
  }

  // あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
  // 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
  Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});



// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);

ぜらちんぜらちん

obniz部分

// obniz
const Obniz = require('obniz');
const { exit } = require('process');
const obniz = new Obniz('Obniz_ID'); // Obniz_ID

// 任意の秒数待つことができる関数
const sleep = (msec) => new Promise(res => setTimeout(res, msec));

const note = 1600; //全音符・全休符
const note4 = note / 4; //4分音符・4分休符
const note8 = note / 8; //8分音符・8分休符
const note16 = note / 16; //16分音符・16分休符
const note32 = note / 32; //16分音符・16分休符/2

// **定数**音階
const dl1 = 293.665; // レ
const el1 = 329.628; // ミ
const fisl1 = 369.994; // ファ#
const gl1 = 391.995; // ソ
const al1 = 440; // ラ
const hl1 = 493.883; // シ
const c = 523.251; // ド
const d = 587.330; // レ

obniz.onconnect = async function () {
  const rled = obniz.wired('LED', { anode: 0, cathode: 1 }); //赤
  const bled = obniz.wired('LED', { anode: 2, cathode: 3 }); //青
  const gled = obniz.wired('LED', { anode: 4, cathode: 5 }); //緑
  // スピーカーを利用
  const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });

  // ディスプレイ表示(初期画面)
  obniz.display.clear(); // クリア
  obniz.display.print('ELECTRICAL PARADE');

  if (sokudo <= 5){
    // 時速5km以下は遅いエレクトリカルパレード
    const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
    speaker.play(gl1); rled.on(); await sleep(note4); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note4); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note4); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note4); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note4); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(al1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(hl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note4); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note4); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note4); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note4); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note4); speaker.stop(); rled.off(); 
    exit();
  } else if (sokudo <= 10) {
    // 時速10km以下は普通のエレクトリカルパレード
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(al1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(hl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note8); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note8); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note8); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note8); speaker.stop(); rled.off(); 
    exit();
  } else if (sokudo >= 11){
    // 時速11km以上は早いエレクトリカルパレード
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(al1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(hl1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(hl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(c); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(d); rled.on(); await sleep(note16); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note16); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(el1); gled.on(); await sleep(note16); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(al1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(hl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(al1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(gl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(fisl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(el1); rled.on(); await sleep(note32); speaker.stop(); rled.off(); await sleep(note32);
    speaker.play(fisl1); bled.on(); await sleep(note32); speaker.stop(); bled.off(); await sleep(note32);
    speaker.play(dl1); gled.on(); await sleep(note32); speaker.stop(); gled.off(); await sleep(note32);
    speaker.play(gl1); rled.on(); await sleep(note16); speaker.stop(); rled.off(); 
    exit();
  }
}
このスクラップは2021/11/07にクローズされました