IoTで夫婦の会話を最小化する（Amazon Dashボタン＆ESP8266編）


##嫁SIDE

2Fで作業をしていると、1Fから「パパ～！ご飯出来たよ～！」という嫁さんの叫び声が聞こえたり、聞こえなかったりするので、[Amazon Dashボタン](http://amzn.to/2nFW3QS)を使って、「パパご飯できた」ボタンを作ってみました。
押すとSlackに通知されて、ご飯を食べに行くわけです。

[ALL-FREE](http://amzn.to/2nEdSQg)ボタンを。。。
![P5000249f.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/cb9e5b28-74a6-8678-5ec5-37a2b247c6bb.jpeg)

「パパご飯できた」ボタン化！
![P5000252.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/f132f889-7231-becf-36e7-bcac3d42c045.jpeg)

- 紙はインクジェット用の光沢写真用紙
- ハサミとデザインナイフで切り抜きます

###作成にあたっては以下を参考にさせていただきました。

Amazon Dash ButtonをただのIoTボタンとして使う
http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4

Amazon Dash Buttonを(正しくない方向で)使ってみた
http://qiita.com/takustaqu/items/8539b33780c9675c8657

###ソースコード

dasherの設定は以下の通りです。MACアドレスと、SlackのURLは適宜設定してください。

```c:/home/XXXXXX/dasher/config/config.json
{"buttons":[
  {
    "name" : "slack",
    "address": "ダッシュボタンのMACアドレス",
    "url": "https://hooks.slack.com/services/XXXXX/XXXXX/XXXXXX",
    "method": "POST",
    "json": true,
    "body": {"channel":"#general", "text":"パパ、ご飯出来たよ│´ω`)ﾉ", "icon_emoji":":rice:", "username": "gohan bot"}
  }
]}
```

###実用化されてます
なにげに便利で、コンスタントに使われております。ご飯だけじゃなくて、コーヒーを入れてくれた時もこれで呼ばれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/157770/4fd87f83-ea60-1df4-1be1-862486d2991b.png)

「呼んだのに来ない(-_-#)」が減りました。


###ところが。。。。

デバッグ中で**ステップ実行している時**とか、**ハンダ付けしている時**に*「パパ、ご飯出来たよ│´ω`)ﾉ」*とか来てもすぐに行けないわけです。
嫁さんはずっとPCの前にいるわけでも、スマホを手元に置いているわけでもないし。
何か返事をする手段は無いか。。。と考えてみました。


##夫SIDE

何かリアクションにつかえるものは無いか。。。。
と、思っていたらホームセンターに他の用事で行った時に見つけてしまいました。
[ELPAミニブザー](http://amzn.to/2o2ZBAe)です。
動作電圧が1V～10Vと、3.3Vで動くESP8266と直結出来るので使いやすそうです。
これで音によるリアクションが出来る。
![P5000568.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/5c0a3b31-4773-d5d2-76cb-128ef87a2a61.jpeg)

ESP8266は[NodeMcu Lua ESP8266 CH340](http://amzn.to/2zoZ2aj)という開発ボードを使っています。
中国から届くのに時間がかかりますが、￥480と激安です。
ピンヘッダも取り付け済みなので、ハンダ付け不要です。

組んでみました。
GPIO5 ⇒ ブザーの赤線
GND ⇒ ブザーの黒線
を直結しています。工作の友、セロテープで貼っています（雑）

![P5000574.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/4c25616f-42be-78eb-6988-6b4a4ff78801.jpeg)

###ソースコード
以下の通り。

```c:buzzer.ino
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

//ご自分のルーターのSSIDを入力してください
const char* ssid = "XXXXXXXXXXXXXXX";
//ご自分のルーターのパスワード
const char* password = "XXXXXXXXXXXXX";

ESP8266WebServer server(80);

const int buzzer1 = 5;

void handleRoot() {
  server.send(200, "text/html", "<html>"
  "<head>"
  "<title>buzzer server</title>"
  "<meta name='viewport' content='width=320,user-scalable=no'>"
  "<meta name='apple-mobile-web-app-capable' content='yes'>"
  "<style>"
  "body{background-color:pink;} a:link{color:#555;text-decoration:none;} a:visited{color:#555;}\n"
  ".linku{display:flex;align-items: center;justify-content: center; border:1px solid black;"
  "   width:100px; height:100px;  margin:100px auto 0 auto; background-color:springgreen; font-size:30px; border-radius:10px;}\n"
  ".linkd{display:flex;align-items: center;justify-content: center; border:1px solid black;"
  "   width:100px; height:100px; margin: 50px auto 0 auto; background-color:salmon; font-size:30px; border-radius:10px;}\n"
  ".labelws{display:flex;align-items: center;justify-content: center; border:none;"
  "   width:200px; height:100px;margin: 50px auto 0 auto; font-size:20px;color:#777;}\n"
  "</style>"
  "</head>"
  "<body>"
  "  <a href='/ok' class='linku'>OK</a>"
  "  <a href='/ng' class='linkd'>NG</a>"
  "  <span class='labelws'>buzzer server</span>"
  "</body>"
  "</html>");
}


void setup(void){
  pinMode(buzzer1, OUTPUT);
  digitalWrite(buzzer1, LOW);

  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);

  server.on("/ok", [](){
    honk(300);
    delay(200);
    honk(600);
    server.sendHeader("Location", "/", true);
    server.send(302, "text/plain", "honk ok");
  });

  server.on("/ng", [](){
    honk(160);
    delay(100);
    honk(160);
    delay(100);
    honk(160);
    delay(100);
    server.sendHeader("Location", "/", true);
    server.send(302, "text/plain", "honk ng");
  });

  server.onNotFound([](){
    server.send(404, "text/plain", "File Not Found");
  });

  server.begin();
  Serial.println("HTTP server started");
}

void honk(int msec){
  // ブザーをONにする
  digitalWrite(buzzer1, HIGH);
  // msec待つ
  delay(msec);
  // ブザーをOFFにする
  digitalWrite(buzzer1, LOW);
}

void loop(void){
  server.handleClient();
}
```

シリアルに表示されたIPアドレスにブラウザでアクセスするとこんな感じです。
![image](https://qiita-image-store.s3.amazonaws.com/0/157770/88e68f13-d0be-df4d-64ce-eefeee7b3269.png)

動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ESP8266とブザー<br>「オッ ケーー」<br>「ム・リ・ダ」 <a href="https://t.co/C8Ophv2CeP">pic.twitter.com/C8Ophv2CeP</a></p>&mdash; Yukito (@yukitter) <a href="https://twitter.com/yukitter/status/849638488433541121">2017年4月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ブザーの音と、振動で動く様がシュールです。

**これで返事ができますね！夫婦も安泰だ！**

##ブザー応用編

- IoT版 [YES/NO枕](http://amzn.to/2nFZmrq)もできるよ！    *※職場で開くの注意かも*
- マジネタだと、サーバーが落ちた時とかに警報で使えるかも？

##最後に
こんなんで、色々大丈夫だろうか。。。。