Raspberry PiとBME280モジュールで自動で温度・湿度・気圧を測定してグラフ化する

Raspberry PiとBME280モジュールで温度・湿度を計測

 「電波ガーデニング」と称して、家庭菜園の自動栽培管理システムを開発しています。

 その中で、栽培記録として自動で温度・湿度のデータ記録することを考えます。以前似た様な例を本で読んだ記憶があるなと思って、家の本をパラパラ漁っていたら……ありました!

 ラズパイ超入門

 しかもこの本を献本してくださったmana_cat (id:mana-cat) さんが、そのものずばりの記事を執筆していらっしゃって、めちゃめちゃ参考にさせていただきました。全くの初心者の方には、この本買うのがオススメです。本のレビューは下記参照下さい。

 というわけで、基本的にラズパイ超入門を読めばできるのですが、今回私が使用したモジュールがラズパイ超入門とは別のモジュールだったのと(本を買う前にモジュール買って放置してた)、本でやってないことも少し試してみたので、ラズパイ超入門を補完するような形で記事を書いてみようとおもいます。

ハードウェアセットアップ

部品リスト(必要なもの)

 秋月電子のBME280モジュール AK-BME280

 ラズパイ超入門は、スイッチサイエンスさんのモジュールを前提に書いてあるので、ラズパイ超入門を参考にする人は、スイッチサイエンスさんのを買ったほうがよいです。

 なお、このモジュール。モジュール自身の発熱があり温度はあまり当てにならないという情報もあります。

第28回 温湿度・気圧センサ(BME280) 〜仕様概要〜 | ツール・ラボ

 ただ、私の環境で簡易的に温度計と比較した限りでは1℃以下程度の差には収まっているようなので、多くの用途には十分使えるレベルだと思います。大きく温度が外れる場合は、マイコンから熱を受けていないかなど、測定環境を見直してみてください。

 Raspberry Pi 3

 Raspberry Pi 3のセットアップ方法や、Raspberry Pi 3の周辺部品等は、以下参照下さい。Raspberry Pi2でも動くとは思いますが、確認はしていません。あしからず。

 ジャンパワイヤ(メス〜メス)

 ジャンパワイヤでモジュールとRaspberry Piを接続します。直接接続できるのでブレッドボードは不要です。

工具等

 はんだ付けするのに必要なもの一式、例えば以下です。ピンヘッダが実装済みのモジュールを買えば不要です。

  • はんだ
  • はんだごて
  • こて台

回路接続

 Raspberry PiとBME280モジュールを接続します。

 まずはBME280モジュールにピンヘッダを以下のようにはんだ付けします。

 付属の説明書にはI2C通信をするときはJ3を半田付けしろと書いてありますが、ジャンパワイヤで繋げばよいことがわかったので私はしませんでした(後述)


 分かりにくいけど右上にあるのがj3


 接続図。詳細は以下

配線の色 BME280 Raspberry Pi Pin
1pin(VDD) 1pin(3.3V)
2pin(GND) 6pin(GND)
3pin(CSB) 17pin(3.3V)
4pin(SDA) 3pin(SDA)
5pin(I2C_ADD) 14pin(GND)
6pin(SCL) 5pin(SCL)

 BME280モジュールのピン配置は部品面を上にして、左端が1pinで右端が6pin。

 Raspberry Piのピン配置は以下参照下さい。

 秋月電子のBME280モジュールは、SPIモード、I2Cモードという複数の通信モードで動かすことができます。今回I2Cモードを使いたいので、その場合は3pinを電源(3.3V)に繋ぐことでI2Cモードに設定できます。テスタであたると分かるのですが、BME280モジュールのJ3の半田付けは、1pinと3pinをショートするだけなので、半田付けしなくても3pinを電源(3.3V)に接続すればI2Cモードで動きます。

 後、5pinを電源(3.3V)に繋ぐかGNDに繋ぐかでI2Cのアドレスを変更することができます。今回はデフォルトの0x76にしたいのでGNDに接続しましょう。ネットのサンプルスクリプトも大抵0x76の設定になっているのでこちらの方がよいと思います。電源(3.3V)に繋ぐと0x77になります。

ハードウェアテスト

 接続完了したら、Raspberry Piを起動してまずは接続チェックをしてみます。

Raspberry Piセットアップ

 下記記事を参照に基礎的なセットアップ($ sudo apt-get upgradeするところ)まで完了させて下さい。

 その後、Raspi-configセットアップで、Interfaceのタブを開きI2CEnableに設定して下さい。BME280モジュールとI2Cという通信方式で通信するので、設定が必要となります。

 I2Cは、組み込み機器の内部通信によく使われる双方向通信です。Maxで400kbpsと速度が遅く(USB2.0の480Mbpsの1/1000以下)、配線もそれほど長く引き延ばせないですが、CLKとDATAの2本で通信できる上、複数の機器をハブを用いずバスで繋げられるのが利点です。具体的にはNintendo WiiのWiiリモコンのリモコンとヌンチャクの通信に使われていたりします。

I2C通信関係のツールをインストール

 以下コマンドでインストール

$ sudo apt-get update
$ sudo apt-get install i2c-tools
$ sudo apt-get install python-smbus 

 i2c-toolsというのが、I2Cの接続テストや簡単なコマンドを送受信するようなプログラム(i2cdetectとかi2csetとか)。python-smbusというのが、pythonでI2Cを制御するためのライブラリです。

I2C接続確認

 以下のコマンドでI2Cの接続確認ができます。

$ 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 --                         

 BME280のデフォルトのI2Cアドレス0x76が表示されているので、モジュールとの通信は問題無さそうです。これでハードウェアのチェックは完了。もし表示されなかったら、接続や設定を見直してみて下さい。

pythonのサンプルプログラムで温度・湿度を取得

 pythonでBME280モジュールを制御するプログラムをスイッチ・サイエンスさんが公開しています。ありがたやありがたや。以下のコマンドで、プログラムのダウンロード及び実行ができます。

$ git clone https://github.com/SWITCHSCIENCE/BME280.git
$ cd BME280/Python27/
$ python bme280_sample.py 

追記:スイッチサイエンスさんが、ソフト変更した関係でsmbus2というモジュールが必要になるため、smbus2を追加でインストールする必要があります(入れないとImportError: No module named smbus2というエラーがでます)。インストールは、以下サイトの情報でうまくいった人がいるとのことです(私は未確認)

秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・気圧を取得する(1/2): ままれのblog

 smbus2を入れないで済む方法としては、bme280_sample.pyの3行目を以下のように変更して下さい(2を削る)

- from smbus2 import SMBus
+ from smbus import SMBus

 もしくは、以下の方法で古いバージョンのソフトをダウンロードしてもよいです。そもそも、ここを飛ばしてもらってもOKです(私のコードはsmbus2を使用していないので)。

$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/a43306ece7e17f3009748599e1ca4d0160729559/Python27/bme280_sample.py
$ python bme280_sample.py

 ソフトの実行結果は以下のようになります。

temp : 22.60  ℃
pressure : 1018.42 hPa
hum :  52.03

 隣の部屋の温度・湿度計をみたら、おおよそ正しそうな値はとれているのでよしとします。

 ただ、このままではデータを後で処理するのに不便なので、フォーマットを修正してcsvに書き出すようにしたいと思います。ラズパイ超入門で、素晴らしいスクリプトが公開されているのですが、2次配布が禁止されているのと、一部自分にとって不都合なところがあったので、ラズパイ超入門のスクリプトのコードは使わず、スイッチサイエンスさんのスクリプトをベースに自作してGitHubで公開しました。自作といっても10行くらい書き足しただけですが。

 コードは以下です。

 以下でクローンして

$ cd
$ git clone https://github.com/karaage0703/denpa-gardening

 以下コマンドで、実行するたびにsensor_data.csvというcsvファイルに時刻、温度、湿度、気圧のデータを書き出すことができます。

$ python ~/denpa-gardening/get_sensor_data.py >> ~/denpa-gardening/sensor_data/sensor_data.csv

 更にcrontab -e実行して、末尾に以下追記すると10分ごとにcsvファイルにデータを自動で追記していくようになります。

*/10 * * * * python ./denpa-gardening/get_sensor_data.py >> ./denpa-gardening/sensor_data/sensor_data.csv

 csvファイルは、カンマ「 , 」でデータを区切ったテキストファイルです。30分ほど放置してから、less ~/denpa-gardening/sensor_data/sensor_data.csvとしてcsvファイルの中身をみると、以下のようなフォーマットで保存されているのがわかると思います。

2016/05/04 02:05:01,23.8282860432,62.6385448482,1004.32138867
2016/05/04 02:10:01,23.8790561736,63.5192466469,1004.17580477
2016/05/04 02:15:01,23.8029009889,62.3908275891,1004.02998834
2016/05/04 02:20:01,23.7572079096,62.9216136008,1003.7912422
2016/05/04 02:25:02,23.777515942,62.533809879,1003.62656201

温度・湿度をグラフ化

 このままだとわかりづらいので、データをまとめてグラフ化してみます。PC上でエクセル的なもので処理するのも面倒くさいのでRaspberry Piでグラフを生成してもらうことにします。グラフ化するソフトとして以下のコマンドでgnuplotをインストールします。gnuplot使うの大学生以来です。

$ sudo apt-get update
$ sudo apt-get install gnuplot

 グラフをスクリプトtで生成するのどうやるのかなと思ったら、まさに同じようなことをやっている人がいたので、そのスクリプトをベースに以下のようなスクリプトを作成しました。

 以下コマンド実行すると、~/denpa-gardening/sensor_data/以下にグラフのデータsensor_data_temp.png, sensor_data_humid.png, sensor_data_pressure.png,sensor_data_temp_humid.pngが生成されます。

$ ~/denpa-gardening/make-graph.sh ~/denpa-gardening/sensor_data/sensor_data.csv

 以下は温度、湿度をグラフ化したsensor_data_temp_humid.pngの例です。


 温度・湿度

 ふむふむ

 csvファイルが大きくなりすぎるのもいやなので、1日毎にファイルを別名で保存するdata_dump.shを同リポジトリに作成しておきました。これをcronで1日毎に実行すればディスク容量の限り保存を続けられそうです。これでとりあえず完了。

追記:gnuplotを使わずpython/pandas/matplotlibを使ってグラフを描く方法に関して追記しました。今時gnuplotは…という人はこちらを参照下さい。

まとめ

 Raspberry PiとBME280モジュールを使用して、自動で温度・湿度・気圧を測定してグラフ化までできるようになりました。多くの先人の知恵に助けられ、自分では20行くらいしかプログラム書いてないのですが、20行書くためにコード読んだり、調べたことが色々ためになりました。基本的な知識にまだまだ抜けがあることを改めて実感しました。やっぱりプログラムは自分で組まないとダメですね。

この記事を参考にしている人のブログ

 この記事を参考にしてくださっている方が結構いるようなので、私が見つけたサイトをいくつか紹介します。

BME280について - デジタル百葉箱製作覚え書き

気温湿度気圧データをまとめてグラフ化 - デジタル百葉箱製作覚え書き

参考リンク

Raspberry Pi 2で温湿度・気圧センサのBME280をPythonから使う - Qiita

GitHub - SWITCHSCIENCE/BME280

PiTs laboratory: RaspberryPiでラズベリー栽培 自動でグラフを作成(gnuplot)

http://hack-le.com/archives/45576248.html

関連記事

変更履歴

  • 2019/10/21 BME280モジュールの温度に関しての注記を追記
  • 2019/02/24 全体的に微修正
  • 2017/08/21 スイッチサイエンスさんのサンプルコードに関して追記
  • 2017/05/27 python/pandas/matplotlibでのグラフ描画に関して追記