気圧センサBMP085をRaspberryPiに接続しグラフ表示する方法

今回は、BMP085という気圧センサを用いて、
気圧(hPa)、標高(m)が測定できるので、これをグラフ表示する。

私は気圧が低いと(低気圧が来ていると)眠たくなるような気がするので、
この減少を実際に気圧を監視することで確認したいと思う。

さて、少し話が脱線したが、
BMP085の話に戻ろうと思う。

bmp085.jpg
BMP085 (秋月電子) http://akizukidenshi.com/catalog/g/gM-08764/

秋月電子で価格は1,250円となかなかお高めだ。

◆主な仕様
・計測範囲:300~1100hPa(海抜約9000m~-500mmに相当)
・消費電流約:3μA(ウルトラ・ローパワー・モード時)
・I2Cインタフェース:最大通信速度3.4MHz
・I2Cアドレス:0x77[1110111]固定
・電源:3.3V~1.8V、または5V(3.3V三端子レギュレーター搭載)
・データ解像度:[気圧]16~19ビット、[温度]16ビット
・温度測定範囲:0~+65℃(仕様確度を満たす範囲)、-40~+85℃(動作範囲)
 

 
 
RaspberryPiとは、I2Cインタフェースで接続する。
I2C(Inter-Integrated Circuit)は、フィリップス社が提唱した周辺デバイスとのシリアル通信の方式とのことだ。
SCLとSDAという2本の線を使って、通信を行う。

まずは、ソケットピンをはんだ付けする。

bmp085_handa.jpg

上記写真は、裏側だが、
表から見て、右から順に①pin〜⑦pinと命名すると、
ピン配列は下記の通りとなる。

①pin:5V → 接続しない
②pin:3.3V → RaspberryPi 3V3(1番端子)
③pin:GND → RaspberryPi Ground(6番端子等)
④pin:SDA → RaspberryPi GPIO2(3番端子)
⑤pin:SCL → RaspberryPi GPIO3(5番端子)
⑥pin:XCLR → 接続しない
⑦pin:ECC → 接続しない

Raspberry-Pi-GPIO-Layout-Revision-2.png

ブレッドボードを使って接続した写真がこちら。

bmp085_impli.jpg

それでは、RaspberryPi側の設定を行う。

まずは、GPIOのI2Cインタフェースが使えるようにする。

$ sudo apt-get install python-smbus i2c-tools

$ sudo vi /etc/modules

#下記を追記
i2c-bcm2708
i2c-dev

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

#下記をコメントアウト
#blacklist spi-bcm2708
#blacklist i2c-bcm2708

$ sudo vi /boot/config.txt

#下記を追記
dtparam=i2c_arm=on

$ sudo raspi-config

-> 8 Advanced Options

-> A7 I2C

→ONにする

リブート

以上でI2Cインタフェースが使えるようになる(はずだ)。

きちんとI2Cインタフェースが動いているか、確認する。

$ sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — — — — — — — — — — — — — — — —

60: — — — — — — — — — — — — — — — —

70: — — — — — — — 77

次に、BMP085から、気圧等を読み取るためのサンプルプログラムを入手する。

$ wget https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/archive/master.zip
$ unzip master.zip

動かしてみる。

$ cd /Adafruit-Raspberry-Pi-Python-Code-master/Adafruit_BMP085
$ sudo python Adafruit_BMP085_example.py
 

Temperature: 20.60 C

Pressure:    1002.82 hPa

Altitude:    86.78

 
 
きちんと動作した。
 
 
 
それでは、
muninでグラフ化できるようにする。
 
余計は表示は削除する。
 

cp Adafruit_BMP085_example.py pressure.py
 
$ vi pressure.py

 

#!/usr/bin/python

from Adafruit_BMP085 import BMP085

# ===========================================================================

# Example Code

# ===========================================================================

# Initialise the BMP085 and use STANDARD mode (default value)

# bmp = BMP085(0x77, debug=True)

bmp = BMP085(0x77)

# To specify a different operating mode, uncomment one of the following:

# bmp = BMP085(0x77, 0)  # ULTRALOWPOWER Mode

# bmp = BMP085(0x77, 1)  # STANDARD Mode

# bmp = BMP085(0x77, 2)  # HIRES Mode

# bmp = BMP085(0x77, 3)  # ULTRAHIRES Mode

#temp = bmp.readTemperature()

# Read the current barometric pressure level

pressure = bmp.readPressure()

# To calculate altitude based on an estimated mean sea level pressure

# (1013.25 hPa) call the function as follows, but this won’t be very accurate

#altitude = bmp.readAltitude()

# To specify a more accurate altitude, enter the correct mean sea level

# pressure level.  For example, if the current pressure level is 1023.50 hPa

# enter 102350 since we include two decimal places in the integer value

# altitude = bmp.readAltitude(102350)

print pressure / 100.0

 
 
 
作成したpressure.py等を、/usr/local/binへ移動する。

$ sudo cp *.py /usr/local/bin

 
 
 

次に、muninでグラフ表示を行うための設定を行う。
下記のように、pressure ファイルを作成する。
 
$ sudo vi /usr/share/munin/plugins/pressure
 

!/bin/sh

#%# family=auto

#%# capabilities=autoconf

GETNUM=`python /usr/local/bin/pressure.py`

if [ $1 = “autoconf” ]; then

        if [ -n ${GETNUM} ] ; then

                echo yes

                exit 0

        else

                echo no

                exit 0

        fi

fi

if [ $1 = “config” ]; then

        echo graph_title pressure

        echo graph_args -r –lower-limit 0

        echo graph_vlabel hPa

        echo graph_category Weather

        echo total.label pressure

        echo total.min 0

        echo total.draw LINE2

        echo total.type GAUGE

        exit 0

fi

echo total.value $GETNUM;

~

 

muninでグラフ化できるように、
/etc/munin/pluginsへシンボリックリンクを張る。

$ sudo ln -s /usr/share/munin/plugins/pressure /etc/munin/plugins/pressure

次に、ここで著者はかなりハマったが、
BMP085への気圧取得アクセスは、ルート権限でなければならない。

そこで、muninがルート権限で値を取得できるように
設定を入れる。

$ sudo vi /etc/munin/plugin-conf.d/pressure

[pressure]

user root

~

これでmuninの設定は完了だ。
後はmuninを再起動するだけ。

$ /etc/init.d/munin-node restart

あとは、muninで生成したhtmlをwebサーバで公開し、閲覧する。

気圧グラフ

pressure-day.png
 
 
 
 
このように、グラフ化することができた。
この日は、だいたい1000hPa程度だった。
 
1気圧は1013hPaなので、少し気圧が低めだが、まぁこんなもんだろう。
 
 
 
 
ちなみに、BMP085は、標高と温度も測定できる。
試しに、気圧と同じように標高をグラフ化する設定を投入し、描写したグラフが下記。

 
 
標高グラフ

altitude.png

 

BMP085の高さは変えていないにもかかわらず、
標高が127mと74mの間を行ったり来たりしていることになっている。
(家が上がったり下がったりしているのだろうか、、笑)

どうも、標高は気圧と気温の変化から換算した参考値のようだ。
つまり、標高はあまり当てにならない。

ちなみに、気圧が低くなると眠くなるというのは、本当のようだ。
上述のグラフでは、気圧は一定だが、
気圧が低下した際は、やはり眠くなることが確認できた。

どうも、気圧が低くなると、酸素濃度が低下し、また、少し暗くなることから、副交感神経が刺激されて、体が省エネモードになるらしい。

コメント