記録データを保存してみる
どうも、じぇいかわさきです。
新しく余っているラズパイを仕込み、順調に使っています。
実践で使っていくには、計測したデータを保存していかなければ意味がありません。
今回は、まず簡単に一般的なCSV形式のファイルとして保存していくことに挑戦してみます。今まで学習してきたことを使えば、できなくも無いですよね。
まずはプログラムの場所を整理してみる
今まで、DHT11を使用してデータ観測をするコードは、DHT11のクローンをインストールしたDHT11_PythonというDIR内に置いてありました。
これはDHT11のライブラリがこのDIR内にあるからです。
しかし、いつまでもこのDIRを使用しているわけに行かないので、Python用のコードを格納するDIRをPython_progという名前で作成しました。
その中に、DHT11のライブラリが入っているDHT11というDIRをDHT11_PythonからPython_progにコピーします。
同時に温湿度測定用のコードtemp.pyもこちらに移動させます。
まずはこの状態で、コードが動くことを確認します。
今回はターミナルではなく、VNCを使って変更をかけていきます。
記録するためにデータ構造にコードを修正
次に、今までは3行に渡ってデータを表示しておりましたが、それではCSVファイルに保存するに適していないので、データのフォーマットも変更します。
今までのコードの一部を#でコメントアウトします。そしてコード自体を修正していきます。
今まで、プログラムでタイムスタンプを引き取りstrで文字化して表示しておりました。しかし、その際に秒の部分が小数点でかなりの桁まで表示しており、一般的では有りませんでした。
今回、事前にnowという変数にタイムスタンプを入れるようにし、その際に秒の小数点以下を丸めるために、[0:19]と追記し秒の桁を2桁で表示するように変えました。
now = str(datetime.datetime.now())[0:19]
次に、記録する為の書式をdataという変数に代入するようにします。
data = [now, result.temperature, result.humidity]
タイムスタンプ、温度、湿度をカンマ区切りで1行のデータとして保存するようにします。
その部分のコードはこんな感じですね。
while True:
result = instance.read()
now = str(datetime.datetime.now())[0:19]
# if result.is_valid():
# print("Last valid input: " + str(datetime.datetime.now()))
# print("Temperature: %-3.1f C" % result.temperature)
# print("Humidity: %-3.1f %%" % result.humidity)
data = [now, result.temperature, result.humidity]
if result.temperature == result.humidity == 0:
continue
データが1行でカンマ区切りで表示されるようになりました。
データ保存部分を追記する
それでは、1行のカンマ区切りのデータになりましたので、この1行を1ラインとして保存するファイルを作れるようにします。
まずデータの格納場所ですが、Python_progの配下にtempというDIRを作成します。計測したデータはこのDIRにCSV形式で格納するようにします。
まず、ファイルを取り扱えるようにライブラリのosを読み込みます。
import os
次に、保管するファイルのパスと名前を記述します。
fileName = '/home/pi/Python_prog/temp/temp_hmdt.csv'
まず最初に、このパスにtemp_hmdt.csvというファイルが存在しなかった場合、つまり一番最初にファイルを作るために、ファイルを書き込みモードで開きます。
そして、1行目にどんなデータが書かれているかの表記を行います。
コードはこんな感じですね。
#file control
if not os.path.exists(fileName):
thData = open(fileName, 'w')
thData.write('date_time,temp,hdmt\n')
thData.close()
次はいよいよ、実際のデータを読み取った後に、先に作成したファイルにデータを追加する形で記述します。
具体的な違いは
thData = open(fileName, 'w') → thData = open(fileName, 'a')
書き込みモードが追加モードに変わることですね。
データを読み出し、ファイルに記録するまでは以下のようなコードになります。
while True:
result = instance.read()
now = str(datetime.datetime.now())[0:19]
# if result.is_valid():
# print("Last valid input: " + now)
# print("Temperature: %-3.1f C" % result.temperature)
# print("Humidity: %-3.1f %%" % result.humidity)
data = [now, result.temperature, result.humidity]
if result.temperature == result.humidity == 0:
continue
thData = open(fileName, 'a')
thData.write("," .join(map(str,data)) + '\n')
print("," .join(map(str,data)))
thData.close()
実際にコードを実行してみますと、空であったtempというDIR内にtemp_hmdt.csvというファイルが出来上がっているのが確認できますね。
これで自動的にファイルが作成され、計測データが追記されていきます。
実際にtemp_hmdt.csvを開いて中身を確認すると、ちゃんと10秒毎にデータが測定されて記録されていることがわかります。
これで今回の目標であった計測データがファイルとして保存できるようになりました。
次はデータの加工にでも挑戦してみようかと思います。
少しずつでも変わっていくのは楽しいですね。