BME280センサーとRaspberry Piで気温、湿度、気圧を測定する

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

Raspberry Pi OS Version 2021-10-30対応

更新日 : 2021年11月23日

概要

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-IR-Sensor (端子実装済 外付センサーセット)付属
ケーブルで接続
付属
基板に実装
RPZ-IR-Sensor (端子未実装)別売り
ケーブルで接続
付属
基板に実装
RPi TPH Monitor付属
ケーブルで接続
別売り
ケーブルで接続
RPZ-CO2-Sensor別売り
ケーブルで接続
非対応
拡張基板別 BME280対応

I2C有効化

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

インストール

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

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

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

PythonでRaspberry PiのGPIO、LED、スイッチ制御

Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。

指定時刻にRaspberry Piの電源をON/OFF (RPZ-PowerMGR)

RPZ-PowerMGRを使って、指定時刻にRaspberry Pi(ラズパイ)の電源ON/OFFする方法の解説です。決まった時間だけ起動して消費電力を抑えることが可能で、モバイルバッテリーやソーラーシステムでの運用に最適です。

Raspberry PiでRTCを使って時刻管理 (RPZ-PowerMGR)

RTC(時計)を使って、Raspberry Pi(ラズパイ)の時刻を管理する方法の解説です。RTCを使うと、インターネットに繋がっていなくても正確な時刻で運用できます。電源OFFから起動した際に自動的に時刻を設定する方法も説明します。

ESP-IR+TPH Monitor (ESP-WROOM-02搭載 WiFi/赤外線/温度/湿度/気圧 ホームIoT基板)

Arduino IDEで動作を自由にプログラミング可能なホームIoT基板です。WiFi内蔵マイコンであるESP-WROOM-02を採用しました。温度/湿度/気圧センサーと赤外線送受信機能を搭載。IoT赤外線リモコンとして、温度が上がったらエアコンをオンにする、スマホ経由でテレビの操作をする、気温の記録、といった使い方が可能です。