見出し画像

記録データを保存してみる


どうも、じぇいかわさきです。

新しく余っているラズパイを仕込み、順調に使っています。

実践で使っていくには、計測したデータを保存していかなければ意味がありません。

今回は、まず簡単に一般的な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'

DIR追加

まず最初に、このパスに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秒毎にデータが測定されて記録されていることがわかります。

データ確認

これで今回の目標であった計測データがファイルとして保存できるようになりました。

次はデータの加工にでも挑戦してみようかと思います。

少しずつでも変わっていくのは楽しいですね。

じぇいかわさきです。生産技術者として35年、今まで培った経験とスキルを元に、ものづくりに関わる世の出来事に対して思ったことをホンネで書いてます。ノウハウやアイデアもありますよ。 また写真も全力で撮っています、気に入った写真があればサポートや感想をぜひお寄せください。