トイレをIoT化した話 ~Internet of Toilet~（前編）

#はじめに

こんにちは！RHEMS技研の荒木です！
初投稿です
文章がつたない感じになってもご容赦ください！

今回は掃除をしてくださる方のためにトイレをIoT化しました
というのも、立っておし○こをすると便器外にたくさん飛び散るわけなんです
そんな自分のお○っこを掃除するのも嫌なのに他の人に掃除させるなんてありえない！
ということで、便器にセンサーを取り付けて立っておしっ○をする人を特定するシステムをつくりました

後編は[こちら](https://qiita.com/wannabe/items/a3be33f981f9e7d994b2)

#くわしく

まず今回使用したものは”ESP-WROOM-02”です
ESP-WROOM-02ってなんぞや、という人は[こちら](https://deviceplus.jp/hobby/entry0032/)をごらんください
簡単に説明するとArduinoをWi-Fiに接続できるように拡張できるパーツです

ということで今回書いたコードはこちらになります


```
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// WiFiアクセスポイントの定数
#define WIFI_SSID     "SSID"
#define WIFI_PASSWD   "PASSWORD"

// APIアクセスに必要な定数
#define API_HOST      "API-HOST"
#define HTTPS_PORT    443

// ピンアサイン
#define SENSOR_PIN    4
#define LED_PIN       5
#define THRESHOLD     2000

// WiFi Secure Clientを作る
WiFiClientSecure client;

/*
   HTTP Requestする関数 http_request

   引数:
      http_method   呼び出すHTTPメソッド(GET,POST,PUT,DELETE等)
      uri           リクエストURI(クエリパラメータがある場合はここに含める)
      body          リクエストボディ(JSONまたは'A=1&B=1'形式のPOSTデータ)
   戻り値
      なし
*/
void http_request(String http_method, String uri, String body) {
  // レスポンス格納バッファ
  String buff = "";
  // HTTPSコネクションを開始する
  if (!client.connect(API_HOST, HTTPS_PORT)) {
    Serial.println("Connection failed");
  }
  // リクエストを組み立て送信する
  client.print(http_method + " " + uri + " HTTP/1.1\r\n" +
               "Host: " + API_HOST + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n");
  if (body.length() > 0) {
    // bodyが存在するなら、Content-Lengthと共に送信する
    client.print("Content-Length: ");
    client.println(body.length());
    client.println();
    client.println(body);
  } else {
    // bodyが無い場合は、空行を送信する
    client.println();
  }
  // レスポンスヘッダを読み飛ばす
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  // レスポンスボディを1文字づつバッファへ格納
  char c;
  while (client.available()) {
    c = client.read();
    buff += c;
  }
  Serial.println(buff);
  client.stop();
}

// 起動時に一度だけ呼ばれるセットアップ関数
void setup(void) {
  // ピンのモードを決定
  pinMode(SENSOR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  // シリアル設定
  Serial.begin(115200);
  // WiFi接続設定を行う
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWD);

  // WiFi接続を開始する
  Serial.print("WiFi Connection");
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
  // 電源投入時は"ON"を送る
  http_request("POST", "URI", "ON");
}

// 変数を定義
int sens;
int sent = 0;
int i = 0;

// メインループ
void loop() {

  // センサー読み取り
  sens = digitalRead(SENSOR_PIN);
  if (sens == LOW) {
    // 便座が上がっている
    if (sent == 0) {
      // まだ未送信ならば・・・
      sent = 1; // UP送信済みとする
      // LEDが消える
      digitalWrite(LED_PIN, LOW);
      // 便座が上がって２秒後にAPIにUPを通知する
      do {
        sens = digitalRead(SENSOR_PIN);
        i++;
        if (i > THRESHOLD / 200) {
          http_request("POST", "URI", "UP");
          break;
        }
        delay(10);
      }  while (sens == LOW);
    }
  } else {
    // 便座が下がっている
    if (sent == 1) {
      // UPを送信済ならば
      sent = 0; // DOWN送信済みとする
      // LEDが光って知らせる
      digitalWrite(LED_PIN, HIGH);
      // APIにDOWNを通知する
      http_request("POST", "URI", "DOWN");
    }
  }
  // ディレイ
  delay(100);
}
```


とコードはこんな感じです


次は基盤の方です

画像では開発ボード用いていますが、開発ボードでなくとも同じ挙動をします

![fullsizeoutput_a.jpeg](https://qiita-image-store.s3.amazonaws.com/0/269207/cc255130-545a-d100-36a5-3d7c330bbd2e.jpeg)


まずおもてです
今回使用したセンサーはリードセンサーです

便座上がる→４ピンで検知する→２秒経つ→POSTする→便座下がる→POSTする

おおよそこんな感じのプロセス踏んでいます


次はうら・・・といきたいところですが、とても見せられるような配線じゃないので図で表します

<img width="877" alt="スクリーンショット 2018-07-27 2.18.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/269207/115cd7ed-6a38-5f98-56b5-65cd0d9e1e0a.png">

図ではESP-WROOM-02ではなくArduinoを用いていますが、使っているピンは変わらないので脳内変換して置き換えてください
緑コードがセンサー部分、赤コードはLED部分になります
センサーの抵抗は１０ｋぐらいが望ましいと思います
詳しくは”プルアップ”で検索してください


#さいごに

今回使用した回路はそんなに難しくないのでIoT初心者でもとっつきやすいのかなと思っています
興味を持った方はぜひチャレンジしてみてください

![IMG_1624.JPG](https://qiita-image-store.s3.amazonaws.com/0/269207/98df8b3a-661c-d5a4-03b4-ae690b19e97e.jpeg)
（実際の運用）