Raspberry Pi 3 でK09421(BME280)のセンサ出力を定期的にcsvへ出力する
目的
K09421からセンサ出力を取得できるようになりましたので今度は定期的にデータを取得してログファイルに残すことを目指します。
方針
方針としては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])
プログラム配布
以下に作成したプログラム 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時間のデータを確認してみましたがエアコンを付けているためほとんど変化していないことがわかります。
おわりに
これで定期的にログを取得するシステムが完成しました。
次はエアコンの制御をするためのリモコン部分の設計をしたいと思います。