フォト
サイト内検索
ココログ最強検索 by 暴想
2025年10月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

最近のトラックバック

にほんブログ村

  • にほんブログ村

« 「軍事のリアル」冨澤 暉著(新潮新書)を読んで | トップページ | GrovePi+で時刻毎に温湿度センサーデーターを得る方法 »

2018年7月29日 (日)

GrovePi+の温湿度センサー(DHT22)からのデータをCSVファイルへ出力

 簡単そうに見える題名ですが、つまづいてしまったので備忘録です。
 つまずいた点は、出力様式、上書きモード・追記モードについてです。
 前提として、ここでもRaspberryPi2上にGrovePi+を GrovePi+のD4ポートににGrove Temperature & Humidity Sensor Pro(白色温湿度センサー)をつないでデーターを得ています。また、python3.5で動かしています。
 まず、出力様式についてですが、print()関数と異なっていることに戸惑いました。そして、writer.writerow()内のデータを角括弧(ブラケット)で囲わなくてはならないことです。なぜ、こうしなくてはいけないのかWebページでもあまり解説は見られない様です。つぎに、文字列データでなくては受け付けてくれないことです。今回、お示しするソースコードでは、日時データについては秒単位で端数なしとしたかったので、一旦、t変数に代入したり、センサーから得られた数値データや水蒸気量の計算データをstr()関数で文字列に直したりしなくてはなりませんでした。
 つぎに、上書きモードと追記モードの違いです。他のWebページではよく、まとまったデータをcsvファイルに出力する事例が載っています。この時は、with open('temp00.csv','w',encoding='utf-8')as f:の様に'w'と上書きモードで示してあります。しかし、センサーデータは刻々と出てきますので、出てきたデータを行単位で追記する必要があります。そこで、with open('temp00.csv','a',encoding='utf-8')as f:の様に'a'と追記モードにする必要があります。あと文字コードはencoding='utf-8'とユニコードとしていますが、Excelでの取り込みの場合'shift_jis'の方が文字化けしないとのWebページでの情報もありましたが、LiberOffice Calcの場合'shift_jis'にすると文字化けするので'utf-8'としています。
 これらのことで、pythonで実行する度にtemp00.csvファイルを作成または上書きし、一番上の行に標題をつけて、それ以降データーを追記するソースコードが書けました。プログラムを停止する場合はCtrl+cで止めます。あと、お決まりですがgrove_dht.pyとgrovepi.pyを本プログラムと同じディレクトリに入れる必要があります。
 それでは、ソースコードです。
import grovepi# GrovePiを使うときに必要。
import csv# csvファイルを作るときに必要。
import datetime# 現在日時を示すのに必要。
import time# sleep()を使うため必要。
from time import sleep# ループを遅くするのにsleep()を設定。
#Grove Temperature & Humidity Sensor Pro(白色センサー)をGrovePiのD4ポートにつなぐ。
#このファイルで白色センサーを使うため以下を設定。
#ケーブル線は黄線SIG,白線NC,赤線VCC,黒線GND。
sensor = 4  # デジタルポート4に設定(後でgrovepiで変数を渡す)。
#温湿度センサーの型(タイプ)。
#センサーの色。
blue = 0    # 青(Blue)色センサー。
white = 1   # 白(White)色センサー。
def main():
    #CSVファイル最上部標題行入力。
    with open('temp00.csv','w',encoding='utf-8')as f:# ファイルオープン。ファイル名は'temp00.csv'。'w'は上書きモード。encodingはExcelの場合'shift_jis'の方がよいとの情報もあり。
        writer=csv.writer(f, lineterminator='\n')# 末尾は改行としているが、デフォルトも改行のようである。
        writer.writerow(['日時','気温(℃)','湿度(%)','水蒸気量(g/m3)'])
    while True:
        #センサーよりデータ入手。
        temp,humi = grovepi.dht(sensor,white)# grovepi内のdht関数にポート番号と型番号を渡し気温、湿度を受け取る。
        zyouki=(0.794*(humi/100*6.1078*pow(10,(7.5*temp)/(temp+237.3))))/(1+0.00366*temp) # 気温及び相対湿度より空気1立米当たり水蒸気量に変換。
        print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")+" temp = %.1f C humi = %.1f %% zyouki = %.2f g/m^3" % (temp,humi,zyouki))# 記録日時(端数あり)、温湿度小数点1の位、水蒸気量小数点2の位で表示。
        t=datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")#記録日時をtへ代入(端数なし)。
        #データをCSV化。
        with open('temp00.csv','a',encoding='utf-8')as f:# ファイルオープン。'a'は追記モード。
            writer=csv.writer(f, lineterminator='\n')# 末尾は改行としているが、デフォルトも改行のようである。
            writer.writerow([t,str(temp),str(humi),str(zyouki)])# データ書き込み。文字列でないとうまくゆかないため変換。
        sleep(0.989965)# 約1秒で表示されるよう調整。Ctrl+c でプログラム停止。
#        print(datetime.datetime.now())# 日時確認用。
if __name__ == '__main__':
    main()

« 「軍事のリアル」冨澤 暉著(新潮新書)を読んで | トップページ | GrovePi+で時刻毎に温湿度センサーデーターを得る方法 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« 「軍事のリアル」冨澤 暉著(新潮新書)を読んで | トップページ | GrovePi+で時刻毎に温湿度センサーデーターを得る方法 »