TOPに戻る

測定結果をビジュアルに②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")

連載 測定結果をビジュアルに

(1) BME680の準備

(2) BME680のデータの取得と表示

(3) 四つのBME680のデータを表示<その1>

(4) 四つのBME680のデータを表示<その2>