romes_cycのアイコン画像
romes_cyc 2021年02月10日作成 (2021年12月07日更新)
製作品 製作品 閲覧数 3564
romes_cyc 2021年02月10日作成 (2021年12月07日更新) 製作品 製作品 閲覧数 3564

水漏れを検知して通知するシステム

水漏れを検知して通知するシステム

製作の経緯

水道の配管を自分でいじった後は水漏れが怖いのでこのような装置をつくりました。

しくみ

  1. 水漏れセンサに何らかの反応があったとき、ESP32のGPIOに信号が入力されます。
  2. ESP32ではGPIOの信号をトリガーにして、IFTTTへ信号をGETでおくります。
  3. IFTTTでは信号を受信して、LINEをメッセージを送信します。(GET処理があればLINEに通知を送るように設定しておきます)

キャプションを入力できます

製作

利用した部品

ハードウェアの組み立て

ESP32へは図のように接続します。
ESP32のUSBは書き込み時はPCへ、動作させるときはスマホの充電につかうUSBアダプタなどに接続します
(モバイルバッテリーを使う場合、IoT用のものを使う必要があります。モバイルバッテリは電流が少ないと自動的にシャットダウンをする機能が搭載されており、省電力なIoT機器ではシャットダウンされてしまいます。)

キャプションを入力できます

漏水センサの感度調整

  1. 漏水センサの可変抵抗を時計回しに回し、LEDが2つとも点灯する状態にします。
  2. センサに水がついていない状態で、反時計回りに回し、LEDが点灯しなくなったら止めます。

センサに水をつけてみて、2の手順で消えたLEDが点灯すればOKです。点灯しない場合は感度調整をやり直してみてください。

(事前準備) IFTTTとLINEの設定

ESP32からIFTTTに信号を送るために必要なIFTTT(受信側)の設定を行います。

  1. https://ifttt.com/home へアクセスしてアカウントを作成 or ログインします。
  2. 右上のCreateをクリック。(すでに作成している場合は、既存のアプレットの右にある+Createをクリック)
  3. This のところにある「Add」をクリック
    If this then that という画面が現れました。thisのところとthatのところに処理を追加します。今回はthis がESP32から信号を受信したら,ThatはLINEに通知をおくるにします。
    キャプションを入力できます
  4. Webhookで検索して,Webhookを選択
  5. イベントの名前を聞かれるので、mizumoreとしておきます。(ここはご自由に文字を入力してください。)
    キャプションを入力できます
  6. もとの画面に戻ってきました。このとき、If thisの画面にはWebhookが追加されていることが確認できると思います。もし、見当たらない場合は右上のDeleteを押してやり直す or addをクリックしてやり直してください。
  7. つぎは、that の方を「Add」します。
    キャプションを入力できます
  8. ここでLINEを検索し、選びます。
  9. Send massageをクリック
  10. LINEと連携しますか?と聞いているので「Connect」をクリック
  11. LINEに登録しているメールアドレスとパスワードを入力します。(未設定の場合や忘れた場合はLINEアプリで設定/確認する必要があります→https://help.line.me/line/ios/categoryId/50000436/3/pc?lang=ja )
  12. Recipientではどこに通知するかを選びます。自分だけへの通知やグループへの通知などが選べます。グループへ通知する場合は予めLINEアプリでグループを作成し、そのグループに「LINE Notify」を友だちとして追加しておく必要があります。
  13. MessageのところにはLINEから送られてくるメッセージを選べます。今回は、もとからあったコメントを消して、「水漏れを検知しました。」としました。
    キャプションを入力できます

注意:無料プランでは3つまでしか同時にActiveにできないので、すでに使われている方は課金や無効にするなどが必要です。

アドレスの確認
WEBhookは用意されたアドレスにアクセスされるということです。今回は用意されたアドレスにアクセスされるとLINEに通知を送るような使い方をしています。このアドレスを確認する作業をします。

まずは、https://ifttt.com/maker_webhooks ここにアクセスして、右上にある「Documentation」をクリックします。
そうすると,Your key is:〇〇と出てきたと思います。これがURLであり、鍵でもあります。このアドレスを知っているひとは誰でも通知を遅れるので秘密にしましょう。

これをもとにアドレスを作ると以下のようになります。mizumoreは先程の if thisのWebhookで設定した「Event name」です。
hogehogeSAMPLEfoobarのところには、Your key is○○の〇〇を入れます。

https://maker.ifttt.com/trigger/mizumore/with/key/hogehogeSAMPLEfoobar

これでURLが完成しました!

動作確認をしてみます。ChromeなどのWEBブラウザのアドレス欄にこのURLを打ち込んでEnterをクリックします。すると、画面にはCongratulations!と表示され、LINEに通知がくるはずです。
キャプションを入力できます

エラーのときは、、、

  • {"errors":[{"message":"You sent an invalid key."}]} → keyのところが間違っています。余分なスペースや最初の1文字目をコピーし忘れていませんか?
  • Congratulations!と表示されているけど、来ない。→ Event nameの設定は大丈夫ですか?こちらも正しく入力できているかを確認してください。

後から設定やメッセージを変えたいときは、https://ifttt.com/home に行き、アプレット(今作ったやつをアプレットといいます)をクリック、右上にある「Settings」をクリックすると編集できます。

ESP32ファームウェア

ここを参考にESP32の環境を構築します。https://rikoubou.hatenablog.com/entry/2019/06/19/161443

サンプルソースのWiFiClientをもとにソースを記入しました。

GPIOの15番pinに接続したセンサがLOWになると通知が飛ぶようになります。
このセンサは水滴を検知すると信号の出力がLowになるため、!pinのように!をつけて論理否定をしています。

変更する点

  • ssid
  • password
  • eventName
  • key
/*
 *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
 *
 *  You need to get streamId and privateKey at data.sparkfun.com and paste them
 *  below. Or just customize this script to talk to other HTTP servers.
 *
 */

#include <WiFi.h>
#include <HTTPClient.h>


const char* ssid     = "ssid"; // ""で囲まれた中にSSIDをいれる
const char* password = "pass"; // ””で囲まれた中にWi-Fiパスをいれる

const char* host = "maker.ifttt.com";  // ここは変えなくてOK
const char* eventName = "mizumore";  // ””で囲まれた中にeventNameをいれる
const char* key = "hogehogeSAMPLEfoobar";  // ””で囲まれた中にkey(Your key is○○の〇〇)をいれる
void setup()
{
    Serial.begin(115200);
    delay(10);

    pinMode(15, INPUT);

    
}

void loop()
{
  delay(5000);

  int pin = digitalRead(15);
  Serial.println(pin);
  if(!pin){
    wifisetup();
    sendifttt();
    WiFi.disconnect();
  }
    
}

void wifisetup(){
  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void sendifttt(){
  Serial.print("connecting to ");
    Serial.println(host);

    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
    }

    // This will send the request to the server
    client.print(String("GET ") + "/trigger/"+ eventName + "/with/key/" + key + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            Serial.println(">>> Client Timeout !");
            client.stop();
            return;
        }
    }

    // Read all the lines of the reply from server and print them to Serial
    while(client.available()) {
        String line = client.readStringUntil('\r');
        Serial.print(line);
    }

    Serial.println();
    Serial.println("closing connection");
}

動作実験

水をセンサの上に垂らしてみます。するとセンサ基板のLEDが赤くひかり、10秒程度でLINEに通知がとんでくるはずです。
WiFiへの接続が遅い場合は30秒から1分程度かかる場合がありました。
図のように通知が来ます。

センサへの水滴がなくなると、通知は来なくなります。
万一外出先などで水滴をとれないけど、通知を止めたい場合はLINEでBlockするか、IFTTTの設定からブロックを無効にすると止まります。

キャプションを入力できます

改造

IFTTTのthen thatのところで、GmailやTwitterなどを選択すると通知先を変更できます。

ログインしてコメントを投稿する