IoTで夫婦の会話を最小化する(Amazon Dashボタン&ESP8266編)

  • 63
    いいね
  • 0
    コメント

嫁SIDE

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

ALL-FREEボタンを。。。
P5000249f.jpg

「パパご飯できた」ボタン化!
P5000252.jpg

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

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

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

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

ソースコード

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

/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

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

ところが。。。。

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

夫SIDE

何かリアクションにつかえるものは無いか。。。。
と、思っていたらホームセンターに他の用事で行った時に見つけてしまいました。
ELPAミニブザーです。
動作電圧が1V~10Vと、3.3Vで動くESP8266と直結出来るので使いやすそうです。
これで音によるリアクションが出来る。
P5000568.jpg

ESP8266はHiLetgo NEW NodeMcu Lua ESP8266 CH340という開発ボードを使っています。
中国から届くのに時間がかかりますが、¥480と激安です。
ピンヘッダも取り付け済みなので、ハンダ付け不要です。

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

P5000574.jpg

ソースコード

以下の通り。

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

動画



ブザーの音と、振動で動く様がシュールです。

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

ブザー応用編

  • IoT版 YES/NO枕もできるよ! ※職場で開くの注意かも
  • マジネタだと、サーバーが落ちた時とかに警報で使えるかも?

最後に

こんなんで、色々大丈夫だろうか。。。。