ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Raspberry PiでCircuitPythonを利用して温湿度を測る(DHT22、AM2302)

(2021-12-01 初稿 - 2022-08-28 修正)

以前にRaspberry Piで、DHT22が付いたAM2302というセンサーで温湿度を測り、飽差を計算する記事を書いた。

記事をアップした当初は正常に動作したが、新たにインストールしたRaspberry Piでは動作しなくなってしまった。

確かに、当時使っていたライブラリのサイトを見ると、DEPRECATED LIBRARYとなっており、現在は推奨されていない。 

ここでは、Adafruit社のCircuitPythonのライブラリをインストールして、温湿度を測る方法を改めて記述する。

なお、以下の方法は、Raspberry Pi のOS Bullseye相当で確認を行った。

温度と湿度のセンサー

今回の目的のために購入した温湿度センサーは以下のとおり。
1個500〜600円なので、財布には優しい。

このセンサーはDHT22が温度・湿度センサーで、既にハンダ付けされて付属のケーブルでつなぐだけのAM2302を購入した。以下、このセンサーをAM2302と呼ぶ。

f:id:hymd3a:20210514153725j:plain

購入したAM2302

AM2302のつなぎ方

AM2302とラズパイの接続を間違えるとセンサーが壊れてしまうので、注意すること。
以下に写真を載せるので、付属ケーブルの接続方法を確認すること。

+    ⇒ pin1
out ⇒ pin7
-     ⇒ pin9

f:id:hymd3a:20210513100734j:plain

AM2302の端子

温度と湿度を測る

ライブラリのインストール

接続完了後、以下のとおりライブラリをインストールする。

まず、python3の pip を事前にインストール。既にインストールされていれば、不要。

$ sudo apt-get update 
$ sudo apt-get install python3-pip

以下のサイトに記述があるように、ライブラリをインストールする。

pip3 install adafruit-circuitpython-dht
sudo apt-get install libgpiod2

温度の計測

動作のテストは、上記サイトにあるスクリプトをコピーして実行するか、以下のスクリプトを試す。

以下のスクリプトは、筆者がCronで起動するために作成したもので、temp_hum-cp.py等と名前をつけて保存する。

$cat temp_hum-cp.py    

#!/usr/bin/env python3
# coding: utf-8
import time
import datetime
import board
import adafruit_dht

MAXTRY = 4

# add 2021-08-20
humidity = temperature = None

# Initial the dht device, with data pin connected to:
# 測定の開始(4は、接続したGPIOポート)
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False) # mod2022-08-29

cnt = 0
while cnt < MAXTRY:
    try:
        temperature = dhtDevice.temperature
        humidity = dhtDevice.humidity
        if humidity is not None and temperature is not None:
            #print(temperature, humidity)
            break

    except RuntimeError as error:
        print(error.args[0])
        time.sleep(1)
        cnt += 1
        continue

    except Exception as error:
        dhtDevice.exit()
        print("Exception error")
        raise error

# 時間の取得
now = datetime.datetime.today()

# 結果の表示
print("{} {} Temperature= {:.1f} *C, Humidity= {:.1f} %".format(now.strftime("%Y-%m-%d"),now.strftime("%H:%M:%S"), temperature , humidity))

サンプルプログラムの実行

$ chmod +x temp_hum-cp.py
$ python3 ./temp_hum-cp.py
2021-12-01 14:25:01 Temperature= 25.3 *C, Humidity= 40.7 %

上記のとおり、温度と湿度が表示されれば、正常に作している。

Crontab登録のためのBashスクリプトの作成

温湿度が計測できるようになったので、せっかくなのでデータを保存できるようにBashでラッパーを作成する。

ここでは、単純に ~/data ディレクトリに日付(2021-12-01.txt 等)ごとのファイルを作成し保存することとした。

このスクリプトは、t_temp_hum 等の名前にして、~/binディレクトリに保存する。

#!/bin/env bash
# 測定program for AM2302

rtext=$(/home/pi/py-s/temp_hum-cp.py)
set $rtext  # setで要素に分解 超便利
#echo ${1}
fpath="/home/pi/data/"

fname=error.txt
if [[ ${1} =~ [0-9]{4}-[0-9]{2}-[0-9]{2} ]]; then # 日付だったら
  fname=${1}.txt
fi

echo $rtext
echo $rtext  >> $fpath$fname  # >> 追記

作成したBashスクリプトは以下のとおり、実行権を与えてテストする。

$ chmod +x ~/bin/t_temp_hum
$ t_temp_hum
2021-12-01 14:25:01 Temperature= 25.3 *C, Humidity= 40.7 %

Crontabへの登録

出来上がったBashスクリプトは、Crontabへ登録する。

$ crontab -e

*/5 * * * * /home/pi/t-png 1>/dev/null

以上で、5分おきに温湿度を記録するようになる。

おわりに

以前の方法は非推奨とのことだったので、改めてCircuitPythonライブラリを用いた温湿度計測方法にスクリプトを書き直した。また、変更があれば、修正・追記を行う。

関連ページ