TOPに戻る

測定結果をビジュアルに③四つのBME680のデータを表示<その1>

 前回、温度のデータを使ってゲージを描画しました。ここではBME680が出力する四つのデータを同時に表示する方法を考えます。最初はiframeを用いる方法です。

プログラム

 温度はtemp1.html、湿度はtemp2.html、気圧はtemp3.html、空気の汚れはtemp4.htmlに出力します。それらをindex.htmlのページにiframeでまとめて表示させます。

 全体にもたもたした表示になりました。time.sleep(2)で時間を調整していますが、ときどき絵が抜けることがあります。

 
import plotly.graph_objects as go
import subprocess
import time

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('/home/pi/index.html','w')
f.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">')
f.write('<META HTTP-EQUIV="Refresh" CONTENT="9">')
f.write('<iframe border=0 src="/home/pi/temp1.html" width=400 height=300></iframe>')
f.write('<iframe border=0 src="/home/pi/temp2.html" width=400 height=300></iframe>')
f.write('<iframe border=0 src="/home/pi/temp3.html" width=400 height=300></iframe>')
f.write('<iframe border=0 src="/home/pi/temp4.html" width=400 height=300></iframe>')
while 1: ft = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input') Temp = round(int(ft.read()) / 1000.0, 1) ft.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") time.sleep(2) fh = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_humidityrelative_input') Humi = round(float(fh.read().replace( '\n' , '' )) , 1) fh.close() drawGauge(value=Humi,legendgrouptitle_text="%",gauge_axis_dtick=10,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([0,100]),title="湿 度[%]",URL="/home/pi/temp2.html") time.sleep(2) fp = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_pressure_input') Press = round(float(fp.read()) , 1) fp.close() drawGauge(value=Press,legendgrouptitle_text="hPa",gauge_axis_dtick=100,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([600,1160]),title="気 圧[hPa]",URL="/home/pi/temp3.html") time.sleep(2) fa = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_resistance_input') Air = int(fa.read()) fa.close() drawGauge(value=Air,legendgrouptitle_text="ohm",gauge_axis_dtick=1000,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([0,10000]),title="大気の汚れ[Ω]",URL="/home/pi/temp4.html") time.sleep(2) f.flush() time.sleep(2) f.close()

 実行例です。

大気の汚れのエラー

 頻度高く、大気の汚れの読み出しでI/Oエラーがでます。データが入っていないのか、何らかのゴミ・データが書き込まれているようです。

 while文のところで、対応をしました。表示データとしてはおかしいですが、プログラム自体は止まらないで済みます。


while 1:

    ft = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
    try:
        Temp = round(int(ft.read()) / 1000.0, 1)
    except:
        Temp = 1
    ft.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")
    time.sleep(2)

    fh = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_humidityrelative_input')
    try:
        Humi = round(float(fh.read().replace( '\n' , '' )) , 1)
    except:
        Humi = 1
    fh.close()
    drawGauge(value=Humi,legendgrouptitle_text="%",gauge_axis_dtick=10,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([0,100]),title="湿 度[%]",URL="/home/pi/temp2.html")
    time.sleep(2)

    fp = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_pressure_input')
    try:
        Press = round(float(fp.read()) , 1)
    except:
        Press = 1
    fp.close()
    drawGauge(value=Press,legendgrouptitle_text="hPa",gauge_axis_dtick=100,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([600,1160]),title="気 圧[hPa]",URL="/home/pi/temp3.html")
    time.sleep(2)

    fa = open(r'/sys/bus/i2c/devices/1-0076/iio:device0/in_resistance_input')
    try:
        Air = int(fa.read())
    except:
        Air = 1
    fa.close()
    drawGauge(value=Air,legendgrouptitle_text="ohm",gauge_axis_dtick=1000,gauge_bar_color="RED",gauge_bgcolor="#efe",gauge_axis_range=list([0,10000]),title="大気の汚れ[Ω]",URL="/home/pi/temp4.html")
    time.sleep(2)
    f.flush()

    time.sleep(2)
f.close()

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

(1) BME680の準備

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

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

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