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