Python/Arduino学習記録,備忘録

コツコツ学んだ学習記録と備忘録。現在Python,Arduino勉強中。

【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に応じて配線を変更してほしい。

f:id:opuktr:20180816191537p:plain
<DHT11端子の説明>

  1. VDD :電源接続(図(b)Bに接続)
  2. DATA :データの読み取り(図(b)Aに接続)
  3. NC  :何も接続しない or 電源/グランドに直接接続(図(b)Bに接続)
  4. GND :グランド(図(b)Cに接続)

2. 配線図(前回【Arduino/Python#8】と同様)

f:id:opuktr:20180816192011p:plain


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. 実行結果

f:id:opuktr:20180820000305p:plain

上図のように1時間毎にファイル名が更新され,別のファイルに保存されていることが確認できる。
今回は1時間毎に保存するプログラムとしたが,6時間毎や1日毎に保存するプログラムに書き換えることも可能だろう。
これについては,随時必要な時に更新することとする。