【IoT/Arduino】1.5m以内に人が来たらWebAPIを叩く仕組み (材料費1900円)

iXIT株式会社 岡崎です。

去年は短時間でシステム化できるようにノーコードを試して実戦投入しました。

今年は、システム化できる範囲を広げようとIoTを試し始めました。

概要

人感センサーで1.5m以内に人が来たことを検知したら、

WebAPIを叩くという仕組みを作ってみます。

 

人が廊下を通ったら、WebAPIを叩いて回数記録&閾値で通知する感じ。

 

今回はWebAPIを叩くところまで。

使い道

・一人暮らしの親が元気にしているかをリモートから自動で把握

・防犯として、夜間に人が通たら通知

材料

追加購入した物 合計1,870円(税込み)

 ①人感センサー M5Stack用PIRセンサユニット(583 円)

  (赤外線の変化によって人の接近を検知するセンサー。

   1.5m以内に人が来たら検知します。)

 ②マイコンボード ATOM Lite (1,287 円)

  (CPU 240MHz×2、メモリ0.5MB、フラッシュメモリ4MB、Wi-FiBluetooth

 f:id:ixit-okazaki:20210719131411j:plain

手元にあったもの

 ③何らかのWebAPI

  ※今回はノーコード(Bubble.io)で作ったLINEメッセージ送信のWabAPIを使います。

 ④USB-Cのケーブル、USB充電器

作り方

  1. ①②④をそれそれケーブルでつなげます
  2. 「②マイコンボード」にプログラムを書きこむ

 ざっくり以上です。

システム内の流れ

【人が廊下を通る】

  ↓ 赤外線

【①人感センサーが検知する】1.5m以内に人が近づいたら検知

  ↓ Goveケーブル

【②マイコンボードがWebAPIを叩く】

 ※デバッグ用に、検知したらLEDがからに変わるように設定

  ↓ Wifi

WIFIルーター

  ↓ インターネット

【③何らかのWebAPI】

 ※今回は、検知したらLINEメッセージを送ります。   

ここまで動かした動画 (10秒)

youtu.be

プログラム

マイコンボードのプログラムは、C言語風の「Arduino言語」という言語で書きました。

 ①マイコンボードの初期化処理(setup)

 ②マイコンボードが起動中にループ実行する処理(loop)

 ③WebAPI呼び出し(send_line_message)

 ④マイコンボードのLEDの色変更(display_LED)

※【 】の中は環境によって変更

#include "M5Atom.h"
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

WiFiMulti wifiMulti;

uint8_t DisBuff[2 + 5 * 5 * 3];

// ①マイコンボードの初期化処理
void setup()
{
    M5.begin(true, false, true);

    delay(10);
    display_LED(0x00, 0x00, 0x00);
    
    //人感センサーと接続
    pinMode(32, INPUT);
    
    //Wifi接続
    wifiMulti.addAP("【SSID】", "【PASSWORD】");
}

// ②マイコンボードが起動中にループ実行する処理
void loop()
{

    if(digitalRead(32)==1){
        //人感センサーが検知中は、LEDを赤に変更
        display_LED(0xff, 0x00, 0x00);

        //WebAPIを呼び出し(今回はLINEメッセージ送信)
        send_line_message();

        delay(10000);

    }else{
        //人感センサーが検知していない場合、LEDを緑に変更
        display_LED(0x00, 0xff, 0x00);
    }
      
    delay(100);
    M5.update();
}

// ③WebAPI呼び出し
void send_line_message() {
    
    if((wifiMulti.run() == WL_CONNECTED)) {      
        //送信する情報を作成
        DynamicJsonDocument doc(JSON_OBJECT_SIZE(2));
        doc["uuid"] = "【LINEアカウントの内部ID】";
        doc["message"] = "廊下を通ったよ";
        String json;
        serializeJson(doc, json);

        // WebAPIを呼び出し
        HTTPClient http;
        http.begin("https://no-template01.bubbleapps.io/version-test/api/1.1/wf/line_send_mes/");
        http.addHeader("Content-Type", "application/json");
        http.POST(json);

        http.end();
        
        delay(50);  
     }  
     
}

// ④マイコンボードのLEDの色変更
void display_LED(uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    for (int i = 0; i < 25; i++)
    {
        DisBuff[2 + i * 3 + 0] = Rdata;
        DisBuff[2 + i * 3 + 1] = Gdata;
        DisBuff[2 + i * 3 + 2] = Bdata;
    }

    M5.dis.displaybuff(DisBuff);
}