MQTTでArduino YunとmyThingsとつなげ、IoTをやってみた

今回、紹介するのはArduinoでもIoTができるよ！　というものになります
例えば、こんな感じです
[![ArduinoでIoT](http://img.youtube.com/vi/Dqg1QhtgxBU/0.jpg)](http://www.youtube.com/watch?v=Dqg1QhtgxBU)
これは、スマホをサーバを経由し、Arduinoに命令を出し、ロボットアームを動かしています

IoTに関しての何かを作る時とか、そもそも自分の作ったデバイスをネットに繋げる時に選択肢として真っ先に上がるのは、RaspberryPiだと思います
しかし、実はArduinoもIoTに対して様々な取り組みをしており、当然ネットにつながるボードも出しているのです！
[ArduinoのIoTへの取り組み](https://create.arduino.cc/iot/)


YunとTianと呼ばれているArduinoがボードがまさにそれです
[![Arduino Yun](https://qiita-image-store.s3.amazonaws.com/0/138278/2e35df40-c11a-897b-9d2d-2634bc609973.jpeg)](https://www.arduino.cc/en/Main/ArduinoBoardYun)[![Arduino Tian](https://qiita-image-store.s3.amazonaws.com/0/138278/f0cdc46f-d659-c1d2-fe7f-d51668205b7d.jpeg)](http://www.arduino.org/products/boards/arduino-tian)

ArduinoのほうがRaspberryPiよりも電気回路については優秀ですし、わかりやすいため電気回路、ハードウェアがメインのものを作る時はYunとTianを使うのがいいとも思います

というわけで早速やってみたいと思います！
今回はArduino Yunを使います

やるならIoTだよね！　ということで日本製IoTアプリのmyThingsとつなげてみたいと思います
[![myThings](https://qiita-image-store.s3.amazonaws.com/0/138278/2ae5611b-5c7f-cf2b-9ce1-ee85138051c6.jpeg)](https://mythings.yahoo.co.jp)

大雑把なシステム構成はこうなります
![スクリーンショット 2016-12-10 19.12.54.png](https://qiita-image-store.s3.amazonaws.com/0/138278/78287bc1-c149-6803-2544-1ce69f02c9e4.png)
myThingsを使って、ボタンを押したらArduinoに通知がいくようにします
最終的には、毎朝７時でかつその日が晴れだったらArduinoに通知がいくします！

というわけで、やることは3つ
1. IDCFCloudの設定
2. myThingsの設定
3. Arduino Yunの設定

#[IDCFCloud](https://www.idcf.jp)の設定
## サーバ構築
サーバを設定しましょう！
自分はここら辺の記事を参考しました！
[myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする](http://qiita.com/masato/items/f9be4a15216fe29de7fb)
[myThingsのIDCFチャンネルサーバを簡単につくる](http://qiita.com/moyaidcf/items/63e5b07ffe272bdbd803)

まず、[IDCFCloud](https://www.idcf.jp)にアクセスし、一番安いサーバを作りましょう。初期登録が必要なので、登録がまだの方はそちらも行ってください。
そして、IPアドレスの設定を行い、それを先ほど作ったサーバと紐付けてください
自分のIPアドレスの設定はこんな感じです
![スクリーンショット 2016-12-10 19.18.54.png](https://qiita-image-store.s3.amazonaws.com/0/138278/77bb2c88-b583-608a-a449-1bf766391288.png)
![スクリーンショット 2016-12-10 19.19.02.png](https://qiita-image-store.s3.amazonaws.com/0/138278/0f8b0344-4119-dded-0f7d-4947e31a3f6b.png)

## 環境の構築
ssh でサーバにはいって、下記のコマンドを実行しましょう！ すると環境が構築できます

```実行するコマンド
$ sudo apt-get update && sudo apt-get install -y git
$ mkdir ~/iot_apps && cd ~/iot_apps
$ git clone https://github.com/IDCFChannel/meshblu-compose
$ cd meshblu-compose
$ ./bootstrap.sh
$ docker-compose up -d openresty
$ cd ~/iot_apps/meshblu-compose
$ docker-compose run --rm iotutil register
```
それぞれの詳しいコマンドの意味は[myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする](http://qiita.com/masato/items/f9be4a15216fe29de7fb)をみてください


210.XXX から始まるIPアドレスと、下記の２つの実行コマンドの結果はこの後も使うので、メモ帳などに残しておきましょう

```実行するコマンド
$ docker-compose run --rm iotutil owner
$ docker-compose run --rm iotutil list
```

# myThingsの設定
## アプリのダウンロード
myThingsのアプリを入れましょう！
[![iphone](https://qiita-image-store.s3.amazonaws.com/0/138278/978344d0-c336-03ce-5f3b-1f3317561330.png)](https://itunes.apple.com/jp/app/id987874862)[![Android](https://qiita-image-store.s3.amazonaws.com/0/138278/65c23daf-b763-2ea9-3eb2-119a2d2e37eb.png)](https://play.google.com/store/apps/details?id=jp.co.yahoo.android.yiot&hl=ja)

##組み合わせの設定と認証
次にこのQRコードを読み込んで、組み合わせを作ってください

「ボタンを押したら、IDCFサーバに通知する」組み合わせです

| ![20161210193157.jpg](https://qiita-image-store.s3.amazonaws.com/0/138278/c16ca6b5-47ac-496e-55ea-62848f94a6e2.jpeg) | ![20161210193502.jpg](https://qiita-image-store.s3.amazonaws.com/0/138278/ffd8a40a-c81c-c3bd-091c-82c9eb0aed6f.jpeg) |
|:-:|:-:|
|   |   |

すると認証画面が出てくると思います
![20161210192536.jpg](https://qiita-image-store.s3.amazonaws.com/0/138278/2fcc677e-52e1-0819-ef25-a5eb26e96b83.jpeg)
IPアドレスには、さきほどのIDCFのIPアドレス（210から始まるものです）
認証トークンには、IDCFで実行したこちらのコマンドで表示されたmeshblu_auth_tokenを入力してください

```
$ docker-compose run --rm iotutil owner
```

myThingsの設定はこれだけです！！

#Arduinoの設定
## 接続先のwifiの設定
まず、wifiの設定をします
ArduinoYunに電源を入れて、しばらく時間をおくとwifiの一覧に「Arduino Yun-XXXXXX」というものが出てきます
それに接続したあとに、http://arduino.local を開いてみてください！
すると、Arduinoの設定が始まります（初期パスワードは「arduino」です）
今後、Arduinoがどのwifiにつなぐか、といった設定を行ってください

最後まで設定すると、Arduinoの再起動が始まります
これまた時間を置いた後、さきほどArduinoがつながるwifiにPCもつなげ再度、http://arduino.local を開いてみてください
無事に開くことができたら、wifiの設定は完了です！

http://arduino.local を開いた画面
![スクリーンショット 2016-12-10 2.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/138278/dd531ef0-a9b0-4b32-7ba4-e2e2ced06c87.png)

## MQTTライブラリの追加
MQTTで通信を行う為、ライブラリを入れる必要があります
今回はarduino-mqttを使っていきます！（名前わかりやすい）
https://github.com/256dpi/arduino-mqtt

まず、まるごどzipでDownloadします
![GIT.png](https://qiita-image-store.s3.amazonaws.com/0/138278/7f34d4f8-98a9-52f4-6ef3-9ea38bf8764e.png)

そして、Arduinoから
スケッチ -> ライブラリをインクルード　→　.ZIP形式でライブラリをインストール
で先ほどダウンロードしたファイルを選んでください
![arduino_zip.png](https://qiita-image-store.s3.amazonaws.com/0/138278/420c5df7-3194-94ac-2d0d-0431afc9ed40.png)

すると、Contributedライブラリの一覧に「MQTT」というのが増えていると思います
![arduino_zip_result.png](https://qiita-image-store.s3.amazonaws.com/0/138278/b7bb609b-f486-6654-1438-45429ea6a62f.png)

これでライブラリの追加の完了です！

## プログラムの書き込み
https://github.com/hhata-hhajime/arduino_MQTT_sample/blob/master/simple_connect
にソースコードを置きました
適当に変数を書き換えてください
SERVER-IPADDRESSには、210から始まるIDCFのIPアドレス
ACTION1-UUIDとACTION1-TOKENには、IDCFで

```
$ docker-compose run --rm iotutil list
```
を実行した結果のaction-1のuuidとtokenを入力してください
プログラムの全文をこちらにも書いておきます

```
// SERVER-IPADDRESS, ACTION1-UUID, ACTION1-TOKEN is value
// sample values↓
// SERVER-IPADDRESS: 210.140.175.00
// ACTION1-UUID: 88d6d5f5-9553-456f-9264-389xxxxxxxx
// ACTION1-TOKEN: a828xxxxx

#include <Bridge.h>
#include <YunMQTTClient.h>


YunMQTTClient client;

void setup() {
  Bridge.begin();
  SerialUSB.begin(57600);
  client.begin("SERVER-IPADDRESS");
  connect();
}

void connect() {
  SerialUSB.print("connecting...");
  while (!client.connect("arduino", "ACTION1-UUID", "ACTION1-TOKEN")) {
    SerialUSB.print(".");
    delay(500);
  }

  SerialUSB.println("\nconnected!");
  client.subscribe("ACTION1-UUID");
}

void loop() {
  client.loop();
  if(!client.connected()) {
    connect();
  }
}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  SerialUSB.print("messageReceived: ");
  SerialUSB.print(topic);
  SerialUSB.print(" - ");
  SerialUSB.print(payload);
  SerialUSB.println();

  if(payload.indexOf("connect_to_arduino") > 0)
  {
    SerialUSB.println("start something");
  }
}
```
ポートの設定をしたあとに書き込みボタンで完了です！
ポートの設定はこんな感じです
![arduino_port.png](https://qiita-image-store.s3.amazonaws.com/0/138278/d69cc2a4-cd29-2a57-855e-18f7333c29d7.png)

# 接続チェック！
最後に本当にできているか確認します

Arduinoでシリアルモニタを開き、myThingsでさっき作った組み合わせを実行します
そうすると、Arduinoは下記のようにメッセージを受け取れます

```
connecting...
connected!
messageReceived: 88d6d5f5-9553-456f-9264-389c7c71d6a5 - {"topic":"message","data":{"devices":["88d6d5f5-9553-456f-9264-389c7c71d6a5"],"payload":"connect_to_arduino!","fromUuid":"86c23cef-7e45-46d0-9a22-4556114c188c"}}
```
[![ArduinoでIoT](http://img.youtube.com/vi/K8bdhkv-WaY/0.jpg)](http://www.youtube.com/watch?v=K8bdhkv-WaY)
payloadに組み合わせのメッセージ部分に入力したテキストが取得できるので、ここから条件式をつけて、いろいろアウトプットを変化させることもできます

長くなってしまいましたが、これで接続できました！
ちなみに↓の組み合わせを使うと、自動で晴れの日の朝７時になったらArduinoに通知がいくようになります！

「天気で晴れだったら、IDCFで通知する」組み合わせです！

| ![20161210193211.jpg](https://qiita-image-store.s3.amazonaws.com/0/138278/1bf7322e-2cfe-a6d9-b209-902bd3166b61.jpeg) | ![20161210193826.jpg](https://qiita-image-store.s3.amazonaws.com/0/138278/e86e3f1c-ad63-39e6-42fc-cd51666862fd.jpeg) |
|:-:|:-:|

ちなみに自分はこれで自動で動くカーテンを自作中です

それでは、みなさん良いIoTライフを！