りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

Raspberry Piで電子工作する (2 - DHT11で気温・湿度を取得する)

f:id:ibuquicallig:20190606141530p:plain

この記事では電子部品のDHT11を使用して、Raspberry Piでの気温と湿度の取得方法と例などについて解説しています。

この記事でできること

  • DHT11を使用して温度と湿度を数値型で取得できる
  • モジュールから値を取得することができる
  • ループ処理で複数回値処理を実行することができる

前の記事

前回はPythonでLEDをチカチカさせるスクリプトを作成しました。

必要なもの

基本セット

まだRaspberry Pi用の電子工作アイテムをそろえていない場合は、以下の記事を参考に買い揃える必要があります。

DHT11

今回使用する温度と湿度を計測するためのモジュールはDHT11というものを使用します。単品で購入するよりもいろんなものが入っているモジュールのセットをAmazonなどで購入するほうが格段に安くなります。

以下のリンク先のセットにDHT11が含まれています。

DHT11単品だと4つのピンが飛び出ていますが、リンク先のものだと3ピンしか出ていません。データシートを見てみると3番目のピンは使われていない(null)ようなので特に問題ありません。

かつ、うれしいことにDHT11の乗っかっている基板で既にVCCピンとDATAピンを抵抗でつないでくれています。これで何も考えずにRaspberry Piとつないでも大丈夫となっています!

手順

それではさっそく作っていきましょう!今回も既に作成されているライブラリを使用してサクッと作っていきます。

ライブラリを取得

まずはライブラリを取得します。以下のGithubのページから取得します。PCでダウンロードしてRaspberry Piに転送というのは二度手間なので、URLだけ取得します。

取得するURLはリンク先の緑のClone or downloadをクリックして、Download ZIPで取得できるURLです(以下)。

https://github.com/szazo/DHT11_Python/archive/master.zip

このアドレスをwgetでRaspberry Pi上で取得します。

$ wget https://github.com/szazo/DHT11_Python/archive/master.zip
$ unzip master.zip
$ ls 
DHT11_Python-master ...

取得できたmaster.zipというアーカイブをunzipコマンドで解凍するとDHT11_Python-masterというディレクトリとして解凍されます。今回作成するスクリプトはこのディレクトリの中に置きます。

ここまで進めたら一旦回路作成に移りましょう。

回路を作成

ブレッドボードで回路を作成していきます。前回作成したLEDの回路のようにRaspberry Piのピン > モジュール > Raspberry PiのGNDと電気が回るようにとりあえず作ります。

モジュールの基板にはGNDDATAVCCと書いてあると思います。Raspberry PiのGNDと基板のGND5VピンとVCCをつなぎます。そして、18番ピンをDATAとつないでデータを取得します。

f:id:ibuquicallig:20190606141600p:plain

作成しているソフトの関係上、基板に乗っていないDHT11しか描画できません。。左から3番目のピンは無視してください。

もし基板に乗っていないモジュールを使用する場合には、DATAピンとVCCピンを5.1kΩの抵抗でつなぎます。

f:id:ibuquicallig:20190606141607p:plain

電源と繋いでいるので、回路が作成された段階でモジュールのLEDが光ります。光っていれば成功です。

プログラムを作成

データを受け取ってコンソールに表示するプログラムを作成します。先ほどのライブラリがPythonなのでPythonで作成していきます。

$ cd DHT11_Python-master
vim get_temp_and_humid.py

ファイル名はget_temp_and_humid.pyとしておきます。内容は以下のような感じです。とりあえず体裁は気にせずに表示だけしてみます。

#!/usr/bin/env python
#coding:utf-8

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

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

module = dht11.DHT11(pin=18)

while True:
    result = module.read()
    if result.is_valid():
        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        print("気温: " + str(result.temperature) + "℃")
        print("湿度: " + str(result.humidity) + "%")
        break
    time.sleep(1)

実行結果は以下のような感じになります。もしコードが間違っていたり、ピンが間違っていてループから抜けられなくなった場合にはCtrl + Cで処理を強制終了してください。

python get_temp_and_humid.pyを実行して表示される内容はこんな感じです。

$ python get_temp_and_humid.py
2019/06/06 21:34:19
気温: 25℃
湿度: 61%




少しコードを見ていきましょう。

#!/usr/bin/env python
#coding:utf-8

シバンと呼ばれるものとエンコードの指定です。エンコードを指定していないと日本語などの全角文字を表示できません。

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

必要なモジュールをインポート(読み込み)しています。import dht11で先ほどダウンロードしたライブラリを使えるようになります。

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

GPIOの初期化を行います。この部分は前回のLチカでも同じようなことをしました!

module = dht11.DHT11(pin=18)

moduleという変数にインスタンスを代入します。引数で指定している値(pin=18)のピンでインスタンス化します。18ピンを指定します。

while True:
    result = module.read()
    if result.is_valid():
        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        print("気温: " + str(result.temperature) + "℃")
        print("湿度: " + str(result.humidity) + "%")
        break
    time.sleep(1)

肝心の値を取得して表示する部分です。まずはwhile True:で無限ループします。一番最後にtime.sleep(1)を入れることによって1秒ごとにループを実行するようになります。

データの読み取りは、先ほどインスタンス化した変数のread()という関数を実行することで取得できます。 取得できた値にはtemperaturehumidityといった形で温度などの値が格納されています。

取得した値が正常なものかどうかをis_valid()という関数で判定できるので、それをIF文の条件に突っ込みます。正常な時(True)だけコンソールに表示して、そうでない場合は次のループへ進みます。

以上で値を取得して表示することができます!

試しにDHT11を指で温めたり、息を吹きかけてみて温度と湿度が変わることが確認出来たらOKです!

最終的なコード

#!/usr/bin/env python
#coding:utf-8

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

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

module = dht11.DHT11(pin=18)

while True:
    result = module.read()
    if result.is_valid():
        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        print("気温: " + str(result.temperature) + "℃")
        print("湿度: " + str(result.humidity) + "%")
        break
    time.sleep(1)

最後に

前回はLEDをチカチカさせるだけでしたが、今回はライブラリを使用しながらモジュールからデータを取得することができました。

アナログをデジタルの値に変えるモジュールのライブラリなどは、製品名で探せばいくらでも転がっているので同じように使い方を調べながら進めることができるでしょう。あとはそのライブラリの言語をどれぐらい知っているかと、面白いアイデアを思いつくかどうかです(笑)

今回はPythonを使用しましたが、個人的にはNode.js(JavaScript)で動かすほうが好きだったりします。

次の記事

Node.js(JavaScript)でLチカしてみる

[:embed]

参考

以下のサイトの情報を引用・参考にしました。

DHT11のデータシート

https://www.mouser.com/ds/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf