Raspberry PiでBMP085:I2C経由の高精度温度・気圧測定
ボッシュBMP085は、コンパクトで低コストなI2Cセンサーであり、精密な気圧と温度測定を提供します。eBayで数ドルで入手可能で、気象観測ステーション、高度ロガー、信頼できる環境データを必要とするあらゆるプロジェクトに最適なコンポーネントです。
AdafruitのBMP085ガイドとライブラリはターンキーソリューションを提供しますが、コードを深く理解することで、生データを人間が読める値に変換する補正フォーミュラへの理解が深まります。以下では、Adafruitのリファレンスと独自のPython実装を組み合わせ、センサーの動作原理を正確に示します。
- Maarten DamenのBus Pirateチュートリアル(アーカイブ) – I2C診断に最適。
- John BurnのCコードのPython移植 – GitHubリポジトリ。
BMP085をRaspberry Piに配線するのは簡単:VCCを3.3V、GNDをグランド、SDAをGPIO2、SCLをGPIO3に接続。I2Cアドレスはデフォルトで0x77。
# BMP085 I2Cアドレス
BMP085_ADDR = 0x77
Python実装
import smbus
import time
class BMP085:
# オーバーサンプリング設定(0–3)。3が最高精度。
OSS = 3
def __init__(self, i2c, address=BMP085_ADDR):
self.i2c = i2c
self.address = address
# キャリブレーション係数 – EEPROMから1回読み取り
self.ac1 = self._read_signed(0xAA)
self.ac2 = self._read_signed(0xAC)
self.ac3 = self._read_signed(0xAE)
self.ac4 = self._read_unsigned(0xB0)
self.ac5 = self._read_unsigned(0xB2)
self.ac6 = self._read_unsigned(0xB4)
self.b1 = self._read_signed(0xB6)
self.b2 = self._read_signed(0xB8)
self.mb = self._read_signed(0xBA)
self.mc = self._read_signed(0xBC)
self.md = self._read_signed(0xBE)
def _read_unsigned(self, reg):
msb = self.i2c.read_byte_data(self.address, reg)
lsb = self.i2c.read_byte_data(self.address, reg + 1)
return (msb << 8) + lsb
def _read_signed(self, reg):
val = self._read_unsigned(reg)
return val - 65536 if val > 32767 else val
def _read_ut(self):
# 温度測定トリガー
self.i2c.write_byte_data(self.address, 0xF4, 0x2E)
time.sleep(0.0045)
return self._read_unsigned(0xF6)
def read_temperature(self):
ut = self._read_ut()
x1 = ((ut - self.ac6) * self.ac5) >> 15
x2 = (self.mc << 11) // (x1 + self.md)
self.b5 = x1 + x2
temp = (self.b5 + 8) >> 4 # 0.1℃単位
return temp / 10.0
def _read_up(self):
# 選択されたOSSで気圧測定トリガー
cmd = 0x34 + (self.OSS << 6)
self.i2c.write_byte_data(self.address, 0xF4, cmd)
delay = (2 + (3 << self.OSS)) / 1000.0
time.sleep(delay)
msb = self.i2c.read_byte_data(self.address, 0xF6)
lsb = self.i2c.read_byte_data(self.address, 0xF7)
xlsb = self.i2c.read_byte_data(self.address, 0xF8)
up = ((msb << 16) + (lsb << 8) + xlsb) >> (8 - self.OSS)
return up
def read_pressure(self):
up = self._read_up()
b6 = self.b5 - 4000
x1 = (self.b2 * (b6 * b6) >> 12) >> 11
x2 = (self.ac2 * b6) >> 11
x3 = x1 + x2
b3 = (((self.ac1 * 4 + x3) << self.OSS) + 2) >> 2
x1 = (self.ac3 * b6) >> 13
x2 = (self.b1 * (b6 * b6) >> 12) >> 16
x3 = ((x1 + x2) + 2) >> 2
b4 = (self.ac4 * (x3 + 32768)) >> 15
b7 = (up - b3) * (50000 >> self.OSS)
if b7 < 0x80000000:
p = (b7 * 2) // b4
else:
p = (b7 // b4) << 1
p = ((p + 1) * 1) >> 1
x1 = (p >> 8) * (p >> 8)
x1 = (x1 * 3038) >> 16
x2 = (-7357 * p) >> 16
p = p + ((x1 + x2 + 3791) >> 4)
return p # Pa単位
# 使用例
bus = smbus.SMBus(1) # Raspberry Pi I2Cバス
bmp = BMP085(bus)
print(f"Temperature: {bmp.read_temperature():.2f} °C")
print(f"Pressure: {bmp.read_pressure() / 100:.2f} hPa")
このスクリプトは、ボッシュのBMP085データシートで説明されている完全なキャリブレーションルーチンを実行します。プログラム実行で摂氏温度とヘクトパスカル単位の気圧が出力され、あらゆるPythonアプリケーションで利用可能です。
なぜ自作するのか?
Adafruitライブラリを使えば時間を節約できますが、センサーの背後にある数学を理解することで、サンプリングレートの調整、生データストリームの処理、他のマイクロコントローラへの移植が可能になります。ホビイストであれ熟練エンジニアであれ、BMP085の内部動作をマスターすることは、貴重なスキルをツールキットに加えることになります。
製造プロセス
- 5ドルI2C温度センサーで作るRaspberry Pi温度ロガー
- Python、SQLite、LabVIEWによるRaspberry Pi高精度温度プロファイリング
- 複数DS18B20 1-WireセンサーをRaspberry Pi接続で精密温度監視
- Raspberry Pi温度・湿度ネットワークモニター – DIYセットアップガイド
- Raspberry Pi 2でDS18B20温度センサー読み取りガイド
- Raspberry PiとDS18B20によるプロフェッショナルな温度監視
- Raspberry PiでMaxim 1-WireセンサーとDS2482 I2Cブリッジを用いた温度測定
- Raspberry PiでTMP006赤外線温度センサーを使う – Pythonライブラリとセットアップガイド
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- EzTempでRaspberry Pi上の温度・湿度をシームレスに監視
- Raspberry Piでサーバークローゼットの温度を正確に監視