e-DIY
センサー

【DHT11の使い方】Raspberry Piで温度と湿度を取得する方法

DHT11

DHT11は低価格で購入できる温湿度センサーです。
以前の記事では温度を測定するのにADコンバータを使ったりしてなかなか面倒でしたが、DHT11のようなセンサーを使えば簡単に温度を、そして湿度も測定できてしまいます!

以前の記事はコチラをご覧ください。

DHT11で温度と湿度を測定する手順はたった3ステップ!

  1. DHT11とラズパイのGPIOを接続
  2. ライブラリを導入
  3. 温湿度取得プログラムを実行

で簡単にできてしまいます!!

温湿度センサー、DHT11とは?

DHT11はデジタル温湿度センサーで、内部には

  • NTCサーミスタ
  • 静電容量式湿度検出素子
  • 8bitマイクロコンピューター

が内蔵されていて、独自の1wireの通信規格で温度と湿度をデジタル出力します。

ラズパイを使って温湿度を測定する回路

DHT11で温度と湿度を測定する回路は簡単です。

DHT11の端子は4端子あります。

DHT11端子配列

1ピンに電源端子で、動作電圧範囲は3.3V~5.5V。
今回は3.3Vに接続します。

2ピンは通信端子なのでラズパイのGPIOと接続。
今回はGPIO14を使用します。

また、2ピンは電源にプルアップする必要があります。
プルアップ抵抗は4.7kΩが推奨ですが、10kΩでも動作しました。

3ピンはNC(Non Connection)なので使いません。

4ピンはGNDに接続します。

回路図とブレッドボードの配線はこのようにしました。

ラズパイ温湿度測定回路図
ラズパイ温湿度測定ブレッドボード

DHT11のPythonライブラリをインストール

温度と湿度を取得するプログラムを自分で作成しなくても、GitHub上で公開されているPythonライブラリを使えば動作させることができます。

GitHubからライブラリを取得するので、まずはgitクライアントをインストールしましょう。

sudo apt-get install git

次に、公開されているPythonのライブラリをクローンして取得します。

git clone https://github.com/szazo/DHT11_Python.git

取得したフォルダの中はこのようになっています。

DHT11ライブラリ

dht11というフォルダの中に__init__.pyというファイルがあり、これがdht11から温度と湿度を取得するためのライブラリです。

example.pyは温度と湿度を出力するためのプログラムです。
このプログラムはこのようになっています。

import RPi.GPIO as GPIO
import dht11
import time
import datetime

# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

# read data using pin 14
instance = dht11.DHT11(pin=14) # GPIO14を使用

try:
    while True:
        result = instance.read()
        if result.is_valid(): # データを正常に取得できたら
            print('Last valid input: ' + str(datetime.datetime.now()))
            print('Temperature: %-3.1f C' % result.temperature)
            print('Humidity: %-3.1f %%' % result.humidity)
            
        time.sleep(6) # データ出力間隔

except KeyboardInterrupt:
    print('Cleanup')
    GPIO.cleanup()

データが正常に取得できれば、日時と温度、湿度を出力するプログラムになっています。
取得データは6秒間隔で更新するようになっています。

DHT11が動かないときの対策

公開されているライブラリをそのまま実行するだけなので問題なく動くと思ったのですが、何も出力されない状態になりました。
どうやら温度と湿度が取得できていなくて、「if result.is_valid():」がFalseとなっていて、その状態がずっと続いているようでした。

Falseの時の処理が書かれていないので、下記のようにコードを追加すると、ずっとErrorが出力されていました。

try:
    while True:
        result = instance.read()
        if result.is_valid(): # データを正常に取得できたら
            print('Last valid input: ' + str(datetime.datetime.now()))
            print('Temperature: %-3.1f C' % result.temperature)
            print('Humidity: %-3.1f %%' % result.humidity)
        else:
            print('Error')
            
        time.sleep(6) # データ出力間隔

原因はStart Signal(データシートの6ページ目参照)を送る前のHighの状態が短すぎることでした。

__init__.pyの37行目に初期状態のHighの時間を設定している箇所があります。

self.__send_and_sleep(RPi.GPIO.HIGH, 0.05)

ここを0.05秒から0.6秒へ変更することで動作するようになりました。

動作チェック

ライブラリを修正してプログラムを実行すると、このように温度と湿度が出力されるようになりました。

温湿度取得結果

それでも、たまにErrorが出力されているので、完全に安定動作はできていないようです…

取得した温湿度を液晶画面に表示させる方法はこちらの記事を参考にしてください。

もっと高精度な温湿度センサーを使いたい方はコチラ。

関連キーワード

フリーワード検索