10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

obnizとLineBotで防犯ツールを作ってみた(NO MORE XX 泥棒)

Posted at

この記事を見てできること

LINEBOTに「スタート」とメッセージを送ると遠隔操作で監視をしてくれるものが作れます。
異常があったら必要以上にしつこく知らせてくれます。
(処理をストップさせる処理は書いてないです)

obnizの配線

配線はこんな感じ。
IMG_0140.JPG

コード内にも書いてありますが、人感センサーは {vcc:11, signal:10, gnd:9} につなぎます。

ソースコード

はじめobniz.onconnectをするタイミングでハマって動かなかった。
handleEventよりも先にobniz.onconnectをしておく必要がある。

line_sensor.js
'use strict';

// obniz呼び出し
const Obniz = require('obniz');
var obniz = new Obniz("XXXXXX");  // Obniz_ID に自分のIDを入れます

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelAccessToken: 'XXXXXX',
    channelSecret: 'XXXXXX'
};

const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

// obniz接続//////////
// スコープ(変数の影響範囲)を最上部に置いておく
var sensor;
var led;

// 接続した段階でセンサーの準備はしておく
obniz.onconnect = async function(){
    obniz.display.clear();
    obniz.display.print("obniz LINE bots");
    sensor = obniz.wired("HC-SR505", {vcc:11, signal:10, gnd:9});
    led = obniz.wired("LED",{anode:0,cathode:1});
}

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  let mes = ''
  if(event.message.text === 'スタート'){
    mes = 'OK!監視始めるね!'; //メッセージだけ先に処理
        // ディスプレイ処理
        obniz.display.clear();  // 一旦クリアする
        obniz.display.print("Hello obniz!!!!!!");  // Hello obniz!という文字を出す
      
        // setIntervalで間隔を作る
        setInterval(async function(){
          // 非同期で取得
          var detected = await sensor.getWait();
          // console.log(detected);
          // displayに反映
          obniz.display.clear();  // 一旦クリアする
          // obniz.display.print(detected);  // 英語が出力できる
          // 近づいてきたら判定する
         if(detected == true ){ // 何かを感知したら
            obniz.display.clear();  // 一旦クリアする
            obniz.display.print("someone moving!");
            led.on(); // ライトON
            getAskObniz(event.source.userId);  // message
          }else{
            led.off();
          } 
        },1000); // 1000ミリ秒 = 1秒

  }else{ mes = event.message.text;}

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: mes
  });
}

const getAskObniz = async (userId) => {
  await client.pushMessage(userId, {
      type: 'text',
      text: "誰かいるかも?",
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

XXXXXXになっている箇所は自分のObniz IDや、channelAccessToken、channelSecretを入れることをお忘れなく。

ほぼ完成

ここまで機能としては完成です。こんな感じで動きます。
IMG_0141.jpg
人を感知すると知らせてくれます。

このままでは終われない

こういった手で触れるものは見た目も大事。そして遊び心も必要です(たぶん)

この時点で平日の夜中2時を回っている。当然明日も朝から仕事である。

考えても何もアイデア浮かばない。。
ティッシュがあるからてるてる坊主?
いや、最近ティッシュやトイレットペーパーがなかなか売ってないから無駄使いはダメだ...

「よし、映画館のあいつを作ろう」
IMG_0134.JPG

こんな感じで動きます

最後に

物理的に触れるものは愛着湧きますね。もっと時間がある時にもっとそれっぽく作りたい。
あと、LINEでストップとメッセージしたらモニタリングがストップするような処理も書きたい。

10
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?