#子どもが大好きな「ぜったいにおしちゃダメ?」
子どもが大好きな絵本の一つが、こちらの「ぜったいにおしちゃダメ?」です。
子どもに限らず、「押しちゃだめ」と言われれば押したくなるし、「開けちゃダメ」と言われれば開けたくなるって気持ちがわかる方は多いと思います。
そこで今回、obnizとLINE Bot、それに100均で買った箱を用いて、開けちゃいけない箱を開けたら光って音が鳴り、さらにLINEにお知らせがくる仕組みを作ろうと思いました。
が、エラーがクリアできずLINE Botとの連携はできませんでした。
#環境
ソフトウェア
Visual Studio Code v1.60.2
Node.js v16.10.0
ハードウェア
obniz Board 1Y
LEDライト
スピーカー
距離センサー
#まずはObnizを用いて、箱を開けたら光って音が出るものを作る
まずはシンプルにObnizを使って、箱を開けたら光って音がなる仕組みを作りました。
はじめは照度計を用いて箱を開けことを感知しようと考えましたが、照度計は熱くなるため子どもには危ないから、どう配置しようかと頭を悩ませました。
そこで、距離センサーであれば熱くなりにくいと考え、距離が10cmひらくと反応するように作りました。
サンプルコード
const Obniz = require('obniz');
const obniz = new Obniz('Obniz_ID'); // Obniz_IDに自分のIDを入れます
obniz.onconnect = async function () {
// 超音波測距センサを利用する
const hcsr04 = obniz.wired('HC-SR04', { gnd: 0, echo: 1, trigger: 2, vcc: 3 });
// RGB LEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 6, vcc: 7, din: 8 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });
// setIntervalで一定間隔で処理
setInterval(async function () {
// 距離を取得
let distance = await hcsr04.measureWait();
// そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい
//distance = Math.floor(distance);
// 距離が5cm以上かどうかの判定
if (distance > 50) { // 50mm = 5cm 以上の場合
///光る
rgbled.rgb(255, 0, 0);
// 1000Hz で音を鳴らす
speaker.play(1000);
}else {
rgbled.rgb(0, 0, 0);
speaker.stop();
}
}, 1000); // 1000ミリ秒 = 1秒おきに実行
}
#次に、LINE Botとも連携する。
上記の仕組みを使って、箱を開けたら光って音が鳴るだけでなくLINEにメッセージが届く仕組みの実装を目指しました。
しかし、なかなかうまくいかず。
Qiita QAでも聞いてみて、とても親切に回答をいただいただき、元のコードではLINEを送信する処理が必要とわかり、コードを追加してみましたがやはりうまくいきませんでした、、、
サンプルコード
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
}
// 距離が10cm以上かどうかの判定
if (distance > 100) { // 100mm = 10cm 以上の場合
///光る
rgbled.rgb(255, 0, 0);
// 1000Hz で音を鳴らす
speaker.play(1000);
return client.replyMessage(event.replyToken, {
type: 'text',
text: 'テスト' //実際に返信の言葉を入れる箇所
});
}else {
rgbled.rgb(0, 0, 0);
speaker.stop();
}
}, 1000); // 1000ミリ秒 = 1秒おきに実行
}
上のコードに関して、「L.39でhandleEvent関数の括弧を閉じてしまっているからエラーが出ている」とアドバイスをいただき、}の位置を変えたコードがこちらですが、やはりうまくいかず、、
サンプルコード
obniz.onconnect = async function () {
// 超音波測距センサを利用する
const hcsr04 = obniz.wired('HC-SR04', { gnd: 0, echo: 1, trigger: 2, vcc: 3 });
// RGB LEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 6, vcc: 7, din: 8 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });
// setIntervalで一定間隔で処理
setInterval(async function () {
// 距離を取得
let distance = await hcsr04.measureWait();
// そのままだと小数点以下の桁数がやたら多いので整数に丸めてもよい
//distance = Math.floor(distance);
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
// 距離が10cm以上かどうかの判定
if (distance > 100) { // 100mm = 10cm 以上の場合
///光る
rgbled.rgb(255, 0, 0);
// 1000Hz で音を鳴らす
speaker.play(1000);
return client.replyMessage(event.replyToken, {
type: 'text',
text: 'テスト' //実際に返信の言葉を入れる箇所
});
}else {
rgbled.rgb(0, 0, 0);
speaker.stop();
}
}, 1000); // 1000ミリ秒 = 1秒おきに実行
}
}
さらに、今回の仕組みであれば「リプライメッセージではなくプッシュメッセージを使うべき」ということがわかり、こちらの記事が参考になるというところまでは辿り着きました。
しかし、私の今の知識では、元記事のそれぞれのコードの意味するところがわからないため、自分のコードに生かすことは難しいと判断。
そこで、プッシュメッセージではなく、リプライメッセージを用いて「LINE Botに話しかける --> obnizで距離を測る --> ○センチ以上だったらメッセージを送信する」という流れであれば、この記事が参考になるということを教えてもらいました。
しかし、ここでタイムアップ。
リプライメッセージにすると、前半部分の「箱を開けたら」と連動してLINE Botを動かすわけにいかず、また別の動きとしてコードを書くことになりそうです。
今回の「あけちゃダメ」の箱について、LINE Botに連携しない単純なバージョンでも息子は大喜びでした。
子どもが喜び驚くにはどういった仕掛けがいいかを考えて改めて作り直そうと思います。