郵便ポストをIoT化　Ver.2

#はじめに
RHEMS技研の上杉です。

![郵便受け.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393231/f0a412f6-e8ca-14a3-6f51-1c310fb59007.jpeg)

画像のような郵便受けをIoT化したのでこちらについて記事を書きます。

#仕組み

前回　[郵便ポストをIoT化したよって話](https://qiita.com/Akijin/items/0716f873763d2b4c0e11)

前回はポストまでWi-Fiが届かなかったということで
今回はArduinoを使って郵便受けをIoT化しました。
具体的には、郵便物が届いたタイミング・郵便受けを誰かが開けたタイミングで通知を送る仕組みとなっています。

今回のコードはこんな感じです。

まずは送信側のプログラムです。

```c

int val = 0; //入力される値を格納する為の変数
void setup() {
  Serial.begin(9800); //モニターに出力するための設定
}
void loop() {
  if (digitalRead(6) == HIGH) {
    Serial.println("overOpen");
    while (1) {
      if (digitalRead(6) == LOW) break;
    }
  }

  if (digitalRead(3) == LOW) {
    Serial.println("underOpen");
    while (1) {
      if (digitalRead(3) == HIGH) break;
    }
  }
  delay(1000);
}
```
次に受信側のプログラムです。

```c
#include <WiFiManager.h>
#include <WiFiClientSecure.h>

#define API_HOST      "API_HOST"
#define HTTPS_PORT    443

WiFiClientSecure client;
WiFiManager wifiManager;

void http_request(String http_method, String uri, String body) {
  String buff = "";
  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: BuildFailureDetectorESP32\r\n" +
               "Connection: close\r\n");
  if (body.length() > 0) {
    client.print("Content-Length: ");
    client.println(body.length());
    client.println();
    client.println(body);
  } else {
    client.println();
  }
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    } else {
    }
  }
  char c;
  while (client.available()) {
    c = client.read();
    buff += c;
  }
  Serial.println(buff);
  client.stop();
}

void setup() {
  Serial.begin(115200);
  pinMode(19, OUTPUT);
  digitalWrite(19, HIGH);
  Serial.println("Start reading.");
  Serial1.begin(9600, SERIAL_8N1, 15, 13);

  Serial.println(wifiManager.autoConnect());
  digitalWrite(26, LOW);

  IPAddress ipadr = WiFi.localIP();
  Serial.println(ipadr);
  Serial.println(WiFi.SSID());
  delay(1000);
}

void loop() {
  String buff;
  char c;
  if (Serial1.available()) {
    while (1) {
      c = Serial1.read();
      buff += c;
      if (c == 10) break;
    }
    Serial.println(buff);

    if (buff.startsWith("overOpen"))  http_request("POST", "URI", 
       "FULL");
    else  http_request("POST", "URI", "EMPTY");

    buff = "";
  }
  delay(1000);
}
```

受信側のプログラムは上(overOpen)が開いたときと下(underOpen)が
開いたときにAWSに送られる仕組みになっています。

次に今回使用したものをご紹介します。

まずは送信側です

![tXYQhb2vQH6L5v1YCXJ+ww.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393231/44b182fa-046a-7e62-e255-485da0641d6d.jpeg)

長いほうが上(overOpen)、短いほうが下(underOpen)に反応するセンサーです。
今回もリードセンサーを用いました。


送信側を郵便受けに取り付けるとこんな感じになります。

![fullsizeoutput_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393231/b6bd8234-0adc-b630-ce80-7c0f562ce640.jpeg)

本体がそのままで置いてあると投函された際に傷ついたり、ずれたりしないように
箱を作ったりテープで固定しました。
送信側の方はコンセントが近くにないためバッテリーを使用しています。

また、受信側もそのままで置いておくと、ださいということで
箱を作りました。

![IMG_2914.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393231/897cface-299a-eea1-452b-b224acfd6afa.jpeg)

時差は多少ありますが受信側を窓の近くに置くとAWSで動作を受け取ることができました。

#最後に

まだまだ完成とは言えませんがなんとか作り上げることができました。
箱はこのあとダンボールを見えないように色を付ける予定です。
また、今のままだとバッテリーが無くなったことがわからないので
次回改善できればなと思います。