測定結果をビジュアルに②BME680のデータの取得と表示
前回、BME680のデバイス・ドライバを入れて、温度、湿度、気圧、空気の汚れのデータが、/sys/bus/i2c/devices/1-0076/iio:device0フォルダに保存されることを確認しました。
●データの読み出し
それぞれの値を読み出して、一般的な桁数に直します。
import time
while 1:
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close()
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_humidityrelative_input')
Humi = round(float(f.read().replace( '\n' , '' )) , 1)
f.close()
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_pressure_input')
Press = round(float(f.read()) , 1)
f.close()
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_resistance_input')
Air = int(f.read())
f.close()
message = "Temp :%sC, Humi :%sRH, Press :%shPa Air :%dohm"
print(message % (Temp, Humi, Press,Air))
time.sleep(3.14)
実行中の様子です。
●ゲージのグラフを描く
pip3を使って、plotlyのライブラリをインストールします。
温度のデータを使ってゲージのグラフを描きます。
modeは、ゲージの絵と数値を同時に表示する指定です。
valueは、この絵に渡す数値データです。ここではTemp温度データです。
domainは、相対的な大きさを設定できます。
gauge_axis_dtickは、目盛の間隔の指定です。
gauge_axis_tickwidthは、目盛のちょっと飛び出している部分の太さの指定です。
gauge_bar_colorは、valueの値の部分の色を指定します。
gauge_bar_line_widthは、valueの側の線の太さの指定です。
gauge_bar_thicknessは、valueの幅です。1で目いっぱいの幅になります。
gauge_bgcolorは、隙間の色を指定します。
gauge_axis_rangeは、valueの下限と上限の設定です。
titleは、図の上に表示する文字列です。
write_html()は、出力はhtmlであることを指示しています。
import plotly.graph_objects as go
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close()
fig = go.Figure(go.Indicator(
mode = "gauge+number",
value = Temp,
domain = {'x': [0, 1.0], 'y': [0, 1.0]},
gauge_axis_dtick= 2,
gauge_axis_tickwidth=3,
gauge_bar_color="red",
gauge_bar_line_width=1,
gauge_bar_thickness=0.85,
gauge_bgcolor="#fdf",
gauge_axis_range=[0,50],
title = {'text': "温度[`C]"}
))
fig.write_html('/home/pi/index.html')
Webブラウザで/home/pi/index.htmlを開きます。
●ゲージの描画を関数にする
汎用性を上げるために関数にしました。
import plotly.graph_objects as go
def drawGauge(value,legendgrouptitle_text,gauge_axis_dtick,gauge_bar_color,gauge_bgcolor,gauge_axis_range,title,URL):
fig = go.Figure(go.Indicator(
mode = "gauge+number",
value = value,
legendgrouptitle_text = legendgrouptitle_text,
domain = {'x': [0, 1.0], 'y': [0, 1.0]},
gauge_axis_dtick= gauge_axis_dtick,
gauge_axis_tickwidth=3,
gauge_bar_color=gauge_bar_color,
gauge_bar_line_width=1,
gauge_bar_thickness=0.85,
gauge_bgcolor=gauge_bgcolor,
gauge_axis_range=gauge_axis_range,
title = {'text': title}
))
fig.write_html(URL)
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close()
drawGauge(value=Temp,legendgrouptitle_text="`C",gauge_axis_dtick=5,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([0,60]),title="温 度[`C]",URL="/home/pi/temp1.html")