【DHT11の使い方】Raspberry Piで温度と湿度を取得する方法
DHT11は低価格で購入できる温湿度センサーです。
以前の記事では温度を測定するのにADコンバータを使ったりしてなかなか面倒でしたが、DHT11のようなセンサーを使えば簡単に温度を、そして湿度も測定できてしまいます!
以前の記事はコチラをご覧ください。
DHT11で温度と湿度を測定する手順はたった3ステップ!
- DHT11とラズパイのGPIOを接続
- ライブラリを導入
- 温湿度取得プログラムを実行
で簡単にできてしまいます!!
温湿度センサー、DHT11とは?
DHT11はデジタル温湿度センサーで、内部には
- NTCサーミスタ
- 静電容量式湿度検出素子
- 8bitマイクロコンピューター
が内蔵されていて、独自の1wireの通信規格で温度と湿度をデジタル出力します。
ラズパイを使って温湿度を測定する回路
DHT11で温度と湿度を測定する回路は簡単です。
DHT11の端子は4端子あります。
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というフォルダの中に__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が出力されているので、完全に安定動作はできていないようです…
取得した温湿度を液晶画面に表示させる方法はこちらの記事を参考にしてください。
もっと高精度な温湿度センサーを使いたい方はコチラ。