5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (25) ディジタル湿度センサ3 I2C BME280
■複合センサ、複数インターフェース
秋月電子通商からBME280がモジュールになった製品を入手しました。温度、湿度、そして気圧が測れる複合センサです。付属しているデータシートを読んでもどのようにデータを取得するのかわかりません。ラズパイの/boot/overlaysにあるREADMEを読むと、i2c-sensorというデバイス・ドライバがBME280をサポートしていることがわかりました。
●BME280のスペック
- インターフェース;SPI(データ転送速度最大10MHz)、I2C(データ転送速度最大3.4MHz)
- 温度測定範囲;-40~+85℃、確度±1℃、分解能0.01℃
- 湿度測定範囲;0~100%、確度±3%、分解能0.008%、レスポンス1秒
- 気圧測定範囲;300~1100hPa、確度±1hPa、分解能0.18hPa
- 電源電圧;1.71~3.6V
- I2Cアドレス;0x76、0x77どちらかを選択
●BME280モジュールの内容
モジュール上にあるJ3をショートするとI2Cが有効になります。開放(デフォルト)ではSPIです。J1とJ2はI2C時のプルアップ抵抗です。ラズパイ本体にプルアップ抵抗がついているので、モジュール側は使わず、開放(デフォルト)のままにします。
細ピンヘッダが付属していますが、ジャンパピンがすぐ抜けてしまうので、一般的なピンヘッダをはんだ付けします。
●接続
GPIOのI2Cインターフェースは、3番ピンSDA、5番ピンSCLのバス1につなぎます。
●ドライバの記述
sudo nano /boot/config.txt でエディタを立ち上げ、最後の行に、
dtoverlay = i2c-sensor,bme280,param=0x76 |
もしくは、
dtoverlay=i2c-sensor,bme280,addr=0x76 |
を追加し、CTRL-O、リターン、CTRL-Xで終了し、rebootします。0x76はBME280のスレーブ・アドレスで、モジュール基板SDO(4番)をGNDにつなぎます。
リブートして、ターミナルからlsmodと入れると、組み込まれたかどうかがわかります。
i2cdetect -y 1 で接続を確認します。アドレス76ではなく76の位置にUUと表示されます。
●データの読み出し
データは、/sys/bus/i2c/devices/i2c-1/1-0076/iio:device0フォルダに入っています。データは、それぞれ下記のテキスト・ファイルに書かれています。
- 温度 in_temp_input
- 湿度 in_humidityrelative_input
- 気圧 in_presure_input
これらを読み出すだけです。
温度は千倍、湿度はそのまま、気圧は1/10の数値が入っているようです。最新版のソースを読むと、温度は百倍、湿度は整数値を1024で割る、気圧は整数値を256で割るとhPaになると書かれているので、ラズパイには古いバージョンが入っているのかもしれません。
●プログラム
DHT11のときと違って、読み出し時にエラーが出ません。しかし、数分連続して読み出していると、決まった値になり、データが更新されなくなります。
#!/usr/bin/env python
import commands
import time
while 1:
Temp = commands.getoutput("cat /sys/bus/iio/devices/iio:device0/in_temp_input")
RH = commands.getoutput("cat /sys/bus/iio/devices/iio:device0/in_humidityrelative_input")
Pre = commands.getoutput("cat /sys/bus/iio/devices/iio:device0/in_pressure_input")
print str(round((int(Temp)/1000.0),2))+"C "
print str(round(float(RH),0))+"% "
print str(round((float(Pre)*10),1))+"hPa"
time.sleep(16)
プログラムを動かした最初の値は正しいようですが、連続的に読み出すと途中で正しいデータを読み出せていないようです。スリープ時間を変えてみましたが、正しく読み出せている時間が変わることもありますが、安定しません。
いったん保留にします。
●SPI接続
デバイス・ドライバにはSPI用もあります。モジュールのJ3をショートした部分をはんだ吸い取り網を使ってはんだブリッジを外します。bme280ではなくI2Cのときに組み込まれたbmp280です。ターミナルから、
sudo modprobe bmp280_spi lsmod |
組み込まれています。
しかし、boot/overlaysにはドライバがありません。こちらのスレッドに組み込んだ例がありました。筆者はテストしていません。
●RPi.bme280ライブラリを使う
I2C接続で、Python用のライブラリを利用します。2017年11月14日現在、pipのバージョンは9.0.1でした。pythonのライブラリを管理するのがpipでPython 2.7.9以降付属しています。二つのライブラリを追加します。
pip install smbus2 pip install RPi.bme280 |
詳しいライブラリの情報です。
プログラム例です。
import smbus2
import bme280
bus = smbus2.SMBus(1)
bme280.load_calibration_params(bus, 0x76)
while 1 :
print(bme280.sample(bus, 0x76))
time.sleep(1)
1時間動かしていましたが、問題なく読み出します。
これらのデータを切り出して、Webへ表示します。
#!/usr/bin/env python
import smbus2
import bme280
import time
bus = smbus2.SMBus(1)
bme280.load_calibration_params(bus,0x76)
while 1:
moji = str(bme280.sample(bus,0x76))
print moji
tempdata = moji[moji.find("temp=")+len("temp="):moji.find("temp=")+11]
print tempdata
pressuredata = moji[moji.find("pressure=")+len("pressure="):moji.find("pressure=")+16]
print pressuredata
humiditydata = moji[moji.find("humidity=")+len("humidity="):moji.find("humidity=")+14]
print humiditydata
time.sleep(1)
f = open('index.html','w')
f.write('<META HTTP-EQUIV="Refresh" CONTENT="1">')
f.write('<span style="font-size:60px;">'+str(tempdata)+"C "+str(pressuredata)+"hPa "+str(humiditydata)+"%"+'</span>')
f.close()
新しくターミナルを立ち上げ、次の1行を入力します。
python -m SimpleHTTPServer |
別のPCを用意し、WebブラウザのURLに、
http://ラズパイのIPアドレス:8000 |
でアクセスすると、次のように温度、気圧および湿度が表示できます。1秒ごとにリフレッシュしているので、眺めているだけで、データが更新されます。
※参考URL https://www.hackster.io/gotfredsen/raspberry-pi-weather-station-8562ad
https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=167207