2020年7月10日金曜日


Raspberry PiとDHT11で温度・湿度を測る



「DHT11」という温湿度センサーを使用します。

温湿度センサー「DHT11」

DHT11は、価格も安価で入手し易い温湿度センサーです。
dht11.png
センサー単体、基盤に設置されたものなど、用途に応じた様々な形態で販売されており、秋月電子通商では300円で購入することができます。(左の画像がセンサー単体です)
【秋月電子通商】
秋月電子通商 温湿度センサ モジュール DHT11

回路を組む

秋月電子で公開されているデータシートを参考に回路図を組んでみます。使用するのはDHT11のセンサー単体のものです。
DHT11のピン構成は、
 1番:5V
 2番:GPIO
 3番:NC(Non-Connected = 使用していない)
 4番:GND
という構成になっています。(3番の使用していないピンがあるというのは謎ですね…)
ざっくり説明すると、1番ピン、4番ピンにRaspberry Piの5V、GNDを接続し、2番ピンに任意のGPIOの端子を割り当てて情報を取得する、ということになります。
回路の組み方はいくつかあると思いますが、私は下図のように組んでみました。この後で温度・湿度を取得するプログラムでピンの番号が重要になりますので、ピンの位置は間違えないように注意してください。
dht11_ブレッドボード.png

温度・湿度を取得するスクリプトを作成する

DHT11から情報を取得するPythonのライブラリがGitHubで公開されています。
こちらのライブラリを使って、センサーから温度・湿度の情報を取得します。
DHT11 Python library
Raspberry PiからGitHubにアクセスして、ライブラリを取得しましょう。
そのためにも、apt-getを使用して、gitクライアントをインストールします。
sudo apt-get install git
インストールが完了したら、上記のサイトからクローンしましょう。
git clone https://github.com/szazo/DHT11_Python.git
クローンが完了すると、DHT11_Pythonというフォルダが作成され、以下のファイルが取得されています。
LICENSE.md
README.md
__init__.py
dht11.py
dht11_example.py
dht11.pyがDHT11から情報取得するライブラリ本体、dht11_example.pyがライブラリを使った温度・湿度の情報を取得するサンプルスクリプトです。

サンプルスクリプトを読み解く

dht11_example.pyを少し読み解いてみます。
dht11_example.py
import RPi.GPIO as GPIO
import dht11       # ・・・ ①
import time
import datetime

# initialize GPIO
GPIO.setwarnings(False)       # ・・・ ②
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
instance = dht11.DHT11(pin=14)      # ・・・ ③

while True:
    result = instance.read()    # ・・・ ④
    if result.is_valid():    # ・・・ ⑤
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)    # ・・・ ⑥
        print("Humidity: %d %%" % result.humidity) 

    time.sleep(1)    # ・・・ ⑦
① import文でライブラリ「dht11.py」を読み込みます。
② GPIOの初期化をしています。各コマンドには次のような意味になります。
  GPIO.setwarnings(False) : ワーニングを非表示にします。※1
  GPIO.setmode(GPIO.BCM) : GPIOの数字で指定します。
  GPIO.cleanup() : GPIOの設定を初期化します。
※1.ピンが既に使用中の場合等にワーニングが表示されます。今回のサンプルではワーニングは表示されないため、設定は必須ではありません。
③ データ読み込みのピン番号を設定します。②の初期化でGPIOの番号で設定するようにしているため、引数のpinには今回接続している14を設定します。
④ センサーから温度・湿度情報を取得します。
⑤ センサーから温度・湿度情報が取得できたか判定します。取得できた場合に結果をコンソールに出力します。
⑥ 温度・湿度情報をコンソールに出力します。
  temperature : 温度(摂氏)の値です。
  humidity : 湿度の値です。
⑦ 1秒処理を停止します。

実行結果

サンプルスクリプトのdht11_example.pyを実行します。コマンドは次の通りです。
$ python dht11_example.py 

成功すると下記のような結果を得られます。
shell
Last valid input: 2018-03-10 05:08:35.590508
Temperature: 24 C <= 温度
Humidity: 47 % <= 湿度
上記は1回の結果ですが、サンプルスクリプトは停止させるまで1秒毎に温度・湿度を取得して出力しています。(詳細は「サンプルスクリプトを読み解く」をご覧ください)
また、実行直後の結果には多少の誤差が生じるようで、数値が揺れているように感じます。数回実行すると収束し、安定した結果が得られるようになります。
※揺れは高性能なセンサーにすると解消するかもしれません。手に入れる機会があれば試してみたいと思います。

0 件のコメント:

コメントを投稿