[ラズパイ] 気圧・気温・湿度センサー(BME280)をつなげてPython3で表示させる

 最近センサーを買いあさっています。でも、国内のはお高いので、中国発送や台湾発送の激安センサーを買って試す遊びをしています。

この方法には難点があって、いつ届くかわからない『永遠にお待ちください』放置プレー後、忘れた頃に届いて、なんだこれ?的な雰囲気の中、開封すると思い出して、ゲーム再開となりますw

このセンサーもその一つで20日かかって、はるばる台湾からやってきた。もっと早くしたい人は、スイッチサイエンスさんからも発売されており、Amazonで検索しても国内発送のがいっぱい出てくるからそこから買ってね。

I2C接続で、気温、湿度、気圧が測れる。スイッチサイエンスさんが、Python用のライブラリを用意してくれてるみたいで、いろんなところで紹介されてる。

 スイッチサイエンスさんのライブラリを使ってもよかったんですが、それじゃ、他のブログのほうが懇切丁寧に説明されていて、ここのアドバンテージがないので、今回は下のgithubのライブラリを使ってみることにしました。目標はRaspbianの標準で入っているPythonのプログラムエディタ「Mu」(Python3)で気温・湿度・大気圧をBME280のライブラリを使わせていただき手抜きして表示するところまでです。

 センサーの裏にVCC、SCL、SDA、GNDって書いてあるから、ピンを見てちゃんと接続。ラズパイにつなぐBME280の電圧は3.3VなのでVCCは3.3Vに接続(写真はGND-SDOをショートして0x76にしているが不要かも)

 とりあえず、アドレスが認識されているのを確認。アドレスはSDOに何もつながなければ(GNDレベル)0x76、SDOをVCCにショートさせると0x77となる。SPI接続もできるとのこと、今回はI2C接続で行う。I2C接続をする前準備はここを参考にして、i2cdetectを動かせるようにしておけばOK。

なるべくGUIな自分はコマンドラインを使いたくないんだけど(MSDOS時代は大好きだったんだよ)、i2cをつないだらterminalで

user@computer:$ i2cdetect -y 1

これを呪文のように入れる。アドレスがちゃんと認識されているかどうかを見るコマンド。

とりあえず、0x76として認識してることがわかる。これでセンサーを使う準備は完了~。

次に、githubからライブラリをDLしていく手順。Windowsライクに説明していく。

新しいフォルダ(bme280_testとした)をデスクトップに作る。

.フォルダを開いて、[ツール] – [現在のフォルダを端末で開く]をするとターミナルが開く、そこで

user@computer:$ sudo git clone https://github.com/rm-hull/bme280

を実行。これはgtihubからライブラリー一式をクローン(コピー)するコマンド。bme280_testの中にbm280ってフォルダができればok。

余談だけど、エクスプローラー風に使えるのはいいんだけど、OSの性質上、権限がないとsudoで作ったファイルやらを移動したり消したりできない。権限がないため~みたいに怒られる。Windowsを使っているとどうしても、この辺がめんどくさいので、ターミナルから

user@computer:$ sudo pcmanfm

で開いたファイルマネージャを使えば自由に消したり移動できたりできる。自分はめんどいから、デスクトップにショートカットで置いてある。上の参考サイト、ちょっとコマンドスペルミスしてるから、コピペするときは上のやつをしてね(コマンド通らなくてしばらく悩んだw)

話しの続き・・・

user@computer:$ cd bme280

でディレクトリを変更してもいいし、bm280をダブルクリックして、さっきの[ツール] – [現在のフォルダを端末で開く]でもいいので、カレントディレクトリ(現在の場所)を変える。そこで

user@computer:$ sudo python3 setup.py install

でpython3にインストールする。少し時間がかかり、コマンド待ち受け状態になるので待ちましょう。終わったらMuを起動して、

ここのExample Usageのコードをべた付け([bme280]-[example]の中にも入ってるけどw)

import smbus2
import bme280

port = 1
address = 0x76
bus = smbus2.SMBus(port)

calibration_params = bme280.load_calibration_params(bus, address)

# the sample method will take a single reading and return a
# compensated_reading object
data = bme280.sample(bus, address, calibration_params)

# the compensated_reading class has the following attributes
print(data.id)
print(data.timestamp)
print(data.temperature)
print(data.pressure)
print(data.humidity)

# there is a handy string representation too
print(data)

で、bm280_sample.pyとでも名前を付けて保存して、実行ボタンを押す

すると、下のウインドウに気温(18.945度)、気圧(1016.16hPa)、湿度(59.29%)がでる。calibration_paramsを取得してbme280.sampleで値(data)を取得するということらしい。

For a data-logger like application, periodically call

1
bme2.sample(bus, address, calibration_params)

to get time-based readings.

って書いてあるように、データロガーアプリを作る際には、bme280.sampleを定期的に呼べばいいってことから、calibration_params取得は最初一回でいいみたいだね。