Androidのメモとか

ポキオの日記です。今日も遅延してない。

ESP8266を使って郵便受けに何かが届いたら連絡してくれるようなシステムを作る

自宅をESP8266をハックするのが楽しい今日このごろ。今回は、郵便受けに着目してハックをしてみました。

郵便受け ESP8266

主役はESP8266。昨年の年末に海外に発注していたものが、年始に届きました。これで今年も遊べそうです。

郵便受けに何かが届いたことをどう検知するか?

これが一番のポイントです。なんとなく考えてみると、

  • 近接センサーをつかって、郵便物を検知する
  • 圧力センサーをつかって、郵便物を検知する
  • リードスイッチをつかって、郵便受けの蓋が動いたことを検知する

色々と検知する方法はあると思います。ただ、ちょっとどのパターンでも材料費にお金がかかりそうだったり、ちゃんと検知できるか怪しそう。そんな感じで悩んでましたが、100円均一で良さげなグッズを発見。

郵便受け ESP8266

リードスイッチが内蔵されているLEDライト。しかも100円。これは郵便受けハックに使えそうです。

郵便受け ESP8266

もともとは、扉にセンサーを取り付けて、センサーとセンサーがくっついているときはライトは光らず。

郵便受け ESP8266

センサーとセンサーが離れるとライトが付く仕組み。このセンサー部分だけちぎって使えば、郵便受けの蓋が開いたことを検知できそうです。

100円均一グッズを郵便受けにつけてみる

こんな感じで取り付けてみました。意外といい感じ。

郵便受け ESP8266

蓋が閉じた状態では電気的にスイッチが開放されていて、ライトは点いている状態。そして、フタが開くとセンサーとセンサーが近づき、電気的にスイッチが短絡されて、ライトが消えました。

工作開始

早速、センサー部分だけ切り取って、ESP8266に接続してみました。

郵便受け ESP8266

郵便受けのフタが開くと短絡することを利用するために、こんな感じの実装にしてみました。

ESP8266

これだけ。

リードスイッチをGNDとRSTにつなぎました。これは何を意味しているかというと、郵便受けのフタが開いたらリードスイッチを短絡させて、ESP8266をリセットさせて、再び郵便受けのフタが閉じたらESP8266のシーケンスを1から走らせるつもり。なので、コーディングはこんな感じ。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

char ssid[] = "xxxxxxxx";
char password[] = "yyyyyyyy";

char host[] = "maker.ifttt.com";
char url[] = "/trigger/EVENT_NAME_HERE/with/key/KEY_FOR_IFTTT_MAKER_CHANNEL";
int port = 80;

void setup() {
  Serial.begin(115200);
  Serial.println("");

  pinMode(BUILTIN_LED, OUTPUT);
  digitalWrite(BUILTIN_LED, LOW);

  delay(1000); // スイッチはチャタるものなので、1秒位してから処理を始める

  connectWifi();
  httpPostJson();
  disconnectWifi();

  ESP.deepSleep(0, WAKE_RF_DEFAULT); // 引数に0を指定することで、RSTがGNDに落ちることがなければずっとDEEP SLEEPする

  delay(1000);
}

void loop() {
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

void httpPostJson() {
  WiFiClient wifiClient;
  String json = "{}"; // 空のJSONをおくる(詰めるものがない)

  if (!wifiClient.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }

  Serial.println("http post...");
  wifiClient.println(String("POST ")  + url + " HTTP/1.1");
  wifiClient.println(String("Host: ") + host);
  wifiClient.println("Cache-Control: no-cache");
  wifiClient.println("Content-Type: application/JSON");
  wifiClient.print("Content-Length: ");
  wifiClient.println(json.length());
  wifiClient.println();
  wifiClient.println(json);
}

スイッチはチャタる。疑いようのない事実です。今回は面倒なのでソフトウェア的に、メインのシーケンスを1秒遅れで開始することで回避しています。RSTが複数回GNDに落ちてもきっと大丈夫です。

そして、通知先はIFTTTのMaker Channelにしています。Maker ChannelへのHTTP POSTをTriggerにして、LINEが発火するように仕込んでみました。

そして年賀状が来た

松の内ギリギリに工作したので、日時がアレですが、一応郵便物を検知して、IFTTT/LINEが飛ぶようになっていることを確認。

郵便受け ESP8266

ちなみに、LINEがNotificationをあげると、Pebbleにも通知がくるようになっているので・・・

郵便受け ESP8266

Pebbleも震えるというハイテク感。郵便受けハック、大成功です。

もちろん仕様バグは存在します

大成功とか言ってますが。

  • 郵便受けに取り付けているESP8266の電源を付けた直後は、一通りのシーケンスが走ってしまうので、LINEが発火してしまう
  • 郵便受けのフタが閉まらないくらいの大きな郵便物が届いた際は、RSTがGNDに落ちたまま戻ってこないので、ESP8266がDEEP SLEEPしたままになってしまう
  • 郵便物が届いたことはわかるが、何が届いたかは分からない

そんなバグは抱えていますが、DEEP SLEEPのお陰で、1週間以上動き続けています。さすがESP8266。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。