センサーのデータをMQTTで飛ばしてAmazon DynamoDBで保存

センサーのデータ、例えば夏休みの自由研究で、温度センサーのデータを期間中継続的に収集したいとします。そんな時、パソコンを１月以上立ち上げたままにしておくのも辛いものがあります。ノートパソコンだと、スリープにならないように設定しないとなりません。他に良い手があるかもしれませんが、ここではESP8266を周期的に立ち上げて、データを取得し、MQTTでデータをAmazon DynamoDBに保存することにします。
<br><br>

![IoTtoDynamoDB.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/387c96b4-1fdd-97b2-3029-f3ac7417534a.jpeg)
<br><br>

## ESP8266の設定
ローカルのデバイスとしてESP8266を使います。ESP8266はWifiにダイレクトでつなげることができ、またDeep Sleep Modeで超省エネで５分に１度起こす、といったことができます。
　
1. ESP8266はWifi につなぎます。
2. センサーデータをADCで取り込みます。
3. データをMQTTでAWS IoTへ投げます。
4. ESP8266はDeep Sleep Modeを設定します。
5. Deep Sleep の後、リセットがかかり 1. へ戻ります。

![flow2.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/517a24d0-050b-c850-2cd1-e04017a4c27f.jpeg)

ESP8266のArduinoの環境設定は[こちら](https://qiita.com/YumeYakata/items/96ce018777a3ffe78353)を参照してください。

### Wifiの設定
Wifi の接続を何回か試みで、失敗すると抜けるようなプログラムになっています。

```wificonnect.ino
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>

ESP8266WiFiMulti WiFiMulti;
#define MAXTRY    100

void setup() {
    Serial.begin(9600);
    Serial.println ("connecting to wifi");
    WiFiMulti.addAP("SSID", "PASSWORD");    // put your setup code here, to run once:
    int iwait=0;
    while(WiFiMulti.run() != WL_CONNECTED) {    //wait for connection
        delay(100);
        Serial.print (".");
        iwait++;
        if(iwait>=MAXTRY){ 
            Serial.println ("\nconnect error");    //connect NG
            break;
        }
    }
    if(WiFiMulti.run() == WL_CONNECTED)    //connect OK
        Serial.println ("\nconnected");
}
```

### センサーデータをADCで取り込む
[こちら](https://qiita.com/azusa9/items/26e74e4e0d5773ce9c41)の記事を参考にさせていただきました。ADCのチャンネルが１チャンネルしかありませんので複数のアナログデータを取り込むときには工夫が必要ですが、また別途にさせてください。

```adc8266.ino
extern "C" {
    #include "user_interface.h"
}

int iadc;

void setup() {
    Serial.begin(9600);
}
void loop() {
    iadc = system_adc_read();
    Serial.println (iadc);
    delay(1000);
}
```
### データをMQTTでAWS IoTへ投げる
ESP8266からAWS IoTへデータを投げるプログラムは[こちら](https://github.com/odelot/aws-mqtt-websockets)と[こちら](https://qiita.com/horihiro/items/44c3428cf1419414fcd8)
と[こちら](http://ghz2000.com/wordpress/?p=1136)の記事を参照させていただきました。

次の４つのライブラリをArduino IDE にインストールします。
- [arduino_1.0.0.zip](https://projects.eclipse.org/projects/technology.paho/downloads)
- [aws-mqtt-websockets-master.zip](https://github.com/odelot/aws-mqtt-websockets)
- [aws-sdk-arduino-master.zip](https://github.com/odelot/aws-sdk-arduino)
- [arduinoWebSockets-master.zip](https://github.com/Links2004/arduinoWebSockets)

arduino_1.0.0.zipは[このページ](https://projects.eclipse.org/projects/technology.paho/downloads)からダウンロードすることができます。

![p1.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/fb417bec-3bd0-0efd-36d5-a7dec13fc241.jpeg)

<b>長くなりそうなので、プログラムのサンプルは[別なページ](https://qiita.com/YumeYakata/items/23e9c3c76135bba3ebe5)で紹介したいと思います。</b>

### Deep Sleep Modeの設定
Deep Sleepを使うためには、GPI6とReset を接続しておきます。30秒間に１回Deep Sleep Modeから起床し、LEDを10回点滅するプログラムをサンプルに示します。

```deepsleepblink.ino
void setup() {
    int i;
    pinMode(2, OUTPUT);
    for(i=0; i<10; i++){
        digitalWrite(2, HIGH);   // turn the LED on (HIGH is the voltage level)
        delay(1000);             // wait for a second
        digitalWrite(2, LOW);    // turn the LED off by making the voltage LOW
        delay(1000);  
    }
    ESP.deepSleep(3e7);          //Going into deep sleep for 30 seconds
}
```
## AWSの設定

AWS側の設定は
1. AWS IoT でモノの設定を行う。
2. AWS IoT を外からデータを受け取れるようにセキュリティを設定する
3. DynamoDBを設定する
4. AWS IoT のアクションを設定し、受け取ったデータをDynamoDBへ保存する

といったステップが必要かと思います。[こちら](http://haramikata.jougennotuki.com/page59.html)と[こちら](http://haramikata.jougennotuki.com/page62.html)の記事を参照して設定を行いました。こちらも長くなりそうなので、別なページに書きたいと思います。