【Raspberry Pi】DHT22センサで気温湿度モニタリング装置を作る

raspberry-pi-tempcalc_topRaspberry Pi
raspberry-pi-tempcalc_top

概要

シングルボードコンピューター「Raspberry Pi」を用いて、毎分スマホに気温・湿度データを送信するモニタリング装置を作製します。

[必要なもの]
・Raspberry Pi(PicoはNG): \4000~\9000
・DHT22センサ : \500~\1000
・LINEが使えるスマートフォン

[あったほうがいいもの]
・Raspberry Piケース

uxcell DHT22温湿度センサー DC 3V-5.5V 長距離信号伝送 デジタル 固定穴径2.9mm

はじめに

前回はRaspberry Piで写真を撮影して、LINEに送信する監視カメラを作製しました。

電源を入れるだけで自動実行するため、我が家の警備員として特に問題なく働いてくれます。

今回はその続きとして、Raspberry Piに温度湿度センサーを搭載し、気温と湿度をモニタリングしてみることにしました。構成イメージは以下の通りです。

image

将来的には部屋の暖房や冷房と連携させて、部屋の温度を自動で快適に保つことにも活用できるかなと考えています。

また、監視カメラ作動中に万が一Raspberry Piが故障して発火しかけたとしても、温度センサから状況を把握することができます

前回同様、pythonやプログラムのことはチンプンカンプンなハード寄り人間が、コピペだけで動作可能なコードを載せて、小学生でもわかるように丁寧に解説していきます。

※viの使い方やLINE APIの取得方法は前回の記事を参考にしてください。

【STEP1】Raspberry PiにDHT22センサを繋げる

Raspberry Piで使える温度湿度センサーとして、まずはDHT22(AM2302)を用意しました。DHTセンサには11と22の二種類があり、測定精度に違いがあります。

詳細な違いは表の通りですが、測定範囲と精度が優れている方がDHT22と理解すればいいでしょう。細かく知りたい方は、メーカーのページも確認してください。

DHT11DHT22
測定温度0~50°C(±2°C)-40~80°C(±0.5°C)
測定湿度20~80%(±5%)0~100%(±2-5%)
値段310円/個~620円/個~
より

DHT22は「+」「out」「-」の3つのピンがあるので、それぞれRaspberry Piの①3V3 Power、⑤GPIO 4、⑦Groundに繋げます。

DHT22の動作電圧は3~5.5Vなので、「+」は5V Powerに繋げても別に問題はありません。

raspberry-pi-tempcalc
raspberry-pi-tempcalc

【STEP2】DHT22センサの動作テスト

カメラであればケーブルをカメラ専用接続箇所に差し込めばRaspberry Piが勝手に認識してくれました。

しかし今回は、温度湿度センサーをGPIO(汎用入出力:general purpose input/output)ピンに繋げただけなので、Raspberry Piに気温と湿度の読み取り方を教えてあげる必要があります。そこで使うのがpythonです。

pythonのパッケージはRaspberry Piにインストールされているはずなので、AdafruitのDHTライブラリをインストールします。まずはRaspberry Piの電源を入れて、ターミナルを起動(CtrlとAltとTキー)します。

sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

次に、pythonでプログラムを作成します。同じターミナルでcalc.pyを作成します。テキストエディタやThonny IDEからの作成でも問題ありません。

vi calc.py
import Adafruit_DHT as DHT

SENSOR_TYPE = DHT.DHT22
DHT_GPIO = 4

h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
Temp = "Temp = {0:0.1f} deg C" .format(t)
Humidity = "Humidity = {0:0.1f} %" .format(h)
message = Temp + "\n" + Humidity
print (message)

ターミナルから実行する際は、以下のコードです。

python3 calc.py

しかし、Raspberry Pi 4Bの場合、このまま実行してもエラーとなってしまいます。初めはセンサーの初期不良を疑いましたが、エラーの原因を見てみると、

cannot import name ‘Beaglebone_Black_Driver’

となっています。ネット上をあれこれ調べた結果、海外の方が原因を見つけていました。なんとありがたい!

OSのraspbianのアップデートによって、一部のハードウェア名が変わってしまったそうです(?)

以下の通りに、/usr/local/lib/python3.7/dist-packages/Adafruit_DHTのplatform_detect.pyを書き換えた結果、無事に気温と湿度を計測することができました。これは一人では気づけない。。。

cd /
cd usr/local/lib/python3.7/dist-packages/Adafruit_DHT
sudo vi platform_detect.py

ライブラリの書き換えには管理者権限が必要だから、sudoを入れる必要がある。
リスクのある作業なので、くれぐれも注意するのじゃ。

以下のコードを赤字の通り追記します。

elif match.group(1) == 'BCM2711':
    # pi 4
    return 3

これでもうまくいかない場合は、センサーの故障を疑ってみてください。

【STEP3】気温湿度データをLINEに送信させる

前回の記事でLINE Notifyのトークンを取得できていれば、あとはサクサクできます。

まずは、気温湿度データをLINEに送信させる機能をcalc.pyに追記します。

vi calc.py
import Adafruit_DHT as DHT
import datetime
import requests

SENSOR_TYPE = DHT.DHT22
DHT_GPIO = 4

date = datetime.datetime.now()
print (date)

h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
Temp = "Temp = {0:0.1f} deg C" .format(t)
Humidity = "Humidity = {0:0.1f} %" .format(h)
message = Temp + "\n" + Humidity
print (message)

url = "https://notify-api.line.me/api/notify"
token = "LINE Notifyのトークン"
headers = {"Authorization" : "Bearer "+ token}
payload = {"message" : message}
r = requests.post(url, headers = headers, params = payload)

問題なくLINEに送信できれば、監視カメラの時と同じく、cronにプログラムを登録して自動実行させます。

pythonのファイルをcronに登録しても、なぜかうまく処理されないので、calc.pyを実行させるシェルスクリプト(calc.sh)を作成して、calc.shをcronに登録しました。

また、calc.logというログファイルも作成させるようにしています。

vi calc.sh
#!/bin/bash
python3 calc.py >> calc.log
chmod +x calc.sh
crontab -e

cronの最終行に以下のコードを記載します。

* * * * * ./home/pi/calc.sh

おそらく他にもっといい方法があるかもしれませんが、ソフト苦手人間にはこれが精一杯でした。。。

以上で、毎分間隔で気温湿度データ、15分間隔で写真をLINEに送信することができます。

まとめ

pythonを書いたり、ライブラリを書き換えたり色々していますが、作成するプログラムは20行程度のcalc.pyと、それを実行するcalc.shの二つだけです。

カメラモジュールと温度湿度センサーは併用できるので、夏場のペットの見守りや観葉植物のモニタリングなど用途は多いかと思います。

ちなみに、「電源コードが邪魔で電池駆動をさせたい」という方は、下記記事のRaspberry Pi Picoもご参考までに。

是非、自由研究としてRaspberry Piで身のまわりのIoT化を試してみてください。

コメント