BME280センサーとラズパイで気温、湿度、気圧を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、BME280センサーで気温、湿度、気圧を測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

更新日 : 2023年12月1日

概要

BME280センサーに対応した拡張基板を用いることで、Raspberry Piで気温、湿度、気圧を測定することが可能になります。一方で、ハードウェアがあっても、センサーを制御するソフトウェアがなければ測定を行うことはできません。

そこで、Indoor Corgi製のRaspberry Pi拡張基板に搭載されているセンサーを一括して制御できるソフトウェア「cgsensor」を開発しました。

コマンドラインツールを使えば1行もコードを書かずに測定や記録ができるほか、Pythonパッケージでご自身のプログラムから簡単にセンサーを制御できます。本記事では気温、湿度、気圧センサー BME280を制御する方法について解説します。

拡張基板

cgsensorでは最大2チャンネルのBME280の測定に対応しています。I2Cアドレス0x76のものを「BME280」、0x77のものを「BME280#2」と表記します。

各拡張基板の対応は以下の表のとおりです。ケーブルで接続するタイプは、Rasbperry Piの発熱の影響を受けずに測定できます。

拡張基板BME280 (0x76)BME280#2 (0x77)
RPZ-PIRS別売り
ケーブルで接続
非対応
RPZ-IR-Sensor (端子実装済 外付センサーセット)付属
ケーブルで接続
付属
基板に実装
RPZ-IR-Sensor (端子未実装)別売り
ケーブルで接続
付属
基板に実装
RPi TPH Monitor付属
ケーブルで接続
別売り
ケーブルで接続
RPZ-CO2-Sensor別売り
ケーブルで接続
非対応
拡張基板別 BME280対応

I2C有効化

センサーとはI2Cで通信しますので、以下の記事を参考にI2Cを有効化して下さい。




インストール

センサー制御ソフトウェア「cgsensor」をインストールするには、以下のコマンドを実行します。ターミナルを開き、$に続くコマンドを実行して下さい。最新版へのアップグレードも同じコマンドで可能です。

ソースコードやサンプル、ライセンスはGitHubページに公開しています。

$ sudo python3 -m pip install -U cgsensor --break-system-packages

エラーが出る場合は最後のオプションを指定せずにお試しください。

$ sudo python3 -m pip install -U cgsensor

インストールが完了すると、cgsensorコマンドが使用可能になります。以下のように-hオプションを指定すると、使い方が画面に表示されます。

$ cgsensor -h

測定

bme280コマンドで、I2Cアドレス0x76のBME280で測定を行い、その結果を表示します。

$ cgsensor bme280 
BME280 測定
  温度[°C]:  29.4
  湿度[%]:   57.7
  気圧[hPa]: 1023.4

-aオプションを指定するとI2Cアドレス0x77のBME280#2で測定を行い、その結果を表示します。

$ cgsensor bme280 -a
BME280#2 測定
  温度[°C]:  36.6
  湿度[%]:   34.6
  気圧[hPa]: 1024.1

全センサーの一括測定、記録

cgsensorには対応する全センサーを一括で測定したり、連続で測定、結果をファイルに保存するといった、便利な機能が備わっています。cgsensor all … コマンドを利用します。

1回のみの測定

オプションを指定しない場合は、対応するセンサーを検出して測定し、結果を表示します。

$ cgsensor all
BME280
  温度[°C]:  29.3
  湿度[%]:   59.1
  気圧[hPa]: 1022.1
BME280#2
  温度[°C]:  34.0
  湿度[%]:   41.1
  気圧[hPa]: 1022.8
TSL2572
  明るさ[lux]:  149.3
SCD41
  CO2濃度[ppm]: 472
連続測定

-cオプションに続けて秒数を指定すると、指定した秒数おきに測定を連続して行い、時刻と測定結果を画面に表示します。値の変化を画面上でモニターしたい場合に便利です。Ctrl+Cで終了します。

$ cgsensor all -c 10
時刻, BME280 温度[°C], BME280 湿度[%], BME280 気圧[hPa]
2021/10/12 23:21:54, 29.1, 58.4, 1023.5
2021/10/12 23:22:04, 29.1, 58.5, 1023.5
2021/10/12 23:22:14, 29.0, 58.6, 1023.5
2021/10/12 23:22:24, 29.0, 58.8, 1023.5
...
ファイルに保存

-fオプションに続けてファイル名を指定すると、時刻と測定結果をcsv形式で保存します。結果の保存や解析に便利です。

ファイルが既に存在する場合は、最後の行に追記していきます。追記する場合は、センサーの増減が無いようにして下さい。増減があると列がずれる場合があります。

以下のコマンドで、1回測定を行って結果を「sensor_log.csv」に保存します。

$ cgsensor all -f sensor_log.csv

-cオプションを併用すると、一定間隔で測定を行い、かつ結果を「sensor_log.csv」に保存していきます。

$ cgsensor all -c 60 -f sensor_log.csv

きっちりと決まった時刻に測定したい場合はcronなどの定期実行ソフトウェアと連携させて下さい。以下を/etc/crontabに追記すると、毎時0分、10分、20分、30分、40分、50分に測定を行い、結果を/home/pi/sensor_log.csvに保存します。

*/10  *  * * * pi cgsensor all -f sensor_log.csv

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。

Pythonパッケージの利用

これまでコマンドラインツールでセンサーを制御する方法について解説しました。一方、ご自身のPythonプログラムからセンサーを使いたい場合は、cgsensorパッケージを利用することで簡単に制御することができます。

1度だけ測定して結果を表示するサンプルコードを用意しています。

インポート

使用前の準備として、cgsensorパッケージをインポートしておきます。

import cgsensor  # インポート
BME280クラス

BME280の機能はBME280クラスにまとめられています。まずは以下のようにインスタンスを作成します。

bme280 = cgsensor.BME280(i2c_addr=0x76)  # BME280制御クラスのインスタンス, i2c_addrは0x76/0x77から選択
測定

BME280クラスの各種メソッドや変数にアクセスしてセンサーを制御できます。

ここではforcedで1回測定します。このメソッドは、

  1. 測定実行
  2. ADCレジスター読み出し
  3. コンペンセーションレジスター読み出し
  4. 実際の気温、湿度、気圧を計算

という一連の測定の処理を全て行ってくれます。

forcedが正常に完了すると、temperature、humidity、pressure変数にそれぞれ結果が入るので、それを画面に表示しています。

bme280.forced()  # Forcedモードで測定を行い, 結果をtemperature, pressure, humidityに入れる
print('気温 {}°C'.format(bme280.temperature))  # 気温を取得して表示
print('湿度 {}%'.format(bme280.humidity))  # 湿度を取得して表示
print('気圧 {}hPa'.format(bme280.pressure))  # 気圧を取得して表示
例外

センサーが接続されていない場合も含め、センサーとの通信に失敗するとIOError例外が発生します。必要に応じて処理して下さい。

その他の機能

その他のメソッド等を利用すると、より細かい制御も可能です。ソースコードのコメントおよび、BME280データシートも合わせてご確認下さい。




注意事項

本ページの内容は、BME280に関する資料をIndoor Corgiが解釈した結果、および実際に動作させた結果をもとに記載しております。センサーに関する情報の正確性を保証するものではありません。

センサーについての情報はBosch社の資料をご確認下さい。

まとめ

センサー制御ソフトウェア「cgsensor」を利用して、BME280センサーで気温、湿度、気圧を測定する方法の解説は以上です。Pythonプログラムや他のソフトウェアと連携することで、センサーを使った様々なシステムを簡単に実装することができます。

また、「RPZ-PowerMGR」拡張基板と組み合わせると、指定した時刻だけ起動して測定することもできます。モバイルバッテリーを使って、電源の確保できない環境でのセンシングも可能になるので、検討してみてはいかがでしょうか。

CO2濃度に応じてLEDの色を変化させ、リレーで外部機器をON/OFFする

Raspberry PiとRPZ-CO2-Sensorを使ってCO2(二酸化炭素)濃度を測定し、LEDの色を変化させる応用例です。LEDを見ることで、換気の必要性がひと目でわかります。濃度が一定以上になったらリレーで換気ファンなどの外部機器をONすることも可能です。

ステッピングモーターの電流を最適化して省電力化&発熱対策 (Raspberry Pi + RPZ-Stepper)

ステッピングモーターは軽負荷や停止時であっても電流を消費するという特徴があります。RPZ-Stepperは回転時、停止時それぞれについて、電流値を変更できるため、最適な値にすることで省電力化が可能です。また、ドライバーICの温度や、消費電流の測定も可能で、発熱やバッテリーでの動作時間の見積もりが可能です。

RPZ-CO2-Sensor (Raspberry Pi用 二酸化炭素センサー/リレー 拡張基板)

Raspberry Pi(ラズパイ)用CO2センサーとリレー拡張基板です。CO2濃度を測定することで換気の目安としたり、オフィス環境の改善やスマート農業のCO2モニタリングに利用できます。CO2濃度が一定以上になった際、リレーで換気ファンなどの外部機器をON/OFFできます。7色表示可能なRGB LEDを搭載し、CO2濃度に合わせて色を変えることも可能です。