Blynkを使った侵入警報システム

このプロジェクトでは、受動型赤外線(PIR)センサー(HC-SR501)を使用して、簡易な住宅侵入検知システムを実演します。 Blynkアプリでシステムが「外出モード」に設定されている場合、PIRセンサーが動きを監視します。 検出された動きは、Blynkアプリで通知をトリガーし、ユーザーに潜在的な侵入を警告します。

1. 回路の構築

注釈

ESP8266モジュールは、安定した動作環境を提供するために高い電流が必要です。9Vの電池が接続されていることを確認してください。

../_images/02-Wiring_intrusion_alert_system.png

2. Blynkの設定

注釈

Blynkに慣れていない場合は、これら2つのチュートリアルを先に読むことを強くお勧めします。 Blynkで始める方法 は、Blynkの初心者向けガイドで、ESP8266の設定とBlynkへの登録方法が含まれています。 Blynkを使用した炎警報システム は簡単な例ですが、手順の説明はより詳細です。

2.1 テンプレートの作成

まず、Blynkで 「Intrusion Alert System」 テンプレートを作成する必要があります。

../_images/02-create_template_shadow.png

2.2 データストリーム

esp8266とuno r4ボードからデータを受け取るために、 Datastreams ページで Virtual Pin 型の Datastreams を作成します。

  • 以下の図に従ってVirtual Pin V0を作成します:

    Virtual Pin V0 の名前を AwayMode に設定します。 DATA TYPEInteger にし、MINとMAXを 01 に設定します。

    ../_images/02-datastream_1_shadow.png
  • 以下の図に従ってVirtual Pin V1を作成します:

    Virtual Pin V1 の名前を Current status に設定します。 DATA TYPEString にします。

    ../_images/02-datastream_2_shadow.png

上記の手順に従って、2つのVirtual Pinを設定したことを確認してください。

../_images/02-datastream_3_shadow.png

2.3 イベント

次に、侵入の検出をログに記録し、メール通知を送る event を作成します。

注釈

コードの変更が必要になる可能性があるため、私の設定と一致させることをお勧めします。 EVENT CODEintrusion_detected として設定されていることを確認してください。

../_images/02-event_1_shadow.png

Notifications ページに移動し、メール設定を行います。

../_images/02-event_2_shadow.png

2.4 Webダッシュボード

侵入警報システムと対話するために Web Dashboard も設定する必要があります。

Web Dashboard ページに Switch widgetLabel widget をドラッグアンドドロップします。

../_images/02-web_dashboard_1_shadow.png

Switch widget の設定ページで、 DatastreamAwayMode(V0) に選択します。スイッチがオンになったときには「away home」を表示し、オフになったときには「at home」を表示するように、 ONLABELOFFLABEL を設定します。

../_images/02-web_dashboard_2_shadow.png

Label widget の設定ページで、 DatastreamCurrent status(V1) に選択します。

../_images/02-web_dashboard_3_shadow.png

2.5 テンプレートを保存

最後に、テンプレートを保存することを忘れないでください。

../_images/02-save_template_shadow.png

3. コードの実行

  1. ultimate-sensor-kit\iot_project\wifi\02-Intrusion_alert_system のパスの下で 02-Intrusion_alert_system.ino ファイルを開くか、このコードを Arduino IDE にコピーしてください。

  2. "Intrusion Alert System"のテンプレートを使用して、Blynkデバイスを作成します。その後、 BLYNK_TEMPLATE_IDBLYNK_TEMPLATE_NAME 、および BLYNK_AUTH_TOKEN を自分のものに置き換えてください。

    #define BLYNK_TEMPLATE_ID "TMPxxxxxxx"
    #define BLYNK_TEMPLATE_NAME "Intrusion Alert System"
    #define BLYNK_AUTH_TOKEN "xxxxxxxxxxxxx"
    
  3. 使用するWiFiの ssidpassword も入力する必要があります。

    char ssid[] = "your_ssid";
    char pass[] = "your_password";
    
  4. 適切なボードとポートを選択したら、 書き込み ボタンをクリックします。

  5. シリアルモニターを開き(ボーレートを115200に設定)、成功した接続などのプロンプトが表示されるまで待ちます。

    ../_images/02-ready_1_shadow.png

    注釈

    接続時に ESP is not responding というメッセージが表示された場合は、以下の手順に従ってください。

    • 9Vの電池が接続されていることを確認します。

    • RSTピンを1秒間GNDに接続してESP8266モジュールをリセットし、その後抜きます。

    • R4ボードのリセットボタンを押します。

    時折、上記の操作を3〜5回繰り返す必要がある場合もありますので、ご注意ください。

4. コードの説明

  1. 設定とライブラリ

    こちらでBlynkの定数と認証情報を設定します。ESP8266 WiFiモジュールとBlynkに必要なライブラリをインクルードしています。

    #define BLYNK_TEMPLATE_ID "TMPxxxx"
    #define BLYNK_TEMPLATE_NAME "Intrusion Alert System"
    #define BLYNK_AUTH_TOKEN "xxxxxx-"
    #define BLYNK_PRINT Serial
    
    #include <ESP8266_Lib.h>
    #include <BlynkSimpleShieldEsp8266.h>
    
  2. Wi-Fiの設定

    Wi-Fi認証情報を設定し、ESP01モジュールとのソフトウェアシリアル通信を構築します。

    char ssid[] = "your_ssid";
    char pass[] = "your_password";
    
    SoftwareSerial EspSerial(2, 3);
    #define ESP8266_BAUD 115200
    ESP8266 wifi(&EspSerial);
    
  3. PIRセンサーの設定

    PIRセンサーが接続されているピンを定義し、状態変数を初期化します。

    const int sensorPin = 8;
    int state = 0;
    int awayHomeMode = 0;
    BlynkTimer timer;
    
  4. setup()関数

    この関数では、PIRセンサーを入力として初期化し、シリアル通信を設定し、Wi-Fiに接続し、Blynkを構成します。

    • timer.setInterval(1000L, myTimerEvent) を使用して、setup()内でタイマー間隔を設定します。ここでは、 myTimerEvent() 関数を 1000ms ごとに実行するように設定しています。


    void setup() {
       pinMode(sensorPin, INPUT);
       Serial.begin(115200);
       EspSerial.begin(ESP8266_BAUD);
       delay(10);
       Blynk.config(wifi, BLYNK_AUTH_TOKEN);
       Blynk.connectWiFi(ssid, pass);
       timer.setInterval(1000L, myTimerEvent);
    }
    
  5. loop()関数

    loop関数では、BlynkとBlynkタイマー関数を繰り返し実行します。

    void loop() {
       Blynk.run();
       timer.run();
    }
    
  6. Blynkアプリとの対話

    これらの関数は、デバイスがBlynkに接続されたとき、およびBlynkアプリの仮想ピンV0の状態が変わったときに呼び出されます。

    • デバイスがBlynkサーバーに接続するたび、またはネットワークの状態が悪いために再接続するたびに、 BLYNK_CONNECTED() 関数が呼び出されます。 Blynk.syncVirtual() コマンドは、単一の仮想ピンの値のリクエストです。指定された仮想ピンは BLYNK_WRITE() 呼び出しを実行します。詳細は、 Blynk - State Syncing を参照してください。

    • BLYNKサーバー上の仮想ピンの値が変更されると、 BLYNK_WRITE() がトリガーされます。詳細は、 Blynk - BLYNK_WRITE() にあります。


    // This function is called every time the device is connected to the Blynk.Cloud
    BLYNK_CONNECTED() {
       Blynk.syncVirtual(V0);
    }
    
    // This function is called every time the Virtual Pin 0 state changes
    BLYNK_WRITE(V0) {
       awayHomeMode = param.asInt();
       // additional logic
    }
    
  7. データの処理

    myTimerEvent() 関数は毎秒 sendData() を呼び出します。Blynkで不在モードが有効になっている場合、PIRセンサーを確認して、動きが検出された場合にBlynkに通知を送信します。

    • Blynk.virtualWrite(V1, "Somebody in your house! Please check!") を使用して、ラベルのテキストを変更します。

    • Blynk.logEvent("intrusion_detected"); を使用して、Blynkにイベントをログします。


    void myTimerEvent() {
       sendData();
    }
    
    void sendData() {
       if (awayHomeMode == 1) {
          state = digitalRead(sensorPin);  // Read the state of the PIR sensor
    
          Serial.print("state:");
          Serial.println(state);
    
          // If the sensor detects movement, send an alert to the Blynk app
          if (state == HIGH) {
            Serial.println("Somebody here!");
            Blynk.virtualWrite(V1, "Somebody in your house! Please check!");
            Blynk.logEvent("intrusion_detected");
          }
       }
    }
    

参考資料