自宅を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);
connectWifi();
httpPostJson();
disconnectWifi();
ESP.deepSleep(0, WAKE_RF_DEFAULT);
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 = "{}";
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。