Raspberry Pi 4 + Python3入門 <STEP1> (3) 7セグメントLED 74HC595 その3 4桁にBME280の測定データを表示
前回、4桁の7セグメントLEDに表示するプログラムができました。’26.3’というダミー・データでした。ここでは、温度、湿度、気圧の測定ができるボッシュのセンサBME280を利用し、その測定データを表示できるようにします。
●センサBME280
この記事で利用したI2C専用のBME280ブレークアウト・ボードを利用します。というか、その実験でつないだままになっています。デバイス・ドライバを利用して計測していたのを、アプリケーションから使いたいので、
#dtoverlay = i2c-sensor,bme280,param=0x76 |
/boot/config.txt内でコメントアウトし、リブートします。
デバイス・ドライバで利用していたとき、スレーブ・アドレスの0x76の場所にはUUと表示されていましたが、上記の修正後は、i2cdetectの実行で次のように表示されます。
BME280のライブラリは検索するとたくさん見つかりますが、こちらの記事で利用したライブラリRPi.bme280をインストールします。Python3はユーティリティpip3を使います。pip3はRaspbian Busterにはインストールされています。
ターミナルで、次のコマンドを実行し、RPi.bme280をインストールします。
pip3 install RPi.bme280 |
プログラムです。エディタMuに貼り付けてそのまま実行します。
import smbus, time, bme280
bus = smbus.SMBus(1)
bme280.load_calibration_params(bus, 0x76)
while 1:
print(bme280.sample(bus,0x76))
time.sleep(3.14)
実行すると、1行で測定データを表示します。
●7セグメントLEDに表示する
上記の実行例のように長い文字列の中に温度、湿度、気圧が表示されているので、切り出して7セグメント表示関数へ渡します。
表示関数disp7seg()は、前回から少し拡張し、マイナスの表示に対応しました。
例えば、温度であれば、長い文字列から’temp=’という文字列を探し出し、そのインデックス値+’temp=’の5文字分ずらし、4文字分を取り出します。温度は小数点第1位、気圧は整数、湿度は小数点第1位まで、それぞれ4桁を取り出しています。
マイナスの気温はテスト・データで表示を確認しているだけなので、実際の測定で正しく表示できるかは不明です。
import spidev, smbus, time, bme280
bus = smbus.SMBus(1)
bme280.load_calibration_params(bus, 0x76)
spi = spidev.SpiDev()
spi.open(0,0) # CE0
spi.max_speed_hz = 1000000 # 1MHz
# gfedcba LED segment
dot = ~0b10000000
blank = ~0b00000000
minus = ~0b01000000
data = [ 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111 ]
def disp7seg(tempData):
minusFlag = 0
if '-' in str(tempData):
tempData = abs(float(tempData))
minusFlag = 1
dispTempData = list(str(tempData))[::-1] # reversed
dotFlag =0
for x in dispTempData:
if x != '.':
if dotFlag == 1:
spi.xfer([~data[int(x)] & dot])
dotFlag =0
continue
spi.xfer([~data[int(x)]])
dotFlag =0
else: # find dot
dotFlag =1
if '.' in str(tempData):
if minusFlag:
spi.xfer([minus]) #
else:
spi.xfer([blank]) #
s = bme280.sample(bus,0x76)
print(s)
findString = 'temp='
t = str(s).find(findString)
temp = str(s)[t+len(findString):t+len(findString)+4]
print('temperature ',temp)
disp7seg(temp)
time.sleep(2)
findString = 'pressure='
t = str(s).find(findString)
temp = str(s)[t+len(findString):t+len(findString)+4]
print('pressure ', temp)
disp7seg(temp)
time.sleep(2)
findString = 'humidity='
t = str(s).find(findString)
temp = str(s)[t+len(findString):t+len(findString)+4]
print('humidity ', temp)
disp7seg(temp)
print('\ndone')
(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。
実行した様子です。
最後の湿度の表示です(上記の実行時と異なる時間に動かして撮影している)。