Python/Arduino学習記録,備忘録

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

【Arduino/Python#8】室内の温湿度計測&PCリアルタイム表示

今回は室内の温度・湿度をDHT11を用いて計測し,シリアル通信を用いてPCに取り込み,Pythonでデータを表示させるということをする。

1. 必要素子

  • ブレッドボード
  • 抵抗(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. 配線図

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(6000);     //6秒ごとに計測
 
  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);  //改行しながら湿度を出力
}

"DHT.h"ライブラリのインストールについては以下を参照。
opuktr.hatenablog.com


Python

# -*- coding: utf-8 -*-
import numpy as np
import serial 
import datetime

def queue(src, data): #「要素番号が若い=古いデータ」となるよう格納する関数
    dst = np.roll(src, -1)  #配列の要素を回転[backward]
    dst[-1] = data          #配列の最後にデータを格納
    return dst


# 1次元配列の生成
temps = [0]*100    #温度の配列
humids = [0]*100  #湿度の配列

i = 0   #カウント用変数
ser = serial.Serial("COM3")  # Arduinoが接続されているCOMポートを指定

while(i != 100):#10分間(6秒×100回)のデータを表示
    
    #情報の取得
    temp = float(ser.readline().rstrip().decode(encoding='utf-8'))    #温度に関して 
    humid = float(ser.readline().rstrip().decode(encoding='utf-8'))   #湿度に関して
    now = datetime.datetime.today()                                   #現在時刻に関して
    
    #表示
    print('--------------------------------')
    print(now.strftime("%Y/%m/%d %H:%M:%S"))
    print("温度:{:.2f}℃".format(temp))
    print("湿度:{:.2f}%".format(humid))      
    
    # キュー操作により温湿度データの格納
    temps = queue(temps, temp)
    humids = queue(humids, humid)
    i+=1

ser.close() #ポートを閉じる
print("End")

ここでは,Pyserialというモジュールが必要だ。なければ,"No module named serial"というエラーを吐く。
すなわち,コマンドプロンプトを開いて以下の様にする必要がある。

pip install pyserial

<注意事項>

  • 「serial」ではなくて,「Pyserial」が必要

すなわち,以下のコマンドは間違い。

pip install serial   #Pyserialをインストールするものではない!!


「serial」をインストールしてしまったら,pipのインストール先(私の場合,C:\ProgramData\Anaconda3\Lib\site-packages)で「serial」というファイルが作成される。
「pyserial」をインストールしても,同様にpipのインストール先で「serial」というファイルが作成される。
即ち,同じファイルの中で2つが競合して上手いこと行かないことがあるので,以下のように2つともアンインストールし直して「Pyserial」だけをインストールし直すのが良い。

pip uninstall serial
pip uninstall pyserial
pip install pyserial

そして,Pythonを一度閉じて再度開いた方がいいかもね。


  • 自分で書いたPythonのコードの名前を「serial.py」にしない

これも同様で,モジュールが上手くインポートできずに,'module' object has no attribute 'Serial'となる恐れがある。


  • Pythonを実行する際にはシリアルモニタ/プロッタを閉じておく

開いたままだと、実行時にアクセス拒否される。よって、モニタで温湿度を確認しながらPythonで表示させることはできない。

4. 実行結果

f:id:opuktr:20180816193151p:plain

このようにPythonのコンソール上で温湿度のデータを表示できた。
DHT11の測定精度では,温湿度共に整数値でしか出力されないので,細かい変動をみることが出来ないが,データを長期(1日とか1週間とか)で取得することによって使えるデータとはなるだろう。

また,温度データをtemps,湿度データをhumidsに格納することが出来たので,そのデータをcsvとして保存したり,リアルタイムでグラフを作成したりしていこうと思う。
加えて,Stater KitにはDHT11以外にも温度センサが入っているので,それも使ってみたい。