現時点での情報です。最新情報はM5StickC非公式日本語リファレンスを確認してください。
概要
ENV HAT(気温、湿度、気圧)の情報を1分ごとにBeebotteにアップしました。また基礎編をベースにしていますので、基礎部分の解説は省いています。
BeebotteはURLにPOSTしてデータを送信するREST APIと、MQTTを使うMQTT APIの2種類があります。本ページではREST APIを使った方法を記述しています。
Beebotteとは?
IoT向けクラウドサービスで、さまざまな機能がありますがRESTでデータを送信して、グラフ化する機能を利用しました。
MQTTで接続したほうが、プロトコル的には軽いのですが、別途ライブラリが必要となってしまいます。
事前作業
Beebotteで事前にChannel作成と、resource作成をしておきます。
resourceは名前の他に型名が指定できます。
| 型名 | 備考 |
| any | 送信するデータタイプがわからない場合や、変わる場合 |
| number | 数値 |
| string | 文字列 |
| boolean | true or false |
| object | anyと同じ |
| function | JavaScriptを保存 |
| array | objectの配列 |
| alphabetic | アルファベット |
| alphanumeric | 英数字 |
| decimal | 10進数の数値 |
| rate | レート。0-1の値 |
| percentage | パーセンテージ。0-100の値 |
| e-mailアドレス | |
| gps | GPSアドレス JSONでlongitudeとlatitudeの値を持つ |
| cpu | CPU利用率 JSONでuser、sys、nice、idle、irqの値を持つ |
| memory | メモリー利用量 JSONでmemtotal、memfree、cached、dirtyの値を持つ |
| netif | ネットワーク利用量 JSONでrx_bytes、rx_packets、tx_bytes、tx_packetsの値を持つ |
| disk | ディスク利用量 JSONでsize、usedの値を持つ |
| temperature | 気温 |
| humidity | 湿度 |
| body_temp | 体温 |
| pressure | 気圧 |
| speed | 速度 |
| weight | 重量 |
| conductivity | 導電率 |
気温と湿度、気圧の型があるので、それぞれ作成します。tmp(temperature型)、hum(humidity型)、 pressure(pressure型)。リソースの名前はあとで変更するのが面倒なので、最初によく考えて命名しましょう。
また、スケッチの中では、外部に公開してまずいものは、Preferencesに保存しているので、本体内部にあらかじめ保存しておきます。
スケッチ
/*
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>
#include <HTTPClient.h>
Preferences preferences;
char wifi_ssid[33];
char wifi_key[65];
DHT12 dht12;
Adafruit_BMP280 bme280;
unsigned long nextUpdate = 0;
char beebotte_token[40];
char beebotte_channel[40];
void sendBeebotte(const char *token, const char *channel, const char *resource, double value) {
HTTPClient http;
String json = "{\"data\":" + String(value) + "}";
String url = "http://api.beebotte.com/v1/data/write/" + String( channel ) + "/" + String( resource ) + "?token=" + String( token );
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.POST(json);
}
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);
}
// Beebotte情報取得
preferences.begin("Beebotte", true);
preferences.getString("token", beebotte_token, sizeof(beebotte_token));
preferences.getString("channel", beebotte_channel, sizeof(beebotte_channel));
preferences.end();
}
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);
// Beebotte送信
sendBeebotte(beebotte_token, beebotte_channel, "tmp", tmp);
sendBeebotte(beebotte_token, beebotte_channel, "hum", hum);
sendBeebotte(beebotte_token, beebotte_channel, "pressure", pressure);
// 時間更新(60秒後)
nextUpdate = millis() + 60000;
}
// 1秒待機
delay(1000);
}
JSONでデータを作って、POSTするだけのシンプルなプログラムです。

画像はMQTTのときの使い回しですが、どちらで送信しても同じようにデータが蓄積していきます。
まとめ
Beebotteの認証には複数種類があり、PHPライブラリなどの中身では一番複雑なものを利用していた。しかしながらトークン認証を使うことでシンプルに投げることも可能でした。
MQTTかRESTのどちらがいいかは微妙なところですが、通信量や電力的にはMQTTですが、RESTのお手軽さも捨てがたいです。



コメント