超音波距離センサーを LINE Notify に通知しよう
超音波距離センサーを LINE Notify に通知してみましょう。
つないでみる
スターターキットにある超音波距離センサーをつなぎます。
ドキュメントは https://obniz.com/ja/sdk/parts/HC-SR04/README.md にあります。
このように、GND を 0 番ピンに合わせて挿しこみます。
しっかり最後まで差し込みましょう。
超音波距離センサーを LINE Notify と連携してみる
超音波距離センサーの反応をLINE Notify と連携してみましょう。
こちらを以前の内容は、すべて選択して消してから、エディタの内容を上書きします。
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
<h1>Simple LINE Notify!</h1>
<div id="obniz-debug"></div>
<script>
// 今回の obniz を指示するための設定
const obniz = new Obniz("OBNIZ_ID_HERE");
// 今回使う IFTTT Webhook の自分のキー
const IFTTT_WEBHOOK_YOUR_KEY = 'IFTTT_WEBHOOK_YOUR_KEY';
// 今回使う IFTTT Webhook の Event Name
const IFTTT_WEBHOOK_EVENT_NAME = 'line_notify';
// 接続後、ディスプレイに指示を出して、センサー取得
obniz.onconnect = async function () {
console.log("[distance]");
// ディスプレイ表示
obniz.display.clear();
obniz.display.print("[distance]");
const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
// 1秒ごとチェック
obniz.onloop = async function () {
// 距離取得
const distanceMM = await hcsr04.measureWait();
// 小数点切り捨て + mm から cm に変換
const distanceCM = Math.floor(distanceMM / 10);
console.log(`${distanceCM} cm`);
// ディスプレイ表示
obniz.display.clear();
obniz.display.print(`${distanceCM} cm`);
// 50 cm 以下だったら LINE Notify に通知
if(distanceCM < 50){
sendIFTTT('50 cm 以内に物体が近づいたよ!こわい!');
}
// 1秒ごと待つ
await obniz.wait(1000);
}
}
async function sendIFTTT(message) {
// IFTTT Webhook に fetch 関数で送る ////////////////////////////
// メッセージ内容を URLSearchParams で作る
// 実際のメッセージは message 値
const params = new URLSearchParams({
value1: message,
value2: 'value2',
value3: 'value3',
});
// 送る文字列に変換
const paramsString = params.toString();
// 設定
const config = {
method: 'GET',
mode: 'no-cors',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
// IFTTT Webhook の URL をつくる
const IFTTT_WEBHOOK_URL = `https://maker.ifttt.com/trigger/${IFTTT_WEBHOOK_EVENT_NAME}/with/key/${IFTTT_WEBHOOK_YOUR_KEY}?${paramsString}`;
console.log("IFTTT_WEBHOOK_URL");
console.log(IFTTT_WEBHOOK_URL);
// 送信
await fetch(IFTTT_WEBHOOK_URL, config);
console.log("OK")
}
</script>
</body>
</html>
コピーアンドペーストできたら、
// 今回使う IFTTT Webhook の自分のキー
const IFTTT_WEBHOOK_YOUR_KEY = 'IFTTT_WEBHOOK_YOUR_KEY';
の 'IFTTT_WEBHOOK_YOUR_KEY' シングルクオーテーションの中を IFTTT Webhook のキーに変更します。
こちらを実行して超音波距離センサーに 50 cm 以内で手を近づけると、LINE Notify にこのように知らせてくれます。
変化した時だけ通知する場合
先ほどのプログラムですと、手をかざしていると 1 秒ごとに通知が来てしまいます。
変化があるときだけ行う場合は、以下のようにしましょう。
こちらを以前の内容は、すべて選択して消してから、エディタの内容を上書きして 'IFTTT_WEBHOOK_YOUR_KEY' シングルクオーテーションの中を IFTTT Webhook のキーに変更します。
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
<h1>Simple LINE Notify!</h1>
<div id="obniz-debug"></div>
<script>
// 今回の obniz を指示するための設定
const obniz = new Obniz("OBNIZ_ID_HERE");
// 今回使う IFTTT Webhook の自分のキー
const IFTTT_WEBHOOK_YOUR_KEY = 'IFTTT_WEBHOOK_YOUR_KEY';
// 今回使う IFTTT Webhook の Event Name
const IFTTT_WEBHOOK_EVENT_NAME = 'line_notify';
// 以前の状態の記録
let previousStatus = 0;
// 現在の状態の記録
let currentStatus = 0;
// 接続後、ディスプレイに指示を出して、センサー取得
obniz.onconnect = async function () {
console.log("[distance]");
// ディスプレイ表示
obniz.display.clear();
obniz.display.print("[distance]");
const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
// 1秒ごとチェック
obniz.onloop = async function () {
// 距離取得
const distanceMM = await hcsr04.measureWait();
// 小数点切り捨て + mm から cm に変換
const distanceCM = Math.floor(distanceMM / 10);
console.log(`${distanceCM} cm`);
// ディスプレイ表示
obniz.display.clear();
obniz.display.print(`${distanceCM} cm`);
// 50 cm 以下だったら LINE Notify に通知
if(distanceCM < 50){
currentStatus = 1; // 物体あり
} else {
currentStatus = 0; // 物体なし
}
// 状態が変わったら通知
if(currentStatus != previousStatus){
if(currentStatus == 1){
sendIFTTT('50 cm 以内に物体が近づいたよ!こわい!');
} else {
sendIFTTT('物体なし');
}
// 状態の記録
previousStatus = currentStatus;
}
// 1秒ごと待つ
await obniz.wait(1000);
}
}
async function sendIFTTT(message) {
// IFTTT Webhook に fetch 関数で送る ////////////////////////////
// メッセージ内容を URLSearchParams で作る
// 実際のメッセージは message 値
const params = new URLSearchParams({
value1: message,
value2: 'value2',
value3: 'value3',
});
// 送る文字列に変換
const paramsString = params.toString();
// 設定
const config = {
method: 'GET',
mode: 'no-cors',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
// IFTTT Webhook の URL をつくる
const IFTTT_WEBHOOK_URL = `https://maker.ifttt.com/trigger/${IFTTT_WEBHOOK_EVENT_NAME}/with/key/${IFTTT_WEBHOOK_YOUR_KEY}?${paramsString}`;
console.log("IFTTT_WEBHOOK_URL");
console.log(IFTTT_WEBHOOK_URL);
// 送信
await fetch(IFTTT_WEBHOOK_URL, config);
console.log("OK")
}
</script>
</body>
</html>
previousStatus と currentStatus の値で状態を管理して、状態が変わったら、通知を送るようにしています。こうすることで、常に余分な通知せず、より良い仕組みを作ることができます。
実行してみると、状態が変わった時だけ通知していて、物体なしの状態が続いても物体ありから変化したときにも送られてます。
終了する
右上の終了ボタンをクリックします。
終了をすると obniz が処理待ちに戻ります。