スマートホーム構築記

IoTの恩恵を受けたいけど家庭用はなかなか出てこない。なら作ろうというブログ

Raspberry Pi 3 でK09421(BME280)のセンサ出力を定期的にcsvへ出力する

目的

 K09421からセンサ出力を取得できるようになりましたので今度は定期的にデータを取得してログファイルに残すことを目指します。

方針

f:id:kagemomiji:20160815221304p:plain
方針としてはcronでBME280から出力を読みとるプログラムを定期的に呼び出して"yyyyMMdd_bme280.csv"という形式で一日ごとにファイルを分割してcsvファイルに書き込むという流れです。
センサの値を読みとってcsvに出力するプログラムは前回に作ったものを改造して実装します。

hh:mm:ss,温度(℃),圧力(hPa),湿度(%)

保存するcsvのフォーマットはこのようにします。時間(hh):分(mm):秒(dd)としています。これは今後処理するときに容易に他のプログラムでも取り込めるようにiso拡張フォーマットとしています。
この方針に従って設定やコーディングを進めていきます。

コーディング

まず前回作成したセンサ値取得プログラムを先ほど決めた方針に従って書き換えていきます。
追加する機能は以下の2つです。

  • 現在の時刻と日付を取得する
  • 取得した時刻と日付からファイル名を生成し、時刻とセンサ値をcsvに書き込む

モジュールのインポート

ここで新しい機能を実現するために datetimeモジュールとcsvモジュールを追加します。

 import smbus
 #import time      #不使用
 import datetime  #追加  
 import csv    #追加

変数設定部

変数を設定する部分にデータを保存するディレクトリを設定します。

 i2c_address = 0x76
 DATA_DIR = '/home/pi/data/' #追加
 bus = smbus.SMBus(bus_number)

関数

次に変更を加える関数の一覧です。

  • readData
  • compensate_T
  • compensate_P
  • compensate_H

readDataではcsvへの書き出しを行うように変更します。
compensate_*ではreadDataにデータを受け渡すように変更を行います。

compensate_T

まず、compensate_Tでは以下のようにプログラムの最後に一文を追加します。

 print "temp : %-6.2f ℃ %" %(temperature)
 return temperature #追加
compensate_P
 print "pressure : %7.2 f hPa" %(pressure/100)
 return pressure/100.0 #追加
compensate_H
 print "hum : %6.2f %" %(var h)
 return var_h #追加
readData
 #get record time and date
 record_datetime = datetime.datetime.now() #現在の日時と時刻を取得
 record_file_name = record_datetime.strftime('%Y%m%d')+'_bme280.csv' #ファイル名を生成
 record_time = record_datetime.strftime('%X') #時刻文字列を生成

 data=[]

このように現在時刻を取得してファイル名と時刻の文字列を生成します。

 T=compensate_T(temp_raw)
 P=compensate_P(pres_raw)
 H=compensate_H(hum_raw)

先ほど返り値が出力されるように変更したのでその出力を変数に格納します。

 writer = csv.writer(open(DATA_DIR+record_file_name, 'ab'))
 writer.writerow([record_time,T,P,H])

csvをappendモードで開き、[record_time,T,P,H]の順番に配列を格納してcsvに書き込みます。

プログラム配布

以下に作成したプログラム bme280_csv.pyを公開しています。使用される方はご自由にご利用ください。
GitHub - kagemomiji/raspi3

cronの設定

次に作成したプログラムを定期的に実行するcronの設定をします。

 crontab -e

crontabを用いて設定します。

 */5 * * * * python {ファイルへの絶対パス}

上記のように5分おきに実行されるように設定しました。
10分おきでは */10 * * * * コマンド
1時間おきでは (実行したい分) * * * * コマンド
というように設定します。
設定を終わり編集を完了したらcronに設定が反映されその後実行されるようになります。

出力例

22:30:01,29.46672882,1001.354688,56.09067817
22:35:01,29.39716974,1001.405821,54.73285085
22:40:01,29.43100929,1001.44832,54.44254727
22:45:01,29.4075096,1001.442746,54.00647973
22:50:02,29.36019691,1001.457592,53.52315578
22:55:01,29.33419061,1001.406453,52.97012485
23:00:01,29.30661768,1001.435586,52.58357062
23:05:01,29.25241182,1001.510298,52.34396932
23:10:01,29.23110548,1001.519919,52.43595777
23:15:01,29.58548072,1001.406111,53.4440672
23:20:02,29.4075096,1001.373139,53.34538086
23:25:01,29.31006429,1001.384926,53.00620219
23:30:01,29.56448763,1001.39142,54.19737383
23:35:01,29.5441212,1001.356211,53.91712263
23:40:01,29.38996317,1001.359144,53.30443224
23:45:01,29.59174732,1001.302045,53.63377335
23:50:02,29.55947436,1001.348349,54.10231546
23:55:01,29.40030303,1001.362922,53.60009775

1時間のデータを確認してみましたがエアコンを付けているためほとんど変化していないことがわかります。

おわりに

これで定期的にログを取得するシステムが完成しました。
次はエアコンの制御をするためのリモコン部分の設計をしたいと思います。