新米エンジニアがm5stickCで温度を測ってグラフ化してみた

アドベントカレンダーもはやいもので10日めですね。毎日楽しく読ませていただいております。
今日は私も微力ながら記事を書かせていただきます。

#概要
m5stickCというセンサーを使い、部屋の室温を測ってグラフ化してみました。
![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/4e2ec40f-af98-7ec5-d3e6-3848e3c12794.jpeg)
m5stickCさん。実はm5stackとm5stickVという仲間もいる。
公式：https://docs.m5stack.com/#/en/core/m5stickc

グラフ化にはmachinistというサービスを使っています。
![machinist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/e958074d-8d41-ce7d-8d47-bd7427cefd3f.png)
公式：https://machinist.iij.jp/#/
値をPOSTするだけでグラフ化してくれるので楽ちん。

#温度センサー
M5StickC ENV Hat（DHT12/BMP280/BMM150搭載）を使いました。
![image2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/3a3986ff-e8ca-cda9-a064-9c037de59097.jpeg)
https://www.switch-science.com/catalog/5755/

m5stickCに刺すだけで使えるのでとても簡単です。
![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/79f0662e-a591-e571-d4e4-8fefa76c7cb5.jpeg)
さしたところ。
これを使ってまずは温度を測定してみましょう。
####手順
 - 公式（https://docs.m5stack.com/#/en/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows ）の通りに設定する
 - m5stickCとPCを接続し、arduinoIDE(https://www.arduino.cc/en/main/software )を使って、コードを流し込む。  
コードはこちら(https://lang-ship.com/blog/?p=969 )を参考に書き換えました。
ちなみに下記をそのまま動かそうとするとDHT12.hがないから無理です。といわれるので
(https://github.com/xreef/DHT12_sensor_library )からzipで落として
arduinoIDEのメニューから  
  - スケッチ
  - ライブラリをインクルード
  - ZIP形式のライブラリをインストール  
としてください。
もしほかに足りないライブラリがあった場合はライブラリをインクルードから検索すればインストールできます。

```c:templature.c
#include <M5StickC.h>
#include "DHT12.h"
#include <Adafruit_BMP280.h>
 
DHT12 dht12;
Adafruit_BMP280 bmp280;
unsigned long nextUpdate = 0;
 
void setup() {
  // M5StickC初期化
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0, 2);
  M5.Lcd.println("ENV TEST");
  
  Serial.begin(115200);

  // I2C初期化
  Wire.begin(0, 26);
 
  // bmp280初期化
  if (!bmp280.begin(0x76)) {
    Serial.println("bmp280センサーが見つかりません");
    while (1);
  }
}
 
void loop() {
  getTemperature();
  // 30秒待機
  delay(30000);
}

void getTemperature()
{
  // 気温
  float tmp = dht12.readTemperature();
  M5.Lcd.setCursor(0, 20, 2);
  M5.Lcd.printf("Temp: %2.1f C", tmp);
 
  // 湿度
  float hum = dht12.readHumidity();
  M5.Lcd.setCursor(0, 40, 2);
  M5.Lcd.printf("Humi: %2.0f %%", hum);
 
  // 気圧
  float pressure = bmp280.readPressure() / 100.0F;
  M5.Lcd.setCursor(0, 60, 2);
  M5.Lcd.printf("pressure: %6.1f hPa", pressure);
 
  // シリアル出力
  Serial.printf("Temp: %2.1f C\n", tmp);
  Serial.printf("Humi: %2.0f %%\n", hum);
  Serial.printf("pressure: %6.1f hPa\n", pressure);
}
```

![image0 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/9398bd53-446f-2b3b-3c28-eb6c38d8b901.jpeg)
温度がはかれた！けど、んん？私の部屋暑すぎない？
おそらくですがPCのそばにおいておいたのでその熱を拾っているのかと。

#Machinistへ温度データ送信  
今回はm5stickCから直接送ってみます。
####手順
- ArduinoJsonをライブラリにインストール
   - 公式doc(https://arduinojson.org/v6/doc/)
   - ArudinoJsonAssistant(https://arduinojson.org/v6/assistant/)  
     - 使い方 https://qiita.com/T-YOSH/items/00ed2356999c2ed3bec1  　　　　

ArduinoJsonの最新バージョンは6ですが使い方のリンクは5を使っているので適宜読み替えてください。
以下MachinistにPOSTするコード。

```c:machinist.c
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <M5StickC.h>
#include "DHT12.h"
#include <Adafruit_BMP280.h>

// WiFi
const char ssid[] = "YOUR_SSID";
const char passwd[] = "YOUR_PW";

WiFiClient wifiClient;
HTTPClient http;

//センサ
DHT12 dht12;
Adafruit_BMP280 bmp280;
unsigned long nextUpdate = 0;
float temp = 0.0;

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

    // I2C初期化
  Wire.begin(0, 26);
 
  // bmp280初期化
  if (!bmp280.begin(0x76)) {
    Serial.println("bmp280センサーが見つかりません");
    while (1);
  }

    // Connect WiFi
    connectWiFi();
    getTemperature();
    postJson();
}

void loop() {
    delay(60000);

    // WiFi
    if ( WiFi.status() == WL_DISCONNECTED ) {
        connectWiFi(); 
    }

    getTemperature();
    postJson();
}

void connectWiFi()
{
    WiFi.begin(ssid, passwd);
    Serial.print("WiFi connecting...");
    while(WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }
    Serial.print(" connected. ");
    Serial.println(WiFi.localIP());
}

void getTemperature()
{
  // 気温
  temp = dht12.readTemperature();
  Serial.print(temp);
}

void postJson()
{
  //POST json
  const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3);
  DynamicJsonDocument doc(capacity);
  char Buffer[512];
    
  doc["agent"] = "m5stickC";

  JsonArray metrics = doc.createNestedArray("metrics");

  JsonObject metrics_0 = metrics.createNestedObject();
  metrics_0["name"] = "temperature";
  metrics_0["namespace"] = "Environment Sensor";
  JsonObject metrics_0_data_point = metrics_0.createNestedObject("data_point");
  metrics_0_data_point["value"] = temp;

  serializeJson(doc, Buffer, sizeof(Buffer));
  Serial.print(Buffer);

  HTTPClient http;
  http.begin("https://gw.machinist.iij.jp/endpoint");      
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", "Bearer YOUR_APIKEY");
  int httpCode = http.POST(Buffer);

  Serial.print(httpCode);
}
```

では早速見てみましょうか。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505652/01a70687-9366-b013-1789-353fbeefb38b.png)
グラフになってるー。うれしい。


#所感
IoTの部署に配属されたので、生まれて初めてIoT機器を触ってみたのですが

- 電子回路をあっさり組む猛者だらけ
- 基盤ごとに違うライブラリ
- センサー15円送料600円！

などなかなか大変な業界だなという印象です。
初心者向けの記事がもう少しあれば助かるなあ。

もともとは温度センサーとエアコンのリモコンを連動して、自動で部屋の温度調整をするというシステムの構築が目的だったので、もう少し頑張ってみます。機会があればまたどこかで。