はじめに
M5StickCというマイコンを買ったので、センサをつないでいろいろしてみました。
その中で少しはまった部分があるので、 知見を記録しておこうと思います。
www.switch-science.com
買ったもの
- M5StickC
- GROVE - 気圧センサ(BMP280)
- 1155円
- 気圧・温度センサ
M5StickCは現在(8/28)、在庫がなくなっています。8/15に在庫が復活しているのを見つけて速攻で買いました。価格と技適のことを考えると、スイッチサイエンスで購入するのが一番いい気がします。
作ったもの
M5StickCに繋いだ気圧・温度センサの値をInfluxDBに記録し、Grafanaで可視化する仕組みを作りました。M5StickCにはGroveの端子がついているのでセンサを取り付けるのは簡単です。ちょっと固い感じですが、しっかり奥まで差し込めます。
また、M5StickCはWiFiに接続することができるので、センサのデータをHTTPでサーバーに送信することができます。InfluxDBは時系列データベースの一つで、WebAPIを叩くことでデータを記録することができます。
Grafanaはデータの可視化ツールで、InfluxDBに記録された値を様々な形式で可視化することができます。
仕組み
M5StickC側のコードは、GitHubで公開しています。
github.com
仕組みはシンプルで、定期的に
- センサデータの取得
- InfluxDBへのアップロード
- センサデータのディスプレイへの表示
- 現在時刻の表示
を行っています。
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です。
はまったところ
ヘッダファイルのインクルード順を間違えると、
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.h
をM5StickC.h
よりも先にインクルードするとこの症状が発生するようです。
以下の順番であれば正常に動作しました。
#include <M5StickC.h> #include <Wire.h> #include "Adafruit_Sensor.h" #include <Adafruit_BMP280.h>