ラズパイ+BME280で温湿度・気圧を取得する
公開日:
カテゴリ: Raspberry Pi
室内の温湿度の変化が気になったので、ラズパイにBME280モジュールを追加してみました。
BME280
BME280は温度・湿度・気圧のセンサーです。検索すると色々なタイプのものがヒットしますが、センサーを取り付ける基盤や配線がメーカーごとに異なっているだけで、センサー自体の仕様は同一です。I2C通信とSPI通信に対応しています(基盤の仕様によっては片方の場合あり)。
ざっと調べた感じ、有名どころでは以下の種類があります
- 秋月電子通商製
- スイッチサイエンス製
- ピンヘッダ実装版、Conta規格向け等の種類あり
- WaveShare製
- SparkFun製
今回ははんだ付けが不要なWaveShare製の基盤を使ってみます。秋葉原の千石電商1Fで販売しています。
ラズパイに接続
WaveShareのデータシートを見ながら、接続していきます。WaveShare製のBME280にはケーブルが付属しています。
今回はI2C通信を使用するため、4~5本のピンを接続する必要があります。接続先は一例で、ピンの役割が同じであればどこに刺しても大丈夫です。
ピン名 | ケーブル | ピン | 接続先 |
---|---|---|---|
VCC | 赤 | 1 | 3.3V(GPIO1) |
GND | 黒 | 9 | GND(GPIO9) |
SDA/MOSI | 青 | 3 | SDA(GPIO3) |
SCL/SCK | 黄 | 5 | SCL(GPIO5) |
ADDR/MISO | 橙 | - | なし or GND |
CS | 緑 | - | なし |
ADDR/MISOを接続するかどうかは任意です。接続する場合はGNDに接続します。このピンを接続するかどうかで、後述のマッピングされるI2Cレジスタが変わります(未接続は0x77
、GND接続の場合は0x76
)。
今回は室温を測定したいので、BME280の基盤はケースから出してケーブルで接続する必要があります。しかしラズパイ4の公式ケースを使用しているので、GPIOへアクセスするためにケーブルを引き出す穴は存在しません。
ケースに穴をぶち抜いてケーブルを通すか悩みましたが、そういえばmicroSDを使わなくなったので微妙に使えそうな穴が存在しました。この穴を使うことにします。
とりあえず穴を通りはするんですが、基盤を入れようとすると入りません。。。今更別の手を使うのも面倒になってきたので、マイナスドライバーで基盤を押し込むというゴリ押し。なんとか入りましたが、みなさんは真似をしないように。
振り返ってみると付属のケーブルはちょっと太いので、別途細いケーブルを用意すればすんなり行けそうな気がします。
・・・あと、直接関係ないですが、なんかGPIOの1番ピン(3.3V)に刺すときに変な力を入れてしまい、ピンが曲がってしまった気がしますが、見なかったことにしておきます。
接続設定
Raspberry PiのI2C通信を有効にしていない場合は有効にします。
sudo raspi-config nonint do_i2c 0
sudo reboot
I2C通信をテストするのは、専用ツールを使ったほうが楽なのでインストールします。
sudo apt install -y i2c-tools
I2Cのレジスタを検索します。引数はI2Cのバス番号です(通常は1)。
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
WaveShare製の場合、ADDR/MISOをGNDに接続している場合は0x76
、どこにも接続していない場合は0x77
が表示されれば成功です。今回はADDR/MISO線はどこにも接続していないので0x77
が表示されています。
i2cget -y 1 0x77 0xD0
BME280のレジスタを引数に加えて値を読み取ってみます。0xD0
はidレジスタで、0x60
が返ってくればBME280との読み取り通信が正常にできています。0xFB
や0xFA
を読み取れば温度を取得できますが、実際の温度は色々な補正値を用いて出力値をさらに計算する必要があります。
Prometheusに取り込み
取得できるようになった温湿度・気圧ですが、I2Cで直接値を見るだけでは面白くないので、先日構築したPrometheusに取り込んでみます。
非公式ですが、bme280-exporterというexporterがあるので、これを使います。
services:
bme280-exporter:
image: spawn2kill/bme280-exporter:1.0.0
container_name: bme280-exporter
expose:
- 8080
devices:
- /dev/i2c-1
networks:
- prometheus
restart: always
Prometheusのcompose.yml
にコンテナを追加します。devices
でI2Cデバイスをマウントします。一番後ろの数字はI2Cのバス番号です(通常は1)。
- job_name: 'bme280-exporter'
scrape_interval: 15s
static_configs:
- targets: ['bme280-exporter.prometheus:8080']
metrics_path: '/metrics/i2c-1/0x77'
prometheus.yml
でジョブを追加します。メトリクスのパスにI2Cデバイスとレジスタを設定します。
これで、以下の項目から温度・湿度・気圧が取得できます。センサから読み取った値から実際の値への計算もexporter内で行われているので、特に加工は不要です。
- bme280_temperature_celsius (単位:摂氏度)
- bme280_humidity (単位:%)
- bme280_pressure_hpa (単位:hPa)
あとは適当にダッシュボードにグラフなりメーターなりを追加して完成です。
カテゴリ: Raspberry Pi