Arduino M0とESP-WROOM-02でMilkcocoaにアクセスする方法

# ESP-WROOM-02をあくまでArduinoのWi-Fiモジュールとして使ってMilkcocoaにアクセスしたい
ESP-WROOM-02に直接Arduinoスケッチを書き込んでMilkcocoaにアクセスする方法はMilkcocoa公式記事「[ESP8266やArduinoでMilkcocoaを使う方法(Milkcocoa Arduino SDK)](http://blog.mlkcca.com/iot/milkcocoa-arduino/)」で紹介してくださっていたのですが、頻繁にブレッドボードとArduinoのIOピンを抜き差しして実験している僕はやはりArduinoにESP-WROOM-02をくっつけて使いたい！ということでMilkcocoaの中の方(いろいろと相談に乗って下さりありがとうございます。。)にいろいろ聞いて実現できたのでここに備忘録として残したいと思います。
※こちらで質問していました。
[ESP-WROOM-02をWi-FiモジュールとしてArduinoに接続(SoftwareSerial)してMilkcocoa Arduino SDKを使用する方法について](https://teratail.com/questions/20916)

# 必要なもの
- ESP-WROOM-02
- Arduino M0  
はじめはArduino UNO R3で試していたのですが、SRAMが2KBと非力なこともあり、ライブラリを含めたArduinoスケッチを書き込めませんでした。Arduino M0はSRAMが32KBあり、SDKを実装してくださった方も使用されていたのでArduino M0に乗り換えました。

# ライブラリ
- [WeeESP8266 updated for Milkcoca SDK](https://github.com/exshonda/ESP8266_Arduino_AT)
- [Milkcocoa Arduino SDK](https://github.com/milk-cocoa/Milkcocoa_Arduino_SDK)

# ソースコード
ESP-WROOM-02の転送レートを初期の115200bpsから9600bpsに設定変更しました。下記のソースコードで一応僕の環境では動作しました。
※転送レートの変更はこちらを参考にしました。
「[ESP-WROOM-02の通信速度の設定](http://www.mkbtm.jp/?p=640)」

```c
#include "ESP8266.h"
#include "Milkcocoa.h"
#include "Client_ESP8266.h"

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "SSID"
#define WLAN_PASS       "パスワード"


/************************* Your Milkcocoa Setup *********************************/

#define MILKCOCOA_APP_ID      "Milkcocoa App ID"
#define MILKCOCOA_DATASTORE   "esp8266"

/************* Milkcocoa Setup (you don't need to change this!) ******************/

#define MILKCOCOA_SERVERPORT  1883

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266Client class to connect to the MQTT server.
ESP8266Client wifi;

const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;

Milkcocoa milkcocoa = Milkcocoa(&wifi, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);

int cnt;

void setup() {
  SerialUSB.begin(9600);
  delay(10);

  Serial5.begin(9600);
  while (!Serial5) {
    ;
  }

  SerialUSB.println("Milkcocoa SDK demo");

  // Connect to WiFi access point.
  SerialUSB.println(); SerialUSB.println();
  SerialUSB.print("Connecting to ");
  SerialUSB.println(WLAN_SSID);

  wifi.begin(Serial5, 9600);

  SerialUSB.print("FW Version:");
  SerialUSB.println(wifi.getVersion().c_str());

  if (wifi.setOprToStation()) {
    SerialUSB.print("to station ok\r\n");
  } else {
    SerialUSB.print("to station err\r\n");
  }

  if (wifi.joinAP(WLAN_SSID, WLAN_PASS)) {
    SerialUSB.print("Join AP success\r\n");
    SerialUSB.print("IP: ");
    SerialUSB.println(wifi.getLocalIP().c_str());
  } else {
    SerialUSB.print("Join AP failure\r\n");
  }

  if (wifi.disableMUX()) {
    SerialUSB.print("single ok\r\n");
  } else {
    SerialUSB.print("single err\r\n");
  }

  if (milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush)) {
    SerialUSB.println("milkcocoa on sucesss");
  }
  else {
    SerialUSB.println("milkcocoa on failure");
  }

  cnt = 0;
};

void loop() {
  milkcocoa.loop();

  DataElement elem = DataElement();
  elem.setValue("v", cnt++);
  milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

  delay(1000);
};

void onpush(DataElement *pelem) {
  SerialUSB.println("onpush");
  SerialUSB.println(pelem->getInt("v"));
};

```

# ご協力くださった皆様。ありがとうございました！
Milkcocoaの中の方もすごく親切に対応してくださりさらにMilkcocoaファンになりました。
今回いろいろとベースができたので、年末年始あたりでいろいろ実験して面白いもの作れたらなと思っています！
本当にありがとうございました！