温度と湿度をRaspberryPiで読み取る-農家のIoT入門(5)

2024年2月19日

農家のIoT入門5回目は、「温度と湿度をセンサーで読み取る」です。

今回は、いよいよやりたい事に一歩大きく踏み出す感じですね。

土の温度と湿度を読み取って、その結果で散水などを自動操作するのが目標のひとつなので。

では、早速やってみましょう。

温湿度センサーDHT11とRaspberryPiの回路を組む

まず、温度と湿度を計るセンサーを用意します。

とってもメジャーなセンサーで、工作例もたくさんあるDHT11を使う事にします。

KKHMF 2個 DHT11 温湿度センサーモジュール ピンオス/メス デュポンワイヤーが付き Arduino/Raspberry pi 用 「国内配送」
KKHMF

このDHT11、ちょうど購入した電子工作キットに含まれていました。ラッキー。

ただ注意点として、元々のDHT11はセンサー本体だけなのですが、これはプルアップ抵抗を最初から組み込んであるようです。(売っているのもだいたいはこっち)

センサー本体はピンが4本で、抵抗がついていない為そのまま接続すると安定しないようです。
(下の商品がセンサー本体)

KKHMF DHT11 温度と湿度センサー デジタル出力
EasyWordMall

なお、プルアップ抵抗については以前学んだ通りです。

プルアップ抵抗がついていれば、そのまま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で開くと、以下のようなプログラムが入っていました。

  1. import RPi.GPIO as GPIO
  2. import dht11
  3. import time
  4. import datetime
  5. # initialize GPIO
  6. GPIO.setwarnings(True)
  7. GPIO.setmode(GPIO.BCM)
  8. # read data using pin 14
  9. instance = dht11.DHT11(pin=14)
  10. try:
  11.     while True:
  12.      result = instance.read()
  13.      if result.is_valid():
  14.      print("Last valid input: " + str(datetime.datetime.now()))
  15.      print("Temperature: %-3.1f C" % result.temperature)
  16.      print("Humidity: %-3.1f %%" % result.humidity)
  17.      time.sleep(6)
  18. except KeyboardInterrupt:
  19.     print("Cleanup")
  20.     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の事もわかってきて、面白くなってきましたよ~♪