ESP-WROOM-02 Arduino互換ボードとIFTTTでスマートフォンにプッシュ通知を飛ばす

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# IFTTT
<img width="425" alt="img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/63e56184-21f6-bfb7-7b2e-00d0d87937af.png">
[IFTTT](https://ifttt.com/)

if this then that 略してIFTTT。世の中に公開されているたくさんのWebサービスを仲介してつなげるWebサービスのことです。例えば、あるハッシュタグがついたTwitterのつぶやきをEvernoteのノートにまとめるなどできちゃいます :smile: 

# ESP-WROOM-02とIFTTTでArduinoからスマートフォンへプッシュ通知を飛ばす
Arduinoに人の動きを検知できる焦電センサーをつないで、人の動きを検知したら手元のスマートフォンにPush通知を飛ばす方法を紹介します。

# 1. IFTTTの登録〜レシピ作成
まずは環境を整える。記事「[IFTTTにMaker Channelができました](http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/)」がすごくわかりやすかったです :bulb: 
IFTTTの登録〜レシピの作成は上の記事を参考にしてください。

# 2. スマートフォンにIFTTTのアプリをインストール
Android、iOSともにアプリが公開されています。Androidしか試せてないですが、おそらくiOSも同じ方法でできるかと。インストールできたら作ったアカウントでログインしてください。

- [Google Play](https://play.google.com/store/apps/details?id=com.ifttt.ifttt)
- [App Store](https://itunes.apple.com/jp/app/if-by-ifttt/id660944635)

# 3. Arduinoへスケッチを書き込む
定期的にIFTTTに対してプッシュ通知を飛ばさせるしくみです。ESP-WROOM-02をArduino IDEで使うための[ESP8266 core for Arduino](https://github.com/esp8266/Arduino)は別途インストールしてください。

```cpp
#include <ESP8266WiFi.h>

// 転送レート
#define SERIAL_SPEED  115200

// Wi-Fi SSID
#define WLAN_SSID         "your-ssid"
// Wi-Fi パスワード
#define WLAN_PASS         "your-password"

// IFTTTのホスト名
#define IFTTT_HOST_NAME  "IFTTT-event-name"

// IFTTTのイベント名
#define IFTTT_EVENT_NAME  "IFTTT-event-name"

// IFTTTのシークレットキー
#define IFTTT_KEY         "IFTTT-secret-key"

// ポート番号
#define PORT_NUMBER       80

void setup() {
  Serial.begin(SERIAL_SPEED);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);

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

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  Serial.print("connecting to ");
  Serial.println(IFTTT_HOST_NAME);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(IFTTT_HOST_NAME, PORT_NUMBER)) {
    Serial.println("connection failed");
    return;
  }

  // IFTTTへ送信するデータ
  char sendData[256] = "";
  sprintf(sendData, "GET http://maker.ifttt.com/trigger/%s/with/key/%s HTTP/1.1\r\nHost:maker.ifttt.com\r\nConnection: close\r\n\r\n", IFTTT_EVENT_NAME, IFTTT_KEY);

  // This will send the request to the server
  client.print(sendData);
  int timeout = millis() + 5000;
  while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");
  
  delay(5000);
}
```

# 4. プッシュ通知飛んできた！
これで、部屋に女子が入ってきても見られずにすみますね！ :computer: 
<img width="216" alt="img21.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/55743cb5-9b9f-d4cf-1396-0c335bb37a03.png">