読者です 読者をやめる 読者になる 読者になる

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

f:id:karaage:20160502163012j:plain:w640

はじめに

 この記事は、下記「電波ガーデニング」の一つの機能を実現するためのものですが、単独でも成立する記事にしていますので、「電波ガーデニング」をしたい人、タイトル通りのことだけやりたい人、両方の方が対象の記事となります。

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

 栽培記録として自動で温度・湿度のデータ記録することを考えます。何か同じようなことやった例を本で読んだ記憶があるなと思って、家の本をパラパラ漁っていたら……ありました!

ラズパイ超入門(日経BPパソコンベストムック)

ラズパイ超入門(日経BPパソコンベストムック)

 ラズパイ超入門

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

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

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

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

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

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

 Raspberry Pi 3

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

ジャンパワイヤ(メス?メス) 10本セット

ジャンパワイヤ(メス?メス) 10本セット

 ジャンパワイヤ

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

工具等

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

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

回路接続

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

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

f:id:karaage:20160228160357j:plain:w640

f:id:karaage:20160228160804j:plain:w640

f:id:karaage:20160228160813j:plain:w640

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

f:id:karaage:20160502152428j:plain:w640
 分かりにくいけど右上にあるのがj3

f:id:karaage:20160502163012j:plain:w640
 接続図。詳細は以下

配線の色 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という通信方式で通信するので、設定が必要となります。 f:id:karaage:20160504223405p:plain:w640

 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 

 実行結果は以下。

temp : 22.60  ℃
pressure : 1018.42 hPa
hum :  52.03 %

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

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

 コードは以下です。

 以下でクローンして

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

 以下コマンドで、実行するたびに、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

 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の例です。

f:id:karaage:20160504162345p:plain:w640
 温度・湿度

 ふむふむ

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

まとめ

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

Raspberry Piまとめページ作成

 私が今まで書いたRaspberry Piに関する記事、以下にまとめています。ちょっとした設定から、自作デジカメやロボット製作といった電子工作まで色々な情報をのせているので、興味ある方はセットアップの後参考にしてみて下さい。

関連記事

参考リンク

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

GitHub - SWITCHSCIENCE/BME280

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

gnuplotで日付・時刻の書かれた時系列データを二軸でグラフ描画し保存するシェルスクリプト – 或る阿呆の記

関連記事