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の方が精度が高いので、別に搭載しているのだと思います。

コメント

  1. なかよし より:

    こんにちは。お世話になっております。
    さて、こちらのサイトを参考にpreferences.hなるものを導入しようとしておりますが、
    「ESP32の内部にデータを事前に保存しておきます」とは具体的にどうすればよろしいのでしょうか?上記Preferences保存部分をコピペしpreferences.hファイルとしてLibraryフォルダーに放り込んでおけばよろしいのですか?うまくWifiの情報が取れていないようでAPに接続できないようで動いてくれません。

    • たなかまさゆき より:

      事前保存は別スケッチで「Preferences保存部分」を作成します
      一度実行すると、内部のNVS領域に保存されます。

      その状態で、本来の別スケッチでpreferences.getString()などで読み出すと事前に保存した部分を読み出すことができます。

      NVS領域は基本的には他のスケッチを転送しても、消えない領域です
      ただしたまにバグって壊れることがあり、その場合にはフラッシュ全体を初期化してから保存し直すと治ることがあるようです。

      一台でしか使わないスケッチの場合にはpreferencesを使わなくて、スケッチの中に直接書き込んでも問題ないと思います。
      ブログで紹介するときには、中身に直接書き込んでいると書き換えないといけないので、ちょっと不便なのです