ホームへ

IoT試作の例 その3・玄関に訪問者(赤外線を発する物体)

機能

  1. この装置を玄関に設置すると、訪問者があったとき、どこにいてもスマホに通知が来る

システム概要

準備

  1. ネット上の、様々な事象に対する、様々なサービスを無料で行ってくれるIFTTTを利用します
  2. ここではNotificationsというサービスを使っています
  3. IFTTTに自分のIDを登録する
  4. IFTTTにサービスを申し込み、プログラムに組み込むキーを取得する、
  5. スマホ側にもIFTTTアプリをインストールしておきます
  6. このサービスを使うと、自前のレンタルサーバーを用意しなくても、いいので、誰でも手軽にIoTを始められますね

装置側

  1. 装置本体は、WiFi子機に設定し、建物内のWifi親機と通信する
  2. 人感(焦電型赤外線)センサーが反応したら、IFTTTサービスにデータを送る
  3. 玄関を出入りする作業などがあると、頻繁に通知が来ちゃうので、一度反応したら、3分休むようにしています
  4. 寝ているときに、チラシの配布などが来ると、うるさいので、夜中は休むようにプログラムしています

スマホ側お知らせ画面

  1. この装置からのデータがIFTTTに送られると、スマホ側にこのように通知が来ます

主要部品

  1. Wi-Fiモジュール ESP-WROOM-02 購入元:秋月電子 購入時価格@650円
  2. 焦電型赤外線センサー PaPIRs(VZ) 5m EKMC1601111 購入元:秋月電子 購入時価格@480円
  3. LED 各色 購入元:秋月電子 購入時価格@18円

システム仕様

  1. WiFiモジュール ESP8266のプログラム作成はarduino IDEを使用
    ARDUINOホームページ

    arduinoソースコード クリックで展開
                
    // ライブラリの読み込み
    #include <ESP8266WiFi.h>
    #include <time.h>
    
    //日本時間
    #define JST     3600*9
    
    // 転送レート
    #define SERIAL_SPEED  115200
    
    // Wi-Fi SSID
    #define WLAN_SSID         "親機のSSID"
    // Wi-Fi パスワード
    #define WLAN_PASS         "親機の認証キー"
    
    
    // IFTTTのイベント名
    #define IFTTT_EVENT_NAME  "alarm"
    
    // IFTTTのホスト名
    #define IFTTT_HOST_NAME   "maker.ifttt.com"
    
    // IFTTTのシークレットキー
    #define IFTTT_KEY         "IFTTTから取得したキー"
    
    // ポート番号
    #define PORT_NUMBER       80
    
    
    // 焦電センサーを接続するピン
    const int sensorPin = 12;
    
    // ledを接続するピン
    const int ledPin = 14;
    
    time_t t;
    struct tm *tm;
    static const char *wd[7] = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
    
    void setup(void) {
      // デジタル2番ピンを入力用として設定
      pinMode(sensorPin, INPUT);
      pinMode(ledPin, OUTPUT);
    
      // パソコンとのシリアル通信のポートを開ける
      Serial.begin(SERIAL_SPEED);
    
      // Wi-Fi設定
      setupWiFi();
    
      configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
      t = time(NULL);
      tm = localtime(&t);
      Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
                    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
                    wd[tm->tm_wday],
                    tm->tm_hour, tm->tm_min, tm->tm_sec);
    }
    
    /*
      Wi-Fiを設定します
    */
    void setupWiFi() {
      Serial.print("Connecting to ");
      Serial.println(WLAN_SSID);
    
      // シリアルポートの指定
      WiFi.begin(WLAN_SSID, WLAN_PASS);
      while (WiFi.status() != WL_CONNECTED) {
        delay(3000);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      delay(3000);
    }
    
    void loop(void) {
    
      delay(2000);
      t = time(NULL);
      tm = localtime(&t);
      Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
                    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
                    wd[tm->tm_wday],
                    tm->tm_hour, tm->tm_min, tm->tm_sec);
      
      digitalWrite(ledPin, LOW);
    
      WiFiClient client;
      const int httpPort = 80;
    
      // const char * host = "192.168.1.1"; // ip or dns
    
      Serial.print("connecting to ");
      Serial.println(IFTTT_HOST_NAME);
    
      // Use WiFiClient class to create TCP connections
    
      if (!client.connect(IFTTT_HOST_NAME, httpPort)) {
        Serial.println("connection failed");
        Serial.println("wait 5 sec...");
        delay(5000);
        return;
      }
    
      // 焦電センサーの状態を取得
      int sensorState = digitalRead(sensorPin);
    
      // 動きを検知したら
      if (sensorState == HIGH) {
        Serial.println("Send Data");
        // IFTTTへ送信するデータ
        char sendData[256] = "";
        sprintf(sendData, "GET http://maker.ifttt.com/trigger/%s/with/key/%s HTTP/1.1\r\nHost:maker.ifttt.com\r\nConnection: close\r\n\r\n", IFTTT_EVENT_NAME, IFTTT_KEY);
        Serial.println(sendData);
    
        // IFTTTへデータを送信
        //夜中だったら待つ
        if (7 <= tm->tm_hour and tm->tm_hour < 23 ) {
          client.print(sendData);
          Serial.printf(" %02d時\n", tm->tm_hour);
    
        }
    
        for ( int i = 0 ; i < 5 ; i++) {
          digitalWrite(ledPin, HIGH);
          delay(100);
          digitalWrite(ledPin, LOW);
          delay(100);
        }
    
    
            delay(180000);
        //delay(1000);
    
      }
    }
    
    
                
                


  • 無料サービスなので、文句は言えませんが、通知が来るまで、結構タイムラグがあったりします