リクガメのおウチの温度/湿度をモニターしてawsに投げるのを1000円くらいでやる on arduino

ちょっと前にmicroPythonで温度/湿度センサーのデータをaws iotに投げるのをやりましたが、どうもあんまし安定しない。sleepさせて起きて投げてってループするんだけど、気づいたら普通に起動しててスクリプトが走ってないとかあってなんでかなと。
で、まあ一回arduinoでも試してみようかなと。esp32じゃなくてesp8266の方で。

ちなみにmicroPython版は
[リクガメのおウチの温度/湿度をモニターしてawsに投げるのを1000円くらいでやる](https://qiita.com/ikegam1/items/74d98ed702c280e815cb)

##アイテム

- https://www.amazon.co.jp/gp/aw/d/B0739YKWSH/
- https://www.amazon.co.jp/gp/product/B01LJU59ZK/

こんな感じのやつ。合わせて1000円くらいか。

## テンプレ

- https://thingsboard.io/docs/samples/esp8266/temperature/
- https://www.losant.com/blog/getting-started-with-the-esp8266-and-dht22-sensor

このあたりを元にさせていただいてすすめます。

### arduino ideに以下ライブラリ追加

- ~~Adafruit ESP8266~~ 結局使わず
- ~~Adafruit MQTT Library~~ 結局使わず
- Adafruit Unified sensor
- DHT sensor library

![33.png](https://qiita-image-store.s3.amazonaws.com/0/308709/480734b8-adb5-2fb6-d0d1-beb831d57185.png)

### 焼いてみる

とりあえずサンプルコードをビルドして焼いてみる

https://github.com/esp8266/Arduino
↑ここの```Installing with Boards Manager```のとこをやります。

そして**ESPDuino(ESP-12 Module)**を選択。
ひとまずその他はデフォルトで**マイコンボードに書き込む**をしてみます。
そして・・・

![34.png](https://qiita-image-store.s3.amazonaws.com/0/308709/f77bb197-f9d9-4d63-79c1-2a6c0133b559.png)

お、良さげ。ちなみにこの段階のソースはこちら。

```c
/**
 * Example for reading temperature and humidity
 * using the DHT22 and ESP8266
 *
 * Copyright (c) 2016 Losant IoT. All rights reserved.
 * https://www.losant.com
 */

#include "DHT.h"

#define DHTPIN 4     // what digital pin the DHT22 is conected to
#define DHTTYPE DHT22   // there are multiple kinds of DHT sensors

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }

  Serial.println("Device Started");
  Serial.println("-------------------------------------");
  Serial.println("Running DHT!");
  Serial.println("-------------------------------------");

}

int timeSinceLastRead = 0;
void loop() {

  // Report every 2 seconds.
  if(timeSinceLastRead > 2000) {
    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    float f = dht.readTemperature(true);

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      timeSinceLastRead = 0;
      return;
    }

    // Compute heat index in Fahrenheit (the default)
    float hif = dht.computeHeatIndex(f, h);
    // Compute heat index in Celsius (isFahreheit = false)
    float hic = dht.computeHeatIndex(t, h, false);

    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print(f);
    Serial.print(" *F\t");
    Serial.print("Heat index: ");
    Serial.print(hic);
    Serial.print(" *C ");
    Serial.print(hif);
    Serial.println(" *F");

    timeSinceLastRead = 0;
  }
  delay(100);
  timeSinceLastRead += 100;
}
```

## wifi繋ぐ

~~https://www.losant.com/blog/getting-started-with-the-esp8266-and-dht22-sensor~~
~~調子に乗って```CODE PT. 2```に進んでみますね。~~
~~でもLosant.hのくだりはambientにかえましょう。~~

~~https://ambidata.io/refs/arduino/~~

↑最終的にソースに残ってないし。

## mqtt

mqttもいっちゃおう。
ちょっと試行錯誤したんだけど、これがわかりやすいか。

https://github.com/JimmyTai/esp8266-AWSIoT

とまあ、[こちら](https://github.com/JimmyTai/esp8266-AWSIoT/blob/master/AWSMQTT/example/BasicPublish/BasicPublish.ino) をベースにいろいろうまくいかず、こちらにたどり着く。esp8266はtls1.1にしか対応してないんだけど、awsはtls1.2じゃないと接続できないっぽい。どうも証明書での認証のハードルが高い。。

とりあえず一回iamでの接続でやってみます。

http://ghz2000.com/wordpress/?p=1181

そんなわけで送信できました。
MQTT over WebSocket プロトコルというのを使ってるみたい。

![35.png](https://qiita-image-store.s3.amazonaws.com/0/308709/ff697447-7101-aac8-bc7f-d4bc14064467.png)
![36.png](https://qiita-image-store.s3.amazonaws.com/0/308709/e0fe657e-604e-de1e-149e-dad397947abd.png)

aws-mqtt-websocketのwebsocket-pahoの方のサンプルスケッチをテンプレにしてます。
ソースはこちら。

https://github.com/ikegam1/dht22-to-arduino-to-awsiot/blob/master/kamekusa.ino

証明書をSPIFFSに置いてみてloadCerificateしたりとかいろいろしてみたのですが、SSL周りがややこしい。。
まあ、ぜんぜんiam認証でもいいんですけどね。

ちょっと動かしてみてるけどmicroPythonより安定してそうだ。スクリプト言語だし仕方ないけど。
サブスクライブもいけるのでサーボつなげてみようかな。
しかしmicroRubyもつかってみたい。今度なにか簡単なやつで使ってみよう。

ちなみにですが、ESPDuinoの古い方のやつで、書き込みの時はD0をGNDに落とす、deepsleep使う時はD16をRSTつなげてます。
あとDHT22センサーはD4に測定用のピンを繋げてる。VCCは3.3Vの方。