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

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

概要

ENV HAT(気温、湿度、気圧)の情報を1分ごとにAmbientにアップしました。また基礎編をベースにしていますので、基礎部分の解説は省いています。

Ambientとは?

データをアップするときに、一番有名なサービスがAmbientだと思います。非常にかんたんで便利に使え、無料で使えます。反面有料オプションがないので、高頻度に利用することや、有償サポートなどが利用できません。

個人利用で、気温データなどをアップするのには一番お手軽だと思います。

事前作業

Ambientであらかじめ保存するチャネル作成をしておきます。チャネル名やデータ名などは、後からでも変更できます。グラフの設定なども後からでもできますので、まずはデータを登録してから変更でもいいと思います。

MyチャネルにあるチャネルIDとライトキーをpreferencesにあらかじめ保存しておいてください。

スケッチ

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

    note: need add library Ambient from library manage
    Github: https://github.com/AmbientDataInc/Ambient_ESP8266_lib
*/

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

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

WiFiClient client;
Ambient ambient;
int ambient_channelId;
char ambient_writeKey[17];

DHT12 dht12;
Adafruit_BMP280 bme280;
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);

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

  // Ambient情報取得
  preferences.begin("Ambient", true);
  ambient_channelId = preferences.getInt("channelId", 0);
  preferences.getString("writeKey", ambient_writeKey, sizeof(ambient_writeKey));
  preferences.end();

  // チャネルIDとライトキーを指定してAmbientの初期化
  ambient.begin(ambient_channelId, ambient_writeKey, &client);
}

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 = bme280.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);

    // 温度、湿度、気圧の値をAmbientに送信する
    ambient.set(1, tmp);
    ambient.set(2, hum);
    ambient.set(3, pressure);
    bool ret = ambient.send();
    Serial.printf("Ambient send() : %d\n", ret);

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

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

Ambientオフィシャルが出しているAmbientライブラリを利用していますので、事前に追加してください。

ambient.begin()でチャンネル情報などを渡し、ambient.set()で8個までのデータを登録して、ambient.send()でデータ送信ができます。

非常にシンプルで、かんたんに利用できます。ライブラリもAmbientオフィシャルですので、安心感があります。

画像のグラフ表示で途中のデータがおかしいのは実験中だったためです。表示方式は設定で変更できるので、全部を1つのグラフや、全部個別のグラフに表示することも可能です。

まとめ

非常にかんたんに利用することができました。ただ実験中はAmbientのサイトが重かったようで、なかなかページが表示されませんでした。

個人的に利用するのはありだと思いますが、クリティカルなデータ登録に使うのにはちょっと厳しいかもしれません。

続編

コメント