温度と湿度をRaspberryPiで読み取る-農家のIoT入門(5)
農家のIoT入門5回目は、「温度と湿度をセンサーで読み取る」です。
今回は、いよいよやりたい事に一歩大きく踏み出す感じですね。
土の温度と湿度を読み取って、その結果で散水などを自動操作するのが目標のひとつなので。
では、早速やってみましょう。
温湿度センサーDHT11とRaspberryPiの回路を組む
まず、温度と湿度を計るセンサーを用意します。
とってもメジャーなセンサーで、工作例もたくさんあるDHT11を使う事にします。
このDHT11、ちょうど購入した電子工作キットに含まれていました。ラッキー。
ただ注意点として、元々のDHT11はセンサー本体だけなのですが、これはプルアップ抵抗を最初から組み込んであるようです。(売っているのもだいたいはこっち)
センサー本体はピンが4本で、抵抗がついていない為そのまま接続すると安定しないようです。
(下の商品がセンサー本体)
なお、プルアップ抵抗については以前学んだ通りです。
プルアップ抵抗がついていれば、そのままRaspberryPiのピンと接続するだけで使えるので、実に楽ですね。
DHT11側のピン3本には、それぞれ「VCC」「DATA」「GND」と名称が書いてあります。
VCC(赤い線)はRaspberryPiの5Vピンに。
DATA(緑の線)はRaspberryPiの入力ピンに(今回はGPIO14、理由は後述)。
GND(青い線)はRaspberryPiのGNDピンに、それぞれ接続します。
回路としてはそれだけ。ブレッドボードも要らず簡単です(^^)
温湿度を読み取るプログラムを組む
さて、続いてはPythonでプログラミングです。
Pythonのいいところは、様々な完成したプログラムが公開されている事ですね。
ライブラリと呼びますが、自分で1から作らなくても、多種多様なプログラムが世界中で作られ、公開されているのが素晴らしいです。
今回のDHT11を使った温湿度計の読み取りも、ライブラリが公開されています。
まずはそれをRaspberryPiにダウンロードするところから始めます。
ターミナルを使ってライブラリを取得する
パソコンに様々な命令をする為の装置がターミナルです。
Windowsなら、コマンドプロンプトってやつですね。
RaspberryPiなら、「LXTerminal」というターミナルが初期インストールされていますので、それを使います。
ターミナルの使い方などは、入門書などを見て覚えてくださいね。
まず、Pythonのプログラムを保存するフォルダと同じディレクトリ(階層)に移動しておきます。
今回は、RaspberryPiの標準カレントディレクトリである home/pi のままとします
(カレントディレクトリ:今いる階層)
ターミナルに"pwd"というコマンドを打つと、カレントディレクトリがどこになっているか表示してくれます。
ですので、ディレクトリ移動のコマンド"cd"を使わなくても、そのままでOKですね。
続いて、ライブラリを取得するコマンド、git-cloneを使います。
(gitコマンドが使えない場合、「RaspberryPi git インストール」などで検索して、インストールして下さい)
git clone https://github.com/szazo/DHT11_Python.git
piフォルダを確認すると、「DHT11_Python」という名前のフォルダが作られていると思います。
その中に、Pythonのサンプルプログラムも入っています。
温湿度を取得するプログラムを走らせる
サンプルプログラムは、「example.py」という名前のファイルです。
これをThonnyで開くと、以下のようなプログラムが入っていました。
- 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)
- 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()
ここで、データ入力をGPIO14に指定しているので、先程の回路ではそのピンを使っていた訳です。
プログラム内容はしっかりと確認はしていませんが、そのままで使えるので、深く考えず使ってみる事にします(^_^;)
ただ、温度と湿度の表示である19行目・20行目だけ少し手直ししておきましょう。
19. print(“温度: %-3.1f ℃" % result.temperature)
20. print(“湿度: %-3.1f %%" % result.humidity)
表示を「温度」と「湿度」にしたほうが、わかりやすいですからね。
また、温度の取得サイクルが6秒毎になっていますが、もっと細かく見たいので3秒にしておきます。
22. time.sleep(3)
プログラムをRUNすると、しっかりと温度・湿度を読み取り始めました。
でもこれ、合っているか不明だったので、家にあった温湿度計を持ってきて比較してみました。
うーん・・・
温度はほぼ合っていますが、湿度が大きくズレていますね。
どっちが正確かわかりませんが、DHT11の精度は悪いと聞きますので、おそらくそっちがズレているのでしょう。
まぁ、今回はテストなので良しとします。
データを表示するところまでが目標なので(^^)
次回は、このデータをグラフ化したり、インタネット上にアップロードしたいなと考えています。
だんだんpythonの事もわかってきて、面白くなってきましたよ~♪