はじめに
おじさんは以前にBME280をESP32やらRasPiにつないでクラウドにデータをupload していました。今回、新たにセンサーを購入し、クラウドも刷新して作ろうと思ったのですが、humidity が0と読めず、悩みに悩みました。結果、購入したものがBMP280でhumidity を出力しない、似て非なるものだった、という落ちでした。(悲しい)
購入したのははるか昔なのだが、「安いので5個まとめ買い」をしてました。多分amazon で BME280と書かれていたのではと疑っています。(←自分で確認してみるか。。。)
せっかくなので、いろいろ見直した時の内容をメモしておきます。
Raspberry Piの I2Cの設定
配線の確認
I2Cで使うので、こんな感じ。
I2Cの設定確認
raspi-config でI2Cを有効にし、i2ctools をインストールします。
$ lsmod | grep i2c
i2c_bcm2835 16384 1
i2c_dev 16384 2
$ 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: -- -- -- -- -- -- 76 --
$ cat /etc/modules | grep i2c
i2c-dev
$ cat /boot/config.txt | grep i2c
dtparam=i2c_arm=on
I2Cのbaudrate が dmesg で見れるらしいのだが、おじさんはできなかった。
I2Cのbaudrate を変えられるようなので変えてみた。この[記事]
(https://www.qoosky.io/techs/2316d68b2e)を参考に。
dtparam=i2c_baudrate=50000
を最終行に追加しました。50kということかな。
配線
当初は下記の記事を読み、pull-up 抵抗が必要かもと思いました。RasPi様は
内蔵している聞いていたので何もしていません。
おじさんはオシロ使えないので。
BME280と BMP280の区別
humidity が読めないのでわかる、というのは後付けの知識。
IDのregister を読むと明白です。以下は仕様書。
0x0Dを読んでみる。
from smbus2 import SMBus
bus_number = 1
bus = SMBus(bus_number)
i2c_address = 0x76
bus.write_byte_data(i2c_address, 0xE0, 0xB6)
print("chip ID: ", hex(bus.read_byte_data(i2c_address, 0xD0)) )
哀しいことに私のところでの実行結果は
chip ID: 0x58
だった。
初期化の処理
初期化で実行するのは
- 測定サイクルとオーバーサンプリングの設定
- configuration parameter の読み込みです
測定サイクルとOversampling の設定
- ODR (output data rate)は測定時間と待機時間から計算できる。例えば
normal mode なら 1000[ms] / ( 11.5 + 62.5) [ms] = 13.51 [Hz]
その他の特性値
- IIR filter の時定数、消費電流は ODRから計算できる。
config パラメータの読み込み
0x88から0xE7まで読みます。ここら辺はたくさんの実装例が転がっているので省略。
ソースコード
python でこんなのもあった。
まとめ
BME280 (Bosch)だと思ってhumidityを読もうとしたが、実はBMP280で読めなかった。確認するにはレジスタ値で chip ID を確認すればよい。
(2021/07/25)