【説明】 超音波距離センサーを活用することで、煩わしい回数のカウントや、フォームの正しさを意識することなく、腕立て伏せに集中することが可能になります。 フレッシオーニ(Flessioni)はイタリア語で“腕立て伏せ”です。
【構成物】 obniz Board 1Y 抵抗内臓5mmLED 5V 赤・黄緑 ミニブレッドモード ブレッドボード・ジャンパーワイヤ 超音波距離センサー 圧電スピーカー
【How to Use】
フレッシオーニ師匠を起動
モード選択 ・カウントモード…シンプルに回数だけをカウントしてくれるモードです ・シンプルモード…事前に設定した目標回数までカウントしてくれるモードです。目標に到達したら終了ランプが点灯してレベルアップのメロディが流れます ・ランダムモード…目標を勝手に設定してカウントしてくれるモードです。目標に到達したら終了ランプが点灯してレベルアップのメロディが流れます。
モード選択したら腕立て伏せを開始します。正しい深度まで到達しないとカウントされません。カウントされると、okランプが点灯しつつ、ブザーでお知らせします。
リザルトがLINEに通知されるので確認してください。
【仕組み】
- 超音波距離センサーで使用者との距離を計測、一定の距離まで近づくとカウントする。カウントするとフラグが立つので離れてフラグをクリアしないと再カウントされない。不正はできない。 2.obnizのディスプレイでモード選択する。選択結果に応じて目標やリザルトのメッセージなどの設定が行われる。 3.目標を達成すると完了ランプ(緑のランプ)が点灯して、ドラクエのレベルアップメロディ(そうは聞こえない)が流れます。
- 終了するとLINE Notifyを通じて通知が届きます。
【ソースコード】
```Flessioni.js
const Obniz = require('obniz');
const { exit } = require('process');
const obniz = new Obniz('xxxxxxx); // Obniz_IDに自分のIDを入れます
const axios = require('axios');
const qs = require('querystring');
const BASE_URL = 'https://notify-api.line.me';
const PATH = '/api/notify';
const LINE_TOKEN = xxxxxxxxxxxxxxxxxxxx
;
const sleep = (msec) => new Promise(res => setTimeout(res, msec));
obniz.onconnect = async function () { // 超音波距離センサを利用 const hcsr04 = obniz.wired('HC-SR04', { gnd: 0, echo: 1, trigger: 2, vcc: 3, }); // RGB LEDを利用 const led1 = obniz.wired('LED', { anode: 4, cathode: 5 }); const led2 = obniz.wired('LED', { anode: 6, cathode: 7 });
const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });
//カウンター・フラグ
var count = 0;
var flg = 0;
var goal = 0;
var mode = 0;
var min = 1 ;
var max = 10 ;
var today = new Date();
var dmes = '';
var lmes = '';
obniz.display.clear();
obniz.display.print('Flessionni?\npush:count\nleft:simple\nright:random');
//最初にモードを選ぶ
obniz.switch.onchange = function (state) {
if (state === 'push') {
mode = 1;
goal = 99999;
obniz.display.clear();
obniz.display.print('count mode start!!');
}
if (state === 'left') {
mode = 2;
goal = 10;
obniz.display.clear();
obniz.display.print('simple mode start!!\n' + 'Goal:' + goal);
}
if (state === 'right') {
mode = 3;
goal = Math.floor( Math.random() * (max + 1 - min) ) + min ;
obniz.display.clear();
obniz.display.print('rundom mode start!!\n' + 'Goal:xxxx');
console.log(goal);
}
// setIntervalで定期実行
setInterval(async () => {
// 距離を取得
let distance = await hcsr04.measureWait();
// 小数点以下がたくさんあるのでここでは整数にします
distance = Math.floor(distance);
// 距離をコンソールに表示
console.log(distance + ' mm');
// 距離をobnizディスプレイに表示
obniz.display.clear();
obniz.display.print('count:' + count + '\nflg:' + flg + ' mode:' + mode + '\n' + distance + ' mm\n' + dmes);
// 距離によって判定
if (distance < 50.0) {
// 50mm = 5cm 未満の場合はカウント
if (flg == 0){
count +=1;
flg =1;
led1.on();
speaker.play(698); await sleep(200); speaker.stop();
}
} else {
// 50mmを超えたらフラグをクリア
flg =0;
led1.off();
}
//回数に応じてメッセージを編集
if ( 1 < count && count < 10 ){
dmes = 'good!!!!';
}else if ( 10 <= count && count < 100 ){
dmes = 'Great!!!!';
}else if ( 100 <= count ){
dmes = 'Marvelous!!!!';
}
//目標に到達したら、LEDを点灯してリザルトを発信
if (count == goal){
led2.on();
lmes = `よくやった!感動した!`
const message = `\n日付:` + today + `\n回数:` +count + `\n` + lmes //LINEに表示するメッセージ
let config = {
baseURL: BASE_URL,
url: PATH,
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${LINE_TOKEN}`
},
data: `message=${message}`
};
axios.request(config).then((res) => {
console.log(res.status);
})
count = 0;
speaker.play(698); await sleep(200); speaker.stop(); await sleep(50); //ファ
speaker.play(698); await sleep(100); speaker.stop(); await sleep(50); //ファ
speaker.play(698); await sleep(100); speaker.stop(); await sleep(50); //ファ
speaker.play(698); await sleep(100); speaker.stop(); await sleep(100); //ファ
speaker.play(659); await sleep(200); speaker.stop(); await sleep(100); //ミ
speaker.play(783); await sleep(200); speaker.stop(); await sleep(100); //ソ
speaker.play(698); await sleep(700); speaker.stop(); //ファ
}
//obnizのボタンを押したらリザルトを発信
obniz.switch.onchange = function (push) {
if (mode == 1){
lmes = `今日はこのくらいにしておくのかい?`
}else{
lmes = `この未熟者が、がっかりだ`
}
const message = `\n日付:` + today + `\n回数:` +count + `\n` + lmes //LINEに表示するメッセージ
let config = {
baseURL: BASE_URL,
url: PATH,
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${LINE_TOKEN}`
},
data: `message=${message}`
};
axios.request(config).then((res) => {
console.log(res.status);
})
count = 0;
};
}, 1000); // 1000ミリ秒 = 1秒ごとに実行
} }
</details>
いいねしました(*^▽^*)
モードを選べたり、音楽がいろいろなったり、
ただの実装プラスのこだわりがとても面白かったです♪
子どももとても喜びそう!!