目標
HAT-YUNで観測した値をデータベースに入れて記録したい。かっこいいグラフ表示とか出来たらもっといいよね!
材料
・M5Stick-C
https://www.switch-science.com/catalog/5517/
・YUN-HAT
https://www.switch-science.com/catalog/6072/
・InfluxDBが動いてるサーバ
今回はUbuntuのパッケージにあったInfluxDB 1.1.1を使いましたが、現時点での最新バージョンは1.8.3です。動作確認出来た方がいましたらコメントお願いします。
初期設定
動作確認
Arduinoを開いて、
ファイル>スケッチ例>M5StickC>Hat>YUN
に、公式のサンプルソースがあるので、開いて書き込みます。
// Adafruit_BMP280 lib in Sketch->Includ Library->Library Manager
とあるので、Adafruit_BMP280ライブラリをインストール。
書き込み時に、エラーが出る場合はG0をジャンパーピン等でGNDに繋ぐと、書き込める場合があります。
InfluxDBの準備
インストール方法は公式を参考に。
https://docs.influxdata.com/influxdb/v1.8/introduction/install/
UDPを使えるようにする
運用場面においてtcpにするメリットは無いのでudpを使います。
viの使い方はググってください。
$ sudo vi /etc/influxdb/influxdb.conf
必要箇所のコメントアウトを削除。
[[udp]]
# enabled = false
enabled = true
bind-address = ":8089"
database = "udp"
influxdbを再起動
$ sudo service influxdb restart
データベースを作る
$ influx
CREATE DATABASE udp
quit
ソース
YUN.ino
// please install Adafruit_BMP280 lib first
// Adafruit_BMP280 lib in Sketch->Includ Library->Library Manager
# include "M5StickC.h"
# include <Adafruit_BMP280.h>
# include "SHT20.h"
# include "yunBoard.h"
# include <WiFi.h>
# include <WiFiUdp.h>
char ssid[] = "YOUR-WiFi-SSID";
const char* password = "WiFi-pass";
// the IP address of your InfluxDB host
byte host[] = {192, 168, 1, 60};
// the port that the InfluxDB UDP plugin is listening on
int port = 8089;
SHT20 sht20;
Adafruit_BMP280 bmp;
uint32_t update_time = 0;
float tmp, hum;
float pressure;
uint16_t light;
WiFiUDP udp;
void setup() {
M5.begin();
Wire.begin(0, 26, 100000);
M5.Lcd.setRotation(1);
M5.Lcd.setTextSize(2);
M5.Lcd.fillScreen(BLACK);
// RGB888
// led_set(uint8_t 1, 0x080808);
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_1000); /* Standby time. */
// put your setup code here, to run once:
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
}
uint8_t color_light = 5;
void loop() {
// led_set_all((color_light << 16) | (color_light << 8) | color_light);
if(millis() > update_time) {
update_time = millis() + 1000;
tmp = sht20.read_temperature();
hum = sht20.read_humidity();
light = light_get();
pressure = bmp.readPressure();
M5.Lcd.setCursor(0, 8);
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Lcd.printf("tmp:%.2f\r\n", tmp);
M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
M5.Lcd.printf("hum:%.2f\r\n", hum);
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Lcd.printf("pre:%.2f\r\n", pressure/100);
M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
M5.Lcd.printf("light:%04d\r\n", light);
}
M5.update();
Serial.println(pressure/100);
if(M5.BtnA.wasPressed()) {
esp_restart();
}
delay(100);
// put your main code here, to run repeatedly:
byte addr[8];
uint8_t chipid[6];
esp_efuse_read_mac(chipid);
String id=String(chipid[0],HEX)+String(chipid[1],HEX)+String(chipid[2],HEX)+String(chipid[3],HEX)+String(chipid[4],HEX)+String(chipid[5],HEX);
String line;
line="sensor,mac="+id+" device=\"yun\",tmp="+tmp+",hum="+hum+",pre="+pressure/100+",light="+light;
Serial.println(line);
udp.beginPacket(host, port);
udp.print(line);
/* line output sample
sensor,mac=11a11d11ff00 device="yun",tmp=30.99,hum=35.00,pre=1013.3,light=400
*/
udp.endPacket();
delay(10000);
}
Grafana
https://grafana.com/docs/grafana/latest/installation/
公式通りにインストール。
特に迷う所は無いと思いますが、humのクエリーはこんな感じ。
SELECT mean("hum") FROM "sensor" WHERE $timeFilter GROUP BY time($__interval) fill(null)
追記:FBで教えてもらいました。下に表示されている項目をクリックすると、左側のy軸か右側か選択できます。