IoT、はじめの一歩。ESP-WROOM-02でゴニョゴニョした足跡


インターネッツ・オブ・シングスしたいですよね。
でも、何から手を付けてよいやら分かんないっすよね。
ググッてみたら、妙にハードル高い記事多いし、逆に簡単だけど、ホントの最初の最初しかねえよ！みたいな...

ってなわけで、私がESP-WROOM-02というゴイスーなWi-Fiモジュールを使ってゴニョゴニョした際の足跡をば。

# ESP-WROOM-02がゴイスーな理由
* 安い（モジュール単品だと数百円）
* 簡単（Arduinoが使えるぜ！）
* 小さい（2.0cm×2.0cmぐらい？）
* 参考記事多い！（超大事）

# 買い物しよう
よろしく作り込んでくれているコイツを買いましょう。

* [ESP-WROOM-02開発ボード](http://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-SSCI-025003-ESP-WROOM-02%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89/dp/B017U73IFE%3FSubscriptionId%3DAKIAIQQO3TQ7C352HL4A%26tag%3Dmgotec04-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB017U73IFE)

あと、**持ってない人は「半田ごて」と「半田」も買いましょう。**
開発ボード単体で遊ぶ分には不要ですが、ブレッドボードにぶっ刺したりするには自分で半田付けし、ピンを付けたげる必要があります。

なお、「開発ボードが売り切れていた」「いきなりハードモード希望」の方は、

* [秋月電子AT-ESP-WROOM-02で試作環境を作る](http://cl.hatenablog.com/entry/at-esp-wroom-02-prototyping)

等を参考に頑張ってください。

# シリアル通信してみたり、Wi-Fi繋いだり、スマホからGETしたりしよう

そもそも「シリアル通信」ってなんじゃい？って方は、これでも読んで知ったかぶりしよう。

* [新人エンジニアが知っておきたいネットワーク基礎知識_シリアル通信って何？](https://thinkit.co.jp/story/2015/04/15/5791)

セットアップについては、こちらの記事が素晴らしく分かり易いので、これ読んで頑張ってください。

* [ESP-WROOM-02 開発ボードの使い方をザッと紹介](https://www.mgo-tec.com/blog-entry-ss-wroom-howto01.html)

なお、記事はちゃんと最後のコメント欄まで読むようにしましょう。↓ココ超大事です。
> ESP FLASH DOWNLOAD TOOLでSTARTボタンを押す前に、IO0スイッチを押した状態で、RESETボタンを押して離し、IO0スイッチを押した状態のまま、ESP FLASH DOWNLOAD TOOLのSTARTボタンを押さないと、ファームウェアの書き込みが出来ませんでした。

ファーム書き込み時に上記のコマンド入力が必要です。波動拳出すより簡単なので大丈夫。

# スマホからWi-Fi設定出来るようにしよう

色んな場所で使いたいよね！ってことで、Wi-Fi設定をブラウザから出来るようにしてみましょう。

* [ESP8266 (ESP-WROOM-02) でWi-Fi使用時のSSID/パスワードをブラウザで設定できるように](http://qiita.com/exabugs/items/2f67ae363a1387c8967c)

# HTTPでGETしちゃおう

Wi-Fi繋がったら次はHTTPリクエストですね。

* [1000円以下で買えるWiFiモジュールESP-WROOM-02でMackerelにメトリクスを送る](http://qiita.com/mackee_w/items/24a66a4bb40446769770)

以下メソッドを作って、Wi-Fi接続完了直後とかにぶち込んじゃいましょう。
シリアルモニタを起動させて再起動すると、お天気情報のJSONが表示されます。ゴイスー。

```
/**
 * HTTPリクエスト（GET）
 */
void http_get() {
  HTTPClient http;
  http.begin("http://weather.livedoor.com/forecast/webservice/json/v1?city=400040");
  int httpCode = http.GET();
  if(httpCode) {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);

      if(httpCode == 200) {
          String payload = http.getString();
          Serial.println(payload);
      }
  } else {
      Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
  }

  http.end();
  delay(5000);
}
```
# せっかくだからArduinoでJSON扱おう
採ってきたJSONをよしなに扱えるようにデコードしましょう。
下記のライブラリを使います。
https://github.com/bblanchon/ArduinoJson
使い方は
　1. GithubからzipでDL
　2. Arduino IDEのメニュー開く
　3. スケッチ＞ライブラリをインクルード＞.ZIP形式のライブラリをインストール
でDLしたzipファイルを選択しインスコ。

コードはこんな感じで。

```
#include <ArduinoJson.h>
```

```
/**
 * HTTPリクエスト（GET）
 */
void http_get() {
  
  const int BUFFER_SIZE = JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1);
  StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
  
  HTTPClient http;
  http.begin("http://api.fixer.io/latest?base=USD&symbols=JPY");
  int httpCode = http.GET();
  if(httpCode) {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);

      if(httpCode == 200) {
          String payload = http.getString();
          Serial.println(payload);
          
          /* JSONデコード */
          char* json = new char[payload.length() + 1];
          payload.toCharArray(json, payload.length() + 1);
          JsonObject& root = jsonBuffer.parseObject(json);
          if (!root.success()) {
              Serial.println("parseObject() failed");
          }

          const char* date = root["date"];
          Serial.println(date);
      }
  } else {
      Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
  }

  http.end();
  delay(5000);
  http_post();
}
```
なお、先述のお天気情報だとデータ量が大きすぎるのか、改行が入ってると駄目なのか、
何にせよ上手いこといかなかったので、呼び先は為替情報APIに変更してます。
別のJSONライブラリ使えば上手く行くかも。。

# HTTPでPOSTしちゃおう
次はPOST。ESP8266HTTPClientを使ったやり方になります。
送り先は各自適当にサーバ立てるなりしてお試し下さい。

```
/**
 * HTTPリクエスト（POST）
 */
void http_post() {
  HTTPClient http;
  const char * headerkeys[] = {"User-Agent","Set-Cookie","Cookie","Date","Content-Type","Connection"} ;
  http.begin("http://hogehoge/hogehoge/");
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(String("parameter1=value1& parameter2=value2"));
  Serial.printf("[HTTP] POST... code: %d\n", httpCode);
  Serial.println(http.getString());
}
```
# SPI通信しよう

IoTのTをやりましょう！！
というわけで3軸ジャイロセンサーを買います。

* [秋月電子：ＳＴマイクロＬ３ＧＤ２０使用　３軸ジャイロセンサーモジュール](http://akizukidenshi.com/catalog/g/gK-06779/)

こちらを以下の通りに配線します。配線コードは適当に買って下さい。

| ESP-WROOM-02側 | センサ側 |
|:-----------|:------------|
| ピン1：VDD| ピン1：VDD|
| ピン3：SPI_CLK| ピン2：SPC|
| ピン5：SPI_MOSI| ピン3：SDI|
| ピン4：SPI_MISO| ピン4：SDO|
| ピン6：SPI_CS| ピン5：CS|
| ピン18：GND| ピン8：GND|

* [ESP-WROOM-02 ピンアサイン](https://dl.dropboxusercontent.com/u/34019941/images/2015/20150623/20150623_006.png)
* [ＳＴマイクロＬ３ＧＤ２０使用　３軸ジャイロセンサーモジュール 説明書](http://akizukidenshi.com/download/ds/akizuki/ae-l3gd20.pdf)

Arduinoのプログラムは下記参照。そのままペタッと貼り付けて、書込み実施すると動きます！
ブレッドボードを手に持ってグリグリ動かしてみましょう！きっと面白いよ！

* [ST micro のデジタル3軸ジャイロ L3GD20 を使う(SPI接続)](http://n.mtng.org/ele/arduino/tutorial017.html)

なお、ここまでの記事内容に従って、Arduino IDEの設定を行っている場合は、
シリアルモニタの表示が文字化けしてしまうので、

```
Serial.begin(9600);
```

の「9600」を「115200」に書き換えます。

# センサから取った値をインターネッツに放り投げよう。

ってなところで、適当にサーバおっ立てましょう。Djangoとか簡単でいいと思うよ！
んで、そこに向かってセンサの値を放り投げちゃえば...This is IoT!! Yeah!!