ラズパイと温湿度、気圧センサー(BME280)で測定結果をコンソールに表示するプログラム | そう備忘録

ラズパイと温湿度、気圧センサー(BME280)で測定結果をコンソールに表示するプログラム

BME280

Raspberry Pi 3 B+に温湿度気圧センサー(BME280)を接続して温湿度、気圧を測定してみた時の備忘録。

購入した時は以下のような状態なのではんだ付けをする必要があった。

はんだ付けの画像は超下手くそなので割愛させて欲しい。

もう少し練習をしないと人に見せられる状態にはならない。。。

BME280

コネクタ

コネクタは写真の上から、

  • Vcc:3.3~5.0V
  • GND:GND
  • SCL:I2C SCL
  • SDA:I2C SDA

にそれぞれRaspberry Piのピンに接続する。

スペック

スペックは以下の通り。

インタフェース

I2C(最大3.4MHz)

電源電圧

3.3~5V(DC)

測定範囲

  • 温度:-40〜+85°C
  • 湿度:0〜100%
  • 気圧:300〜1100hPa(標高9000m〜-500m)

最小単位

  • 温度:0.01℃
  • 湿度:0.008%
  • 気圧:0.18Pa

測定誤差

  • 気温:±1℃
  • 湿度:±3%
  • 圧力:±1Pa

BME280は以前に試したDHT11DHT22と比較して温湿度の他に気圧も測定する事ができる

測定誤差はDHT22と比較すると湿度はBME280の方が精度が良いが温度は下回っている

詳しくは上記のリンク先のスペックで比較してみて欲しい

I2Cアドレス

  • SDO LOW:0x76
  • SDO HIGH:0x77

購入したセット

BME280は単体では無く下記の0.96インチのディスプレイモジュール、Wi-Fiモジュールまで含まれたセット品を購入した。

2021/07/29 追記

Wi-Fiとディスプレイモジュールが一緒になったセット商品は品切れになっていた。

Raspberry Piなので正直Wi-Fiモジュールは不要だったのだがセットで安かったので思わず購入してしまった。

いずれディスプレイモジュールやWi-Fiモジュールは試してみたいと思うが今回は温湿度気圧センサーのみを試してみる。

回路図

BME280回路図

事前準備

I2Cを有効にする

Raspberry Piのメニューから設定、Raspberry Piの設定、インターフェイスタブでI2Cを有効にする。

インターフェイスタブでI2Cを有効にする

I2C(Inter-Integrated Circuit)はシリアル通信のひとつでマスタ(今回はRaspberry Pi)に対して複数のスレーブ(今回はBME280)を接続する事ができる。

またマスターからスレーブへクロック信号を送るSCLに対してデータ入出力用のSDAの2本の信号線でデータ通信を行う。

またセットで購入した小型ディスプレイモジュールをスレーブとして接続して温湿度、気圧の結果をディスプレイに表示を行っている(別記事)。

モジュールインストール

PythonからI2Cを制御するのに必要なモジュールを以下のコマンドでインストールする。

sudo apt-get update
sudo apt install -y python-smbus
sudo pip install smbus2

Raspberry PiからI2CをPythonで制御するモジュールはpython-smbusが多い様だがBME280ではsmbus2を使用していた。

smbus2はpython-smbusパッケージと同じ構文だがゼロから設計されており、機能拡張を目指して作成されているあった。

詳細についてはこちらを参照して欲しい。

尚、上記コマンドでsmbus2が正常にインストールされれば、

Successfully installed smbus2-0.3.0

のメッセージが表示される(バージョン番号は変わる可能性あり)

接続アドレスの確認

Raspberry PiのLXTerminalから以下のコマンドで接続アドレスを確認する。

sudo i2cdetect -y 1

表示結果より0x76である事が分かる。

接続アドレスの確認

サンプルプログラム

プログラムの入手

githubに公開しているSWITCH SCIENCEのサンプルプログラム(bme280_sample.py)をRaspberry Piにコピーして実行する。

プログラムソースはここでは掲載しないので上記のリンク先を見て欲しい。

確認と修正

適当なディレクトリにコピーしたbme280_sample.pyをThonny Python IDEで開いて実行するのだが実行前に何点か確認&修正事項がある。

プログラム7行目の i2c_address = 0x76 が前述の接続アドレスと一致している事を確認する。

続いてこのサンプルプログラムはPython2.7ベースなのでPython3では95行目、103行目、117行目のprint文の構文がPython3ではシンタックスエラーになってしまうので修正する。

修正前:print "pressure : %7.2f hPa" % (pressure/100)
修正後:print ("pressure : {:7.2f} hPa".format(pressure/100))

補足説明

以下、サンプルプログラムのざっくりとした補足説明。

調整パラメーター

21~59行目のget_calib_param関数では調整パラメーターを取得している。

調整パラメーターは製造中にデバイスの不揮発性メモリーに書き込まれている値で温湿度、気圧の取得値を補正するためのパラメーター値が格納されている。

データの取得

61~71行目のreadData関数にてF7h~FEhのアドレスから温度、圧力、湿度のデータをまとめて取得している。

温湿度、気圧の計算

73~95行目のcompensate_P関数で気圧、97~103行目のcompensate_T関数で温度、105~117行目のcompensate_Hで湿度をget_calib_param関数で取得した補正値とreadData関数で取得した値から計算している。

初期処理

120~135行目のsetup関数は初期処理。

メイン処理

142~144行目がメインの処理。

readData関数を呼び出している。

実行結果

F5で実行するとtemp(温度)、pressure(気圧)、hum(湿度)が出力される。

サンプルプログラム実行結果

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

4件のフィードバック

  1. 堀内信哉 より:

    このサイトを参考にBME 280を動かそうとしていますが、動きません。エラー等して、モジュールsmbus2が not found になってしまいます。
    Linuxターミナルで、インストールしたはずなのに。返答いただければ幸いです

    • souichirou より:

      堀内信哉さん
      コメントありがとうございます。
      sudo pip install smbus2
      のインストール終了時のメッセージは何が表示されましたか?
      正常にインストールされれば、
      Successfully installed smbus2-0.3.0
      等と表示されるはずです(インストールバージョン番号は変わる可能性あり)

      またpip show smbus2でインストールしたモジュールを確認できます。
      こちらの表示結果はどうですか?

  2. 匿名 より:

    AMAZONで温湿度気圧センサー私も買いました。使い方参考になりました。

堀内信哉 へ返信する コメントをキャンセル

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。