自宅をESP8266をハックするのが楽しい今日このごろ。今回は、郵便受けに着目してハックをしてみました。
主役はESP8266。昨年の年末に海外に発注していたものが、年始に届きました。これで今年も遊べそうです。
郵便受けに何かが届いたことをどう検知するか?
これが一番のポイントです。なんとなく考えてみると、
- 近接センサーをつかって、郵便物を検知する
- 圧力センサーをつかって、郵便物を検知する
- リードスイッチをつかって、郵便受けの蓋が動いたことを検知する
色々と検知する方法はあると思います。ただ、ちょっとどのパターンでも材料費にお金がかかりそうだったり、ちゃんと検知できるか怪しそう。そんな感じで悩んでましたが、100円均一で良さげなグッズを発見。
リードスイッチが内蔵されているLEDライト。しかも100円。これは郵便受けハックに使えそうです。
もともとは、扉にセンサーを取り付けて、センサーとセンサーがくっついているときはライトは光らず。
センサーとセンサーが離れるとライトが付く仕組み。このセンサー部分だけちぎって使えば、郵便受けの蓋が開いたことを検知できそうです。
100円均一グッズを郵便受けにつけてみる
こんな感じで取り付けてみました。意外といい感じ。
蓋が閉じた状態では電気的にスイッチが開放されていて、ライトは点いている状態。そして、フタが開くとセンサーとセンサーが近づき、電気的にスイッチが短絡されて、ライトが消えました。
工作開始
早速、センサー部分だけ切り取って、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が飛ぶようになっていることを確認。
ちなみに、LINEがNotificationをあげると、Pebbleにも通知がくるようになっているので・・・
Pebbleも震えるというハイテク感。郵便受けハック、大成功です。
もちろん仕様バグは存在します
大成功とか言ってますが。
- 郵便受けに取り付けているESP8266の電源を付けた直後は、一通りのシーケンスが走ってしまうので、LINEが発火してしまう
- 郵便受けのフタが閉まらないくらいの大きな郵便物が届いた際は、RSTがGNDに落ちたまま戻ってこないので、ESP8266がDEEP SLEEPしたままになってしまう
- 郵便物が届いたことはわかるが、何が届いたかは分からない
そんなバグは抱えていますが、DEEP SLEEPのお陰で、1週間以上動き続けています。さすがESP8266。