2021-05-21

温度センサーDHT11やDHT22を使った冷却システムの構築について



DHT11やDHT22とは

読者の中には「GPIOピンにセンサーを接続してこそRaspberry pi」という先入観を持っている人もいるかも知れません。しかしRaspberry piは道具に過ぎませんから、そのような縛りは不要です。農業はリアルなものですのでプラグマティックでなければなりません。

その点、Switchbotの温湿度計は広く出回っておりそれほど高価でもなく、温熱治療以外にも巣箱内や養蜂場の温度推移をロギングするのにも使えますし、もちろん普通に温湿度計としても使えるので、前の記事の構成で運用しても何の問題もありません。

それでも、既にRaspberry piで使える温度センサーを持っているなら、それを使わない手はありません。そこで、温湿度センサーとしてDHT11DHT22の使用を検討することにします。

DHT11は温湿度センサーとしては非常に廉価で、Raspberry piの学習キットに入っていることもあります。そのため、既にお持ちの方もおられるでしょう。しかし、温度測定範囲:0℃ から 50℃、温度測定誤差:±2℃と、厳密な温度管理が求められる温熱治療では、不安が残ります。

DHT22は、DHT11よりも高価ですが、温度測定範囲:-40 ℃ から 80 ℃、温度測定誤差:±0.5℃と、信頼性は非常に高いです。下の写真のセンサーがDHT22です。


本記事ではそれら両方の使用方法について検討します。


DHT11やDHT22の接続


DHTには、
・電気供給の端子(+、プラス、VCC)
・電気を逃す端子(−、マイナス、GND、グランド)
・データを送信する端子(DATA、OUT)
の3つの端子があります。

わたしの手元にあるDHT22では、左から「+、OUT、−」となっています。

これらの端子をRaspberry piの対応するGPIOピンとケーブルでつなぎます。

たとえば、
「+、プラス、VCC」は、ピン番号1番の3.3Vに、
「−、マイナス、GND、グランド」は、ピン番号9番のGNDに、
「DATA、OUT」はピン番号7番のGPIO4に、
つなぎます。

次の図で示すと、一番左上の3.3Vと書かれた1番ピンにプラス(+)を、2つあけて4つ目の7番ピンGPIO4にOUT(DATA)を、その下の9番ピンのGroundにマイナス(−)を刺します。


髙橋真 CC BY-NC 3.0

上のとおりにつないだのが次の写真です。



DHT11_Pythonのインストールとスクリプトの記述


DHT11_Pythonとは、szazoがMIT licenseで公開しているDHT11読み取りライブラリーです。

まずは、ターミナルを開き、以下のコマンドを入力して下さい。

----
$ git clone https://github.com/szazo/DHT11_Python.git
----


これでDHT11が使えるようになります。

次に、Thonnyを起動し、
/home/pi/DHT11_Python/dht.py
を作成し、以下のプログラムを書いて保存します。


----
import RPi.GPIO as GPIO
import dht11
import time
import subprocess

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

instance = dht11.DHT11(pin=4)

while True:
   result = instance.read()
   if result.is_valid():
       tmp = result.temperature
       if tmp <= 43:
           subprocess.call("sudo uhubctl -l 1-1 -a off", shell=True)
       if tmp > 43:
           subprocess.call("sudo uhubctl -l 1-1 -a on", shell=True)
       time.sleep(4)
----


"pin=4"はOUT(DATA)と接続しているGPIOのナンバーです。ピン番号ではありません。別のピンにつないでいる場合は書き換える必要があります。

if文の43はファンが回転し出す/停まる温度です。

time.sleepの括弧の数字は温度を読み取る間隔(秒)です。DHT22の場合は2秒以上の間隔を開ける必要があります。


DHT22が使えるように書き換える


25.5℃までならDHT22もDHT11_Pythonで使えます。しかし、それを超えると表示が狂います。温熱治療では40℃を越しますから、ライブラリーの内容を一部修正する必要があります。

/home/pi/DHT11_Python/dht11/__init__.py

というファイルを変更します。
アクセサリにあるText Editorを使うと良いです。



まず、
--
self.__send_and_sleep(RPi.GPIO.LOW, 0.02)
--
この一文を探して、下のように書き換えて下さい。
--
self.__send_and_sleep(RPi.GPIO.LOW, 0.0008)
--


次に、
--
temperature = the_bytes[2] + float(the_bytes[3]) / 10
humidity = the_bytes[0] + float(the_bytes[1]) / 10
--
このニ文を探して、下のように書き換えて下さい。
--
temperature = ((the_bytes[2]*256) + the_bytes[3]) / 10
humidity = ((the_bytes[0]*256) + the_bytes[1]) / 10
--


書き換えたら保存して下さい。
これで、DHT22をDHT11_Pythonで使っても温度を正常に読み込むことができるようになります。


自動起動の設定


まず、ターミナルを起動し
sudo vi /etc/rc.local
と入力します。

"exit 0"の上に"sudo python /home/pi/DHT11_Python/dht.py &"を書き加え、:wエンターで保存して下さい。


以上でDHT11やDHT22が使えるようになりました。
これら以外は前の記事と同様です。
お疲れ様でした。