2021年07月29日 更新
どうも、クラゲです。
今回は、BLEデバイスからNotifyで読み込んだデータをリアルタイムにグラフ表示する方法を紹介します。横方向を時間軸として、次々とデータが流れるため、センサー値をリアルタイムでモニターするなどに最適です。
Smoothie Chartsというライブラリを活用しています。
グラフライブラリはc3.jsやChart.jsが有名ですが、Smoothie Chartsのようにオシロスコープ表示のような感じで描くことはできないと思います。
Scan と同様
Scan と同様
micro:bitが手元にない人は、HTML側のUUIDと受信データフォーマットを変更すれば、他のBLEデバイスでも対応可能です
WEB上で試せるデモページはこちら
BlueJelly Sample : Graph
ローカル環境で試したい方はこちらのGitHubからダウンロードし、advance_graph.html
を開いて実行してください。
micro:bitを傾けることで、リアルタイムに角度(-179°〜180°)をグラフに描画します
ベースは Notify です。
グラフ追加部分を見てゆきましょう。
Smoothie Chartを使うために、以下のサイトからsmoothie.js
をダウンロードしてHTMLファイルと同じ階層に置いて下さい。
http://smoothiecharts.org/smoothie.js
右クリックでダウンロードしてください
smoothie.js
を呼び出します
<script type="text/javascript" src="./smoothie.js"></script>
Smoothie Chartが描画するためのCANVASを準備します。大きさは自由に決めてOKです
<canvas id="chart" width="500" height="320"></canvas>
Global変数宣言時に、TimeSeriesのインスタンス生成を行います
ble_data
という変数名は別名に変えても良いです。
var ble_data = new TimeSeries();
createTimeline
という関数を作ります。3つの重要な要素が入っています。
new SmoothieChart
グラフの箱の部分(背景や軸)を作ります。
SmoothieChartのインスタンスを生成してchart
という名前にしています。
chart.addTimeSeries
グラフそのものを追加します。
最初に作ったble_data
をグラフの箱であるchart
に適用しています。
chart.streamTo
グラフを実際のHTMLに描画します。
HTMLで設定したCANVASに描画を結びつけています。
//-------------------------------------------------
//smoothie.js
//-------------------------------------------------
function createTimeline() {
var chart = new SmoothieChart({
millisPerPixel: 20,
grid: {
fillStyle: '#ff8319',
strokeStyle: '#ffffff',
millisPerLine: 800
},
maxValue: 1024,
minValue: 0
});
chart.addTimeSeries(ble_data, {
strokeStyle: 'rgba(255, 255, 255, 1)',
fillStyle: 'rgba(255, 255, 255, 0.2)',
lineWidth: 4
});
chart.streamTo(document.getElementById("chart"), 500);
}
上記の中身の詳細設定について説明します。
new SmoothieChart
millisPerPixel
は横軸の単位です。今回は20ms/Pixelとしています。 CANVASのサイズが500Pixelなので、横軸は10秒間を示すことになります。値を小さくするとグラフの流れが早くなり、大きくするとグラフの流れがゆっくりとなります。
gridの fillStyle
は背景色、strokeStyle
は軸と補助線の色、millisPerLine
は補助線をどのくらいの間隔で描画するかの設定です。今回は1Lineあたり800msという意味になります。グラフ全体は10秒なので、10000/800 = 12.5LINEが画面に存在することになります。
maxValue
は縦軸の最大値、minValue
は縦軸の最小値です。この設定を省略した場合は、データに応じて動的に最大・最小が変化します。アニメーションするため、見た目は面白いのですが、絶対的な値の感覚がつかみにくいため、クラゲは固定値を設定しています。
chart.addTimeSeries
strokeStyle
はグラフの色です。RGBのカラーに加えアルファ値(不透明度)を指定しています。
fillStyle
はグラフの下側領域の背景色です。同様にRGBAで指定します。
アルファ値は0〜1.0で小さいほど透明になります。
lineWidth
はグラフの太さです。
chart.streamTo
最後の引数の500
という数値は、描画のディレイ(遅延)です。0にすると最新のデータがグラフの右端でプロットされるようになりますが、次のデータが決まっていないため、右端での動きがカクカクになります。これを回避するためにディレイを設けます。逆に大きすぎるとリアルタイムではなくなるため注意が必要です。
windowロード時に先ほどの関数createTimeline
を呼ぶようにします。
//smoothie.js
createTimeline();
READ時に、取得したデータをグラフへ追加します。
1番目の引数は時間です。
//グラフへ反映
ble_data.append(new Date().getTime(), value);
これで、いい感じのグラフが描画できるようになりました!
以上、BLEでリアルタイムグラフ表示でした。