M5StickCとGrafanaで室内の環境を記録&可視化してみた

はじめに

M5StickCというマイコンを買ったので、センサをつないでいろいろしてみました。
その中で少しはまった部分があるので、 知見を記録しておこうと思います。
www.switch-science.com

買ったもの

M5StickCは現在(8/28)、在庫がなくなっています。8/15に在庫が復活しているのを見つけて速攻で買いました。価格と技適のことを考えると、スイッチサイエンスで購入するのが一番いい気がします。

作ったもの

M5StickCに繋いだ気圧・温度センサの値をInfluxDBに記録し、Grafanaで可視化する仕組みを作りました。M5StickCにはGroveの端子がついているのでセンサを取り付けるのは簡単です。ちょっと固い感じですが、しっかり奥まで差し込めます。
また、M5StickCはWiFiに接続することができるので、センサのデータをHTTPでサーバーに送信することができます。InfluxDBは時系列データベースの一つで、WebAPIを叩くことでデータを記録することができます。
Grafanaはデータの可視化ツールで、InfluxDBに記録された値を様々な形式で可視化することができます。

仕組み

M5StickC側のコードは、GitHubで公開しています。
github.com
仕組みはシンプルで、定期的に

  1. センサデータの取得
  2. InfluxDBへのアップロード
  3. センサデータのディスプレイへの表示
  4. 現在時刻の表示

を行っています。

f:id:sublimer:20190828192218j:plainf:id:sublimer:20190828192202j:plain
f:id:sublimer:20190828192206j:plainf:id:sublimer:20190828192212j:plain

Groveで接続したBMP280のアドレスは0x77です。

while (!bmp280.begin(0x77)) {
    Serial.println("BMP280 init fail");
    delay(500);
}

InfluxDBへのデータ記録はHTTPでPOSTしてあげると簡単にできます。
記録するデータベース、InfluxDBのユーザー名とパスワードはクエリパラメーターで指定します。

http://example.com:8086/write?db=<dbname>&u=<username>&p=<password>

また、WiFi接続後に内蔵RTCを現在時刻に合わせています。

const char *NTP_SERVER = "ntp.nict.jp";

configTime(9 * 3600, 0, NTP_SERVER);

こんな感じでNTPサーバーを指定して時刻を合わせることができます。福岡大学のNTPサーバーを使うのは止めましょう。
あとはGrafanaのダッシュボードにグラフなどを追加すればOKです。
f:id:sublimer:20190828123013p:plain

はまったところ

ヘッダファイルのインクルード順を間違えると、

Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x400d15b3  PS      : 0x00060b30  A0      : 0x800d1d4e  A1      : 0x3ffe3b50  
A2      : 0x3ffbfdd8  A3      : 0x00000000  A4      : 0x00000016  A5      : 0x00000000  
A6      : 0x0000ffff  A7      : 0x00000000  A8      : 0x800d15a7  A9      : 0x3ffe3b20  
A10     : 0x3ffbfdd8  A11     : 0x3ffbebe0  A12     : 0x00000000  A13     : 0x00000015  
A14     : 0x00000000  A15     : 0x3ffbebe0  SAR     : 0x0000000a  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x0000001c  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0xffffffff  

Backtrace: 0x400d15b3:0x3ffe3b50 0x400d1d4b:0x3ffe3b70 0x400d1c5e:0x3ffe3b90 0x400d1cbe:0x3ffe3bb0 0x400d959b:0x3ffe3bd0 0x400831f8:0x3ffe3bf0 0x400833d1:0x3ffe3c20 0x40078f0b:0x3ffe3c40 0x40078f71:0x3ffe3c70 0x40078f7c:0x3ffe3ca0 0x40079145:0x3ffe3cc0 0x400806ce:0x3ffe3df0 0x40007c31:0x3ffe3eb0 0x4000073d:0x3ffe3f20

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:8424
ho 0 tail 12 room 4
load:0x40080400,len:5868
entry 0x4008069c

というようなエラーがシリアルモニターに表示され、永遠に再起動を繰り返します。
どうも、Adafruit_Sensor.hM5StickC.hよりも先にインクルードするとこの症状が発生するようです。
以下の順番であれば正常に動作しました。

#include <M5StickC.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>

終わりに

M5StickCは小型で高機能で扱いやすい、とても素晴らしいデバイスだと思いました。キットには手首に着けるためのバンドも入っているので、スマートウォッチのようなデバイスも簡単に作れると思います。
在庫が復活したら、ぜひ使ってみてください。