【Arduino/Python#9】室内の温湿度計測&csvファイルに保存
前回は以下の記事で,室内の温湿度をDHT11というセンサを用いて計測し,ArduinoとPC間のシリアル通信を用いてデータを飛ばし,Pythonでデータを表示させるということを達成した。
opuktr.hatenablog.com
データを取得したならば,保存して置けば解析や予測等ができるようになるので,今回はPythonに飛ばしてきたデータをリアルタイムでcsvに保存することに試みる。
保存の仕様としては,以下を考える。
- 1時間毎にファイル名を変更して,csvファイルに保存
- 測定データは5秒の温度・湿度・不快指数を保存
[目次]
1. 必要素子(前回【Arduino/Python#8】と同様)
- ブレッドボード
- 抵抗(10kΩ)
- 温湿度センサ(DHT11)
- ジャンパー線 4本
ここで,今回購入したStater KitにはDHT11が基板にはんだ付けされていた。
以下にDHT11単体で使用する場合と基板に接続されている場合の比較を示す。
これを参考に自身の持つDHT11に応じて配線を変更してほしい。
<DHT11端子の説明>
- VDD :電源接続(図(b)Bに接続)
- DATA :データの読み取り(図(b)Aに接続)
- NC :何も接続しない or 電源/グランドに直接接続(図(b)Bに接続)
- GND :グランド(図(b)Cに接続)
3. スケッチ/Pythonコード
●スケッチ(Arduino側)
#include "DHT.h" //ライブラリ読み込み const int DHTPIN=7; //7番pinをDHTpinに設定 #define DHTTYPE DHT11 // DHTの種類をDHT 11に設定 DHT dht(DHTPIN, DHTTYPE);//DHT11に関する情報を入力 void setup() { Serial.begin(9600); //9600bpsでシリアルポートを開く dht.begin(); //DHT11による計測開始 } void loop() { delay(5000); //5秒ごとに計測 float h = dht.readHumidity(); // 湿度を測定 float t = dht.readTemperature(); // 温度を摂氏で測定 // 読み込み失敗かどうか判断 if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.println(t); //改行しながら温度を出力 Serial.println(h); //改行しながら湿度を出力 }
●Python側
# -*- coding: utf-8 -*- import csv import serial import datetime i = 0 #カウント用 ser = serial.Serial("COM3") # Arduinoが接続されているCOMポートを指定 while (i !=24): #24時間分計測&保存(1時間×24回) #ファイル名の設定 now = datetime.datetime.today() #現在時刻取得 hourstr = "_" + now.strftime("%H") #時刻を文字列化 filename = "temphumid_" + now.strftime("%Y%m%d") + hourstr + ".csv" hourstr_ser = hourstr #hourstr_serの初期化 #csvファイルに書き込み with open(filename,'a',newline='') as f: #csvファイルの生成 writer = csv.writer(f) writer.writerow(["year","month","day","hour","minute","second","temp[℃]","humid[%]","heat index"]) #1行目:見出し while(hourstr == hourstr_ser): #1時間データを書き込む #情報の取得 temp = float(ser.readline().rstrip().decode(encoding='utf-8')) #温度 humid = float(ser.readline().rstrip().decode(encoding='utf-8')) #湿度 hi = 0.8*temp +0.01*humid*(0.99*temp-14.3)+46.3; #不快指数 now_ser = datetime.datetime.today() #現在時刻 #[年,月,日,時,分,秒,温度,湿度,不快指数] data = [now_ser.year,now_ser.month,now_ser.day,now_ser.hour, now_ser.minute,now_ser.second,temp,humid,hi] hourstr_ser = "_" + now_ser.strftime("%H") #時刻を文字列化 #データの書き込み writer.writerow(data) #1行目以降:データ #表示 print('--------------------------------') print(now_ser.strftime("%Y/%m/%d %H:%M:%S")) print("温度:{:.2f}℃".format(temp)) print("湿度:{:.2f}%".format(humid)) print("不快指数:{:.2f}".format(hi)) print("Wtite in {:}".format(filename)) i+=1 ser.close() #ポートを閉じる print("End")
4. 実行結果
上図のように1時間毎にファイル名が更新され,別のファイルに保存されていることが確認できる。
今回は1時間毎に保存するプログラムとしたが,6時間毎や1日毎に保存するプログラムに書き換えることも可能だろう。
これについては,随時必要な時に更新することとする。