M5StickCにENV HAT(気温、湿度、気圧)をサーバーにアップする その1(基礎編)

現時点での情報です。最新情報はM5StickC非公式日本語リファレンスを確認してください。

概要

時系列データを分単位でアップする試験をしました。ENV HATは3つセンサーを搭載していますが、BMM150は磁界センサーのため、DHT12(気温、湿度)とBMP280(気圧)を取得しています。

基礎編では、サーバーにアップするまえのデータ取得と、API KEYなどの処理を解説します。

個別サービスの利用方法は、別ページでまとめてあります。

ベーススケッチ

/*
    note: need add library Adafruit_BMP280 from library manage
    Github: https://github.com/adafruit/Adafruit_BMP280_Library
*/

#include <M5StickC.h>
#include <Preferences.h>
#include <WiFi.h>
#include "DHT12.h"
#include <Adafruit_BMP280.h>

Preferences preferences;
char wifi_ssid[33];
char wifi_key[65];

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");

  // Wi-Fiアクセスポイント情報取得
  preferences.begin("Wi-Fi", true);
  preferences.getString("ssid", wifi_ssid, sizeof(wifi_ssid));
  preferences.getString("key", wifi_key, sizeof(wifi_key));
  preferences.end();

  // Wi-Fi接続
  Serial.printf("接続中 - %s ", wifi_ssid);
  WiFi.begin(wifi_ssid, wifi_key);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" 接続完了");

  // I2C初期化
  Wire.begin(0, 26);

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

void loop() {
  // 気温
  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);

  // 1分に1度データ送信
  if ( nextUpdate < millis() ) {
    // シリアル出力
    Serial.printf("Temp: %2.1f C\n", tmp);
    Serial.printf("Humi: %2.0f %%\n", hum);
    Serial.printf("pressure: %6.1f hPa\n", pressure);

    // 時間更新(60秒後)
    nextUpdate = millis() + 60000;
  }

  // 1秒待機
  delay(1000);
}

ENV HATのサンプルスケッチからBMM150関連を削り、Wi-Fi接続を追加したベーススケッチです。このスケッチをベースにして、各種サーバーにデータをアップロードしていきたいと思います。

注意事項として、事前にAdafruit_BMP280ライブラリを環境に追加する必要があります。

画面上は1秒間隔でデータ更新していますが、データ送信は60秒間隔です。実際には実処理時間+60秒なので、65秒前後間隔になりますので注意してください。

Wi-Fiまわりはスケッチ内部にSSIDを記述するのではなく、ESP32内部のPreferencesに保存したものを利用しています。

これは同じソースコードで、いろいろな環境に使い回せるようにと、間違って自分の環境のSSIDなどをブログにアップしてしまうのを防ぐためになります。

Preferences保存部分

#include <Preferences.h>

Preferences preferences;

void setup() {
  preferences.begin("Wi-Fi", false);
  preferences.putString("ssid", "*****");
  preferences.putString("key", "******");
  preferences.end();

  preferences.begin("Ambient", false);
  preferences.putInt("channelId", 12345);
  preferences.putString("writeKey", "********");
  preferences.end();

  preferences.begin("ThingSpeak", false);
  preferences.putInt("chID", 12345);
  preferences.putString("apiKey", "**********");
  preferences.end();

  preferences.begin("Machinist", false);
  preferences.putString("apiKey", "************");
  preferences.putString("agentName", "****");
  preferences.putString("namespace", "***");
  preferences.putString("tagName", "******");
  preferences.putString("tagValue", "**");
  preferences.end();

  preferences.begin("Beebotte", false);
  preferences.putString("token", "token_*********");
  preferences.putString("channel", "***");
  preferences.end();
}

void loop() {
}

こんな感じのコードで、ESP32の内部にデータを事前に保存しておきます。

まとめ

ENV HATでは構造上M5StickCと密着しているので、M5StickCが発熱する温度の影響を受けて、気温が高めに表示されます。

Grove端子を使ったENV UNITなど本体から離した方が精度は高いはずです。またBMP280にも温度計が内蔵されていますが、気圧計測で内部補正に利用するための温度計であり、あまり精度が高くありません。BME280などの湿度計が内蔵されているものもありますが、おそらくDHT12の方が精度が高いので、別に搭載しているのだと思います。

コメントする

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)