フォト
サイト内検索
ココログ最強検索 by 暴想
2026年6月
  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        
無料ブログはココログ

最近のトラックバック

にほんブログ村

  • にほんブログ村

« GrovePi+の温湿度センサー(DHT22)からのデータをCSVファイルへ出力 | トップページ | ザ・スクープスペシャル「真珠湾攻撃77年目の真実~日米ソの壮絶“スパイ戦争”~」を見て »

2018年8月 4日 (土)

GrovePi+で時刻毎に温湿度センサーデーターを得る方法

 今回は、GrovePi+につないだ温湿度センサー(DHT22)からPython3を使って一定時刻毎にデータを得る方法を備忘録として載せたいと思います。
 今まで、データ取得時間はプログラムが走る時間をデータが欲しい時間から引いて出していました。
 例えば、1分毎にデータが欲しい場合、 
 スリープの時間=60秒-概ねプログラムが動く時間
と、していましたが、時刻毎にデータ取得ができるようになればそんなまどろっこしいことはしないで済むのでは、また、長時間プログラムを動かした場合どうしても誤差が生じてしまうので時間がズレてきてしまいます。そこでWebページを探したところ何件か方法が見つかりましたが、そのものずばりの方法はありませんでした。その中で、解りやすそうな「アルゴリズム雑記」の「【Python】現在時刻が特定のタイミングが判定しログを取る」を参考としました。
 その方法は、1分毎にデータを取り出すもので、まず、現在の時刻の秒数を抜き出した後、それが0秒になっていればif文が実行されデータ取得とCSVファイルへの書き出しやprint()でターミナルに表示させたりします。その後、1秒を加算しさらにif文が終わったあとに0.1秒を加算します。現在時刻がプログラムの実効時間と合わせ1.1秒以上となるため、ループしてまたif文に来たときif文は実行されなくなります。その後は0.1秒毎に加算して、また、約一分後に現在時刻の0秒が来るのを待つと言うやり方です。若干の誤差は含むものの段々と時刻がズレてゆくことはなくなりました。文字で書くと何やら難しいのでそこはソースコードを見てみてください。
 前提を書くのが遅くなりましたがと、ここでもRaspberryPi2上にGrovePi+を GrovePi+のD4ポートににGrove Temperature & Humidity Sensor Pro(白色温湿度センサー)をつないでデーターを得ています。また、python3.5で動かしています。
 さて、実際にプログラミングをすると、ここでもしっかりつまずいてしまいました。それは、if文の前にデータ取得をしてしまったことです。これでは、データ取得が0.1秒周期程度で行われ、DHT22のサンプリング周期2秒以上を下回ってしまいます。結果、GrovePi+をフリーズさせてしまい、元に戻すにはRaspberryPi2をShutdown(rebootでは済みませんでした)しなくてはならないと言う比較的深刻な事態になってしまいました。
 そんなこんなで、ソースコードです。プログラムを停止する場合は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'は上書きモード。
        writer=csv.writer(f, lineterminator='\n')# 末尾は改行としている。
        writer.writerow(['日時','気温(℃)','湿度(%)','水蒸気量(g/m3)'])
    while True:#永久ループ。プログラムを終了するためには「Ctrl+c」。
        dt = datetime.datetime.now()#現在日時をdtに代入
        if str(dt.second) == "0":#dtより秒数を抜き出して0秒になっていれば以下を実効。
            #センサーよりデータ入手。
            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(str(dt)+" temp = %.1f C humi = %.1f %% zyouki = %.2f g/m^3" % (temp,humi,zyouki))# 記録日時(端数あり)、温湿度小数点1の位、水蒸気量小数点2の位で表示。
            t=dt.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(1)#1秒待つことで秒数が0ではなくなるため次の分の0秒までif文が実行されなくなる。
        sleep(0.1)#次の分の0秒まではこちらで0.1秒毎進んでif文が実行されるまで待つ。
if __name__ == '__main__':
    main()

« GrovePi+の温湿度センサー(DHT22)からのデータをCSVファイルへ出力 | トップページ | ザ・スクープスペシャル「真珠湾攻撃77年目の真実~日米ソの壮絶“スパイ戦争”~」を見て »

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

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: GrovePi+で時刻毎に温湿度センサーデーターを得る方法:

« GrovePi+の温湿度センサー(DHT22)からのデータをCSVファイルへ出力 | トップページ | ザ・スクープスペシャル「真珠湾攻撃77年目の真実~日米ソの壮絶“スパイ戦争”~」を見て »