I2CはVDD、GND、SCL, SDAの4本の線でセンサーなどと簡単に繋げます。ボッシュの温度・湿度・気圧が
計測できるBME280を使ってみます。実は過去にCで開発した実績があります。そのときに比べPythonでライブラリを使えば
超簡単にできます。
これが60行くらいのソースで作れます。
用意するもの:
BME280:製品によってピンアサインが違っていますので、回路図は付けません。
ブレッドボードなどの配線パーツ
こちらの環境ではすでにインストールされていましたが、念のため次のインストールをしてください。
sudo apt install python-smbus
sudo apt install i2c-tools
RPi.bme280のインストール
https://pypi.org/project/RPi.bme280/
でRPi.bme280をダウンロードします。 インストールの方法も書いてあります。このサイトを参照してください。
確認は、
pip3 list です。
重大な注意事項
ファイル名をbme280.pyにしないでください。ファイル名の競合(?)エラーがでます。日本のみならず世界中でこの問題に苦しんだ人がいるようです。
例えばmybme280.pyなどにしましょう。
import tkinter as tk
import smbus2
import bme280 as bm
import tkinter.font as tkFont
def getTextSetting(strData):
font = tkFont.nametofont('TkDefaultFont')
font.configure(size= 24)
#height = font.metrics('ascent') + font.metrics('descent')
#height = font.metrics('linespace')
#height = font.metrics('descent')
height = font.metrics('ascent')
width = font.measure(strData)
return width, height
def onTimer():
#bme280からデータを取得
data = bm.sample(bus, ADDRESS, calibration_params)
#温度の表示
t = "気温 %0.1f ℃" % data.temperature
w, h = getTextSetting(t)
canvas.create_rectangle(10, 10, 280, 44, fill="#cccc00", outline="#ffff00")
canvas.create_text(10 + w / 2, 10 + h / 2,
font=("TkDefualtFont", 24), text = t)
#湿度の表示
t = "湿度 %0.1f %" % data.humidity
w, h = getTextSetting(t)
canvas.create_rectangle(10, 60, 280, 94, fill="pink", outline="#ff0000")
canvas.create_text(10 + w / 2, 60 + h / 2,
font=("TkDefualtFont", 24), text = t)
#気圧の表示
t = "気圧 %0.1f hPa" % data.pressure
w, h = getTextSetting(t)
canvas.create_rectangle(10, 110, 280, 144, fill="#8080aa", outline="#0000ff")
canvas.create_text(10 + w / 2, 110 + h / 2,
font=("TkDefualtFont", 24), text = t)
root.after(1000, onTimer)
if __name__ == '__main__':
PORT = 1
ADDRESS = 0x76
root = tk.Tk()
root.title('BME280')
root.geometry("300x200")
bus = smbus2.SMBus(PORT)
calibration_params = bm.load_calibration_params(bus, ADDRESS)
canvas = tk.Canvas(root, bg="lime green")
canvas.pack()
root.after(1000, onTimer)
root.mainloop()
RPi.bme280のできがよいので少ない量のソースになりました。一番時間がかかったのは、文字列の高さと幅の取得です。これがわからないと上記画面のような文字の描画位置を何回も値を変えて決定しなくてはなりません。ネットでジャストミートな情報を見つけることができませんでした。断片的な情報をつなげてできたのが
getTextSetting(strData)
です。 ちょっと納得いかなかったのが、 height = font.metrics('ascent')
です。いろいろやってみたのですが、これが実際に合っているようです。調べるのに時間がかかりましたが、結論は簡単でした。
|