ISP1807搭載BLEマルチセンサーボードで計測した環境データ(温度・湿度・気圧)をRaspberry Piで可視化するシステムを作る

投稿者:

みなさんこんにちは佐々木です。

さて今回はISP1807搭載BLEマルチセンサーボードで計測した環境データ(温度・湿度・気圧)をRaspberry Piで可視化するシステムの構築手順を解説します。記事前半ではシステムの仕組みと構築済みのイメージファイルを使ってシステムを動かす手順を解説します。記事後半ではシステムの構築手順を一から解説しています。

環境データをRaspberry Piで可視化した図

データ可視化サービスはいろいろありますが自作するメリットは、

  • データ保存可能件数に制限なし(容量が許す限り何件でも)
  • データ保存周期に制限なし(性能が許す限り最短で)
  • グラフの見た目を自由にカスタマイズできる
  • 24時間365日自分で運用!
  • 楽しい!

です。

仕組み

次の図はシステム構成を表しています。

環境データ可視化システム構成図

主な登場人物

  • ISP1807搭載BLEマルチセンサーボード
    • 加速度・磁力・ジャイロ・温度・湿度・気圧の6つのセンサーを搭載した開発ボードです。
  • Raspberry Pi
    • スキャナ・InfluxDB・Grafanaを動かすコンピュータです。
  • スキャナ
    • アドバタイズパケットを解析して温度・湿度・気圧データをInfluxDBに保存するPythonプログラムです。
  • InfluxDB
    • オープンソースの時系列データベースです。
  • Grafana
    • オープンソースのデータ可視化ツールです。

全体の動作を解説します。

まずISP1807搭載BLEマルチセンサーボードが計測した温度・湿度・気圧データをアドバタイズパケットにのせて発信します。次にRaspberry Piに搭載されている無線モジュールがアドバタイズパケットを受信します。そしてスキャナがアドバタイズパケットを解析し温度・湿度・気圧データをInfluxDBに保存します。GrafanaはInfluxDBのデータを参照しグラフを作成します。最後にユーザがウェブブラウザでRaspberry Piにアクセスしてグラフを確認します。

アドバタイズパケットの中身

環境データはService Data - 128-bit UUIDとしてアドバタイズパケットに格納しています。アドバタイズパケットのデータサイズは最大31バイトという制限があります。長さとタイプで2バイト、128ビットのUUIDで16バイト、残りの13バイトに環境データを格納しています。環境データは2バイトの整数型を最大6個格納できるようになっています。今回はfield0~field2の3つを使っています。

  • Length (1byte)
    • 全体の長さ
  • AdType (1byte)
    • 0x21 Service Data - 128-bit UUID
  • uuid128 (16bytes)
    • f96d0000-1139-4e07-8ccf-d28be904fc0f
      • 0000の部分は可変
  • field0~5 (2~6bytes)
    • 2バイトの整数型。-32768から+32767まで。
    • 小数点以下の値を格納する場合はN倍してください。
InfluxDBの設定

InfluxDBにデータを保存するときの設定です。Grafanaはこれらの情報をもとにデータを参照します。

  • データベース名(データベースの名前)
    • SENSORDATA
  • メジャーメント(データを格納するテーブルみたいなもの)
    • sensordata
  • リテンションポリシー(データの保存期間を決める設定)
    • long_term_strage_policy
      • 保存期間2年。
      • 期間を過ぎたデータから順次消されます。
  • タグ(検索やフィルタリングに使う値)
    • addr
      • デバイスのアドレス。
    • uuid16
      • uuid128のうち先頭から2バイト目と3バイト目の値。
  • フィールド(環境データ)
    • field0field5
      • int型のみ

とりあえず動かしてみる

必要な機材とセットアップ手順を解説します。

必要なもの
Raspberry Pi 4のセットアップ

ここ(600MB程)から構築済みのイメージファイルをダウンロード&解凍してRaspberry Pi ImagerでSDカードに書き込みます。

Raspberry Pi Imagerでカスタムイメージを書き込む

CHOOSE OS > Use Custom > ダウンロードしたイメージファイルを選択
CHOOSE STRAGE > 書き込み先のSDカードを選択

SDカードの書き込みが終わったらRaspberry PiにSDカードを挿入しLANケーブルとACアダプターを接続します。起動するとすぐに周囲のデバイスのスキャンを開始します。

Raspberry Piを無線LANに接続したい場合は無線LANの設定を記述したファイルをSDカードのルートディレクトリに置いてください。

# wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="your SSID"
    psk="your Password"
}
BLEマルチセンサーボードのセットアップ

ここからスケッチをダウンロードしBLEマルチセンサーボードに書き込みます。書き込み手順はこちらの記事を参照してください。書き込みが終わったらコイン電池(CR2032)を入れて計測したい場所に設置します。屋外に設置したい場合は角を切り落としたチャック付き袋の中に入れておくと良いでしょう。

ダッシュボードを開く

ウェブブラウザでhttp://raspberrypi.local:3000/もしくはhttp://<Raspberry PiのIPアドレス>:3000/を開いてください。ユーザ名(admin)とパスワード(admin)を入力しログインします。左のメニューバーからDashboards > Manage > Sample Dashboardを選択すると計測した温度・湿度・気圧のグラフが表示されます。

よくある質問

グラフに計測値が表示されない

コイン電池の残量がなくなっていないか確認してください。Raspberry Piとの距離が遠すぎるまた間に遮蔽物がないか確認してください。Raspberry PiのすぐそばにBLEマルチセンサーボードを配置しグラフに計測値が表示されたことを確認した後、少しずつ遠ざけていって10m程度を目安にBLEマルチセンサーボードを設置してください。Raspberry Piと同じ高さにBLEマルチセンサーボードを配置すると電波が入りやすいです。

2台以上のBLEマルチセンサーボードのデータを1つのグラフに表示したい

複数のデバイスの測定値をグラフに表示

Sample Dashboardのグラフは複数のBLEマルチセンサーボードの値を区別せず表示しています。ラインを分けるためにはMACアドレスでフィルタリングする必要があります。

グラフのタイトルバーをクリック > Editを選択しクエリにWHERE address =を追加しBLEマルチセンサーボードのMACアドレスを選択します。

次に複製ボタンでクエリを複製し先ほどとは異なるMACアドレスを選択します。これを台数分繰り返します。

BLEマルチセンサーボードの設置場所をALIASに入力するとグラフに表示されるのでわかりやすくなります。

BLEマルチセンサーボードのMACアドレスはhwinfoスケッチ(Arduino IDEを起動しファイル > スケッチ例 > Adafruit Bluefruit nRF52 Libraries > Hardware > hwinfo)を書き込んでシリアルモニタの出力を確認してください。

Bluefruit 52 HW Info
MAC Address: F4:31:37:EB:5D:1E  ←MACアドレス
Device ID  : B66BD6D7231A7278
MCU Variant: nRF52840 0x41414430
Memory     : Flash = 1024 KB, RAM = 256 KB

温度・湿度・気圧以外のデータを追加したい

次のようにBLEマルチセンサーボードのスケッチを変更します。変更が終わったらスケッチをBLEマルチセンサーボードに書き込みます。

// adv_env.ino
typedef struct {
  ...
  // AD_DATA_t構造体のコメントアウトされている変数field3~5のコメントをはずす
  int16_t field3;
  int16_t field4;
  int16_t field5;
} AD_DATA_t;

void loop() {
  ...
  // loop関数でfield3~5に計測したデータを代入
  Ad_Data.field3 = (int16_t)something_data1;
  Ad_Data.field4 = (int16_t)something_data2;
  Ad_Data.field5 = (int16_t)something_data3;
  ...
}

次にダッシュボードを開いてグラフを追加します。

Add panel > Add new panel
Query >
FROM long_term_storage_policy sensordata WHERE address = MACアドレス
SELECT field3 Selectors > last
ALIAS BY something data
Panel > Settings > Panel Title > SomethingData
Panel > Display > Null value > connected
Panel > Axes > Unit > 適切な単位を選択

BLEマルチセンサーボード以外のボードを使いたい

nRF52840ベースのBLEモジュールを搭載したボードがおすすめです。アドバタイズパケットの中身をあわせればesp32などほかのBLEマイコンも使えます。

システム構築手順

ここからはシステム構築手順を解説します。構築済みのイメージファイルがあれば十分だよという方は読み飛ばしてかまいません。

作業全体の流れは次のとおりです。

  1. Raspberry Pi OS Liteのインストール
  2. InfluxDBのインストール
  3. Grafanaのインストール
  4. Python環境の構築
  5. スキャンプログラムのインストール
  6. ダッシュボードの作成

1.Raspberry Pi OS Liteのインストール

Raspberry Pi ImagerでSDカードにRaspberry Pi OS Lite(32bit)を書き込みます。sshコマンドでアクセスできるようにSDカードのルートディレクトリにsshというファイルを作成します。SDカードの書き込みが終わったらRaspberry Piを起動しsshコマンドでログインします。以降、Raspberry Pi上でコマンドを実行していきます。

まずはアップデート。

sudo apt update
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo apt clean

2.InfluxDBのインストール

InfluxDBをインストールし自動起動するように設定します。

curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt install influxdb
sudo systemctl start influxdb.service
sudo systemctl enable influxdb.service

3.Grafanaのインストール

Grafanaをインストールし自動起動するように設定します。

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.4.3_armhf.deb
sudo dpkg -i grafana_7.4.3_armhf.deb
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server

4.Python環境の構築

スキャンプログラムを動かすためのPython環境を作成しBLEライブラリとInfluxDBクライアントライブラリをインストールします。またBLEハードウェアにアクセスできるようにpiユーザをbluetoothグループに追加します。

sudo apt-get install python3-venv
cd /home/pi
python3 -m venv env
. env/bin/activate

# BLEライブラリをインストール
pip install bluepy

# piユーザをbluetoothグループに追加
sudo usermod -aG bluetooth pi
sudo setcap 'cap_net_raw,cap_net_admin+eip' env/lib/python3.7/site-packages/bluepy/bluepy-helper

# InfluxDBクライアントライブラリをインストール
pip install influxdb

5.スキャンプログラムのインストール

スキャンプログラムをインストールし自動起動するよう設定します。

sudo apt install git
git clone https://github.com/144lab/Rpi-BLE-devices-scanner.git
sudo ln -s /home/pi/Rpi-BLE-devices-scanner/Rpi-BLE-devices-scanner.service /etc/systemd/system/Rpi-BLE-devices-scanner.service
sudo systemctl start Rpi-BLE-devices-scanner
sudo systemctl enable Rpi-BLE-devices-scanner.service

# ステータス確認
sudo systemctl status Rpi-BLE-devices-scanner

# 動作ログ確認
journalctl -u Rpi-BLE-devices-scanner.service -f

6.ダッシュボードを作成する

ここからはウィブブラウザで作業します。

  1. ウェブブラウザでhttp://raspberrypi.local:3000にアクセスします
  2. ユーザadmin、パスワードadminでログインします
  3. データソースを追加します
    左のメニューバーからConfigulation > Data Sources > Add data source > InfluxDBをSelect
    Name InfluxDB
    URL http://localhost:8086
    Database SENSORDATA
    Username root
    Password root
    Save&Test
    Back
  4. ダッシュボードを作成します
    左のメニューバーからCreate > Dashboard
  5. 温度のグラフを追加します
    Add panel > Add new panel
    Query >
    FROM long_term_storage_policy sensordata WHERE address = xx:xx:xx:xx:xx:xx
    SELECT field1 Selectors > last Math math > math ( / 100)
    ALIAS BY 温度
    Panel > Settings > Panel Title > 温度
    Panel > Display > Null value > connected
    Panel > Axes > Unit > Temperature > Celsius(℃)
  1. 湿度のグラフを追加します
    Add panel > Add new panel
    Query >
    FROM long_term_storage_policy sensordata WHERE address = xx:xx:xx:xx:xx:xx
    SELECT field2 Selectors > last Math > math > math ( / 100)
    ALIAS BY 湿度
    Panel > Settings > Panel Title > 湿度
    Panel > Display > Null value > connected
    Panel > Axes > Unit > Misc > Humidity (%H)
  1. 気圧のグラフを追加します
    Add panel > Add new panel
    Query >
    FROM long_term_storage_policy sensordata WHERE address = xx:xx:xx:xx:xx:xx
    SELECT field0 Selectors > last Math > math > math ( / 100+1013.25) ※気圧データは1013.25を基準に相対値で保存しています
    ALIAS BY 大気圧
    Panel > Settings > Panel Title > 大気圧
    Panel > Display > Null value > connected
    Panel > Axes > Unit > Misc > Pressure > Hectopascals
  1. 温度のグラフを複製し見た目を変更します
    温度のグラフのタイトルをクリック > More > Duplicate
    複製した温度のグラフのタイトルをクリック > Edit
    Panel > Visualization > Stat
  1. 温度と同様に湿度・気圧のグラフを複製し見た目を変更します
  2. 最後にレイアウト整えれば完成です

まとめ

この記事ではISP1807搭載BLEマルチセンサーボードで計測した環境データ(温度・湿度・気圧)をRaspberry Piで可視化するシステムの構築手順を解説しました。構築済みのイメージファイルを使えばすぐにシステムを動かせます。ぜひご活用ください。

以上です。