対人センサーで侵入者を検知してSlackに通知するbot（ESP8266＆HC-SR501編）（人感センサモジュールの応用）

対人センサー（人感センサモジュール HC-SR501）で侵入者を検知してSlackに通知するbotを作ってみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">対人センサーで侵入者を検知してSlackに通知するbotを作ってみました。<br>人体の赤外線を検知すると赤色LEDが点灯してSlackに通知されます。<a href="https://twitter.com/hashtag/slack?src=hash">#slack</a> <a href="https://twitter.com/hashtag/iot?src=hash">#iot</a> <a href="https://twitter.com/hashtag/esp8266?src=hash">#esp8266</a> <a href="https://t.co/aCWX7mzUHC">pic.twitter.com/aCWX7mzUHC</a></p>&mdash; Yukito (@yukitter) <a href="https://twitter.com/yukitter/status/852658494192746496">2017年4月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

人を検知すると、赤色LEDが点灯して、こんな風に、ナマハゲがSlackに通知してくれます。
（検知には人体が発する赤外線を利用しています。）

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/68208ad6-e202-182f-041c-ed538641499a.png)


## 多分こんな応用ができるかと

- 一人暮らし方向けの留守中の侵入検知
- サーバールームの侵入検知
- ガレージの侵入検知
- 部屋の前の盗み聞き検知
- ロッカーが開けられた検知
- コレクション部屋の侵入検知？

*※応用を考えていたら人間不審になりそう。。。*

## パーツ
ESP8266とHC-SR501を主に使っています。

ESP8266は[NodeMcu Lua ESP8266 CH340](http://amzn.to/2zoZ2aj)という開発ボードを使っています。
購入は[Amazon](http://amzn.to/2zoZ2aj)がおすすめです。中国から届くのに時間がかかりますが、￥480と激安です。ピンヘッダも取り付け済みなので、ハンダ付け不要な部品です。

[HC-SR501](http://amzn.to/2p3YnGc)が対人センサー（人感センサー）で、￥145程度で購入できます。こちらも激安です。

あとは、検知中に光るLEDと抵抗330Ωを一個ずつ。

![P5000587.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/0117e56a-8b4b-a3e1-2fdc-d26e515efe3a.jpeg)

## 回路図 っぽいもの

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/baaff49c-0a38-e04f-a390-96f64ff6c80e.png)

- センサー（HC-SR501）について
    - 電源はDC4.5-20Vなので、開発ボードの5Vを繋いでいます
    - 出力は3.3VなのでGPIOの入力にそのまま繋いでいます
    - 半固定抵抗で、検知する距離（センター　5～7m,  サイド　3～4m）と、検知を継続する時間（3～200s）を調整できます
    - データシートは[こちら](http://www.datasheets-pdf.com/hc-sr501-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B7%E3%83%BC%E3%83%88/)

## ソースコード
[esp8266-slack-webhook](https://github.com/scott-linenberger/esp8266-slack-webhook)というライブラリを利用しています。

```c:HC-SR501.ino
#include "SlackWebhook.h"

// GPIO
int DetectPin = 14;
int LEDPin    = 13;

// wifi
const char* ssid     = "XXXXXXXX";
const char* password = "XXXXXXXXX";

// Slack
const char* host        = "hooks.slack.com";
const char* fingerprint = "ab f0 5b a9 1a e0 ae 5f ce 32 2e 7c 66 67 49 ec dd 6d 6a 38";
String url = "/services/XXXXX/XXXXX/XXXXX";
String slackBotName = "surveillance bot";
SlackWebhook webhook(host, url, fingerprint);

// other
int beforeDetectStatus = 0;


void setup() {
  // シリアル通信を開始
  Serial.begin(115200);
  Serial.println("Serial start.");

  // ピン設定
  pinMode(DetectPin, INPUT);
  pinMode(LEDPin,    OUTPUT);

  // wifi接続を開始
  WiFi.begin(ssid, password);
  Serial.println("WiFi start.");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

}

void loop() {
  
  int detect = digitalRead(DetectPin);   // 人を検知していれば1、していなければ0が返る
  digitalWrite(LEDPin, detect);          // 1を書き込むとLEDが点灯、0で消灯
  Serial.println(detect);

  if (detect == 1 && beforeDetectStatus == 0) {
    postSlackMessage("侵入者を検知しました！！！∑(=ﾟωﾟ=;)");
    beforeDetectStatus = 1;
  }else if (detect == 0 && beforeDetectStatus == 1){
    beforeDetectStatus = 0;
  }
  
  delay(100);
}

void postSlackMessage(String message) {
  String postData = "{\"username\": \"" + slackBotName + "\", \"text\": \"" + message + "\", \"icon_emoji\": \":japanese_ogre:\"}";
  webhook.postMessageToSlack(postData);
}

```
- Arduino IDEでビルドしてESP8266に書き込みます。
- 開発環境を構築するのは[こちら](http://qiita.com/yukitter/items/4304619f316b9f3c081f)が参考になります。