RaspberyPi Zero WHとDHT22センサで部屋の温度・湿度を測定してみた


はじめに

こんばんは。以前の記事に書いたように、RaspberyPi(ラズパイ)をIoTデバイスとして、Webアプリとの連携を目指していますので、今回はセンサーを用いてラズパイから温度・湿度を取得することにチャレンジしてみようと思います。

準備したもの

品名 型番 購入店舗など 単価(税込)
Raspberry Pi Zero WH - 秋月電子通商/M-12961 ¥2,200
USB変換ケーブル - 秋月電子通商/C-07607 ¥150
USB ACアダプター - 秋月電子通商/M-12001 ¥700
KIOXIA マイクロSDカード(microSDH)EXCERIA 32GB 100MB/s - 秋月電子通商/S-15844 ¥780
USB OTGケーブル - 秋月電子通商/C-13430 ¥250
HDMI変換コネクタ - 秋月電子通商/C-13431 ¥210
USBハブ(セルフパワータイプ) ‎UGREEN/‎60812 Amazon https://www.amazon.co.jp/dp/B07TWGHM99/ref=cm_sw_em_r_mt_dp_XBSB7R6WXHTGD895CQAC?_encoding=UTF8&psc=1 ¥2,399
Seeed Grove Base Hat for Raspberry Pi Zero 103030276 せんごくネット通販/EEHD-5HXA ¥1,222
Seeed DHT22 / AM2302 - Grove Temperature & Humidity Sensor Pro 101020019 スイッチサイエンス/819 ¥1,386

その他にディスプレイ、マウス、キーボード、USBハブ用の電源(5V)は、既に家にあるものを使用しました。
ラズパイZeroにSSH接続してつかうなどすれば、ここまで揃える必要はなかったのかもしれませんが、まだ初心者なので、ハードルの低い構成で考えました。

(ラズパイOS書き込み用PCは以下の仕様です。)
MacBook Air (13-inch, Early 2014)
1.4 GHz デュアルコアIntel Core i5
macOS 11.6.2 (20G314)
Darwin 20.6.0

ラズパイOSインストール

ラズパイZeroにOSを入れていきます。このあたりはネット上にたくさん情報があったので特に困りませんでした。
以前ラズパイと家に転がってた外付けHDDでNASを作ったことがあった(時間があれば記事にしたいです)ので、Macbookに入れてあった「Raspberry Pi Imager」のアプリを使って、標準OSをmicroSDに書き込みました。

一番上のRaspberry Pi OS(32-bit)を選択しました。

10分くらいで書き込み完了しました。

ラズパイの起動

ラズパイにOSを書き込んだmicroSDやケーブル類をぶっ刺して起動しました。起動したらWiFi設定や言語設定を行いました。英語でもいいんですが、今回は日本語にしました。

USBハブにマウスやキーボードを接続しているので、コード類がゴチャゴチャです笑

無事に設定終了したので、一度シャットダウン。

HATとセンサーの取り付け

お次は購入したGrove Base Hat for Raspberry Pi Zeroと温湿度センサー(DHT22)を使えるようにセットアップしていきました。
参考にしたのはSeeedの以下の公式wiki
1:https://wiki.seeedstudio.com/Grove_Base_Hat_for_Raspberry_Pi_Zero/
2:https://wiki.seeedstudio.com/Grove-Temperature_and_Humidity_Sensor_Pro/

2にしたがってラズパイZeroにHATとセンサーを取り付けました。

壊しそうでビクビクしながらGPIOピンにHATを取り付けました。

あんまり関係ないかもだけど、電源入れる前に全部繋いでおいた方が良さそう…とりあえず、説明どおり、HATをラズパイに取り付ける→センサーをHATのポート12につなぐ…。え、ポート12ってどこのこと???ってなりましたw
1のサイトを見ると、

PWM(pulse-width modulation)

The Grove PWM Port connect to GPIO/BCM pin12(PWM0) and GPIO/BCM pin13(PWM1), which is the hardware PWM pin of Raspberry Pi, in addition, you can use all the GPIO pin as the soft PWM pin.

とのことなので、どうやらPWMポートが12に相当するらしい。(ラズパイとHATの勉強もしなきゃ)そして13もPWMポートに相当するらしい。ただ、2のサイトによると、このセンサーはどのGPIOポートでも、プログラムで適切なピン番号を入力すれば使えるっぽいです。(まだ試しては無いです。)

Note

〜〜 you are able to connect the temperature and humidity sensor pro to any GPIO Port but make sure you change the command with the corresponding port number.

というわけで、繋いでラズパイを立ち上げてみる。

ライブラリのインストールとサンプルプログラムの実行

これも1と2のサイトを参考にやってみました。

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

Seeed grove.py libraryをインストールするのですが、どうやら1の説明によると、①ワンクリックインストールと②ステップバイステップインストールの2通りあるらしい、。ワンクリックの方が簡単そうだけど、、、

Attention

If you are using Raspberry Pi with Raspberrypi OS >= Bullseye, you cannot use this command line.

どうやらラズパイOSがBullseye以上の場合は、ワンクリックインストールのコマンドは使えないようです。
今回ラズパイOSは最新のBulleyeを入れたので、ステップバイステップインストールをしないといけないぽい。

というわけでラズバイのLXTerminal (ターミナル)を起動し、以下のコマンドを順に実行。
gitクローンしてgrove.pyディレクトリに移動して、python2とpython3それぞれ、バージョン管理するpipをインストール。

pi@raspberrypi:~ $ git clone https://github.com/Seeed-Studio/grove.py
pi@raspberrypi:~ $ cd grove.py
pi@raspberrypi:~/grove.py $ sudo pip install .
pi@raspberrypi:~/grove.py $ sudo pip3 install .

お次は2を参考にDHT22センサーを使えるようにしていきます。

pi@raspberrypi:~ $ git clone https://github.com/Seeed-Studio/Seeed_Python_DHT.git
pi@raspberrypi:~ $ cd Seeed_Python_DHT
pi@raspberrypi:~/Seeed_Python_DHT $ sudo python setup.py install

やらなくてもいいと思いますが、grove.pyライブラリは一つのディレクトリに入れておきたいなと思ったので、今回インストールしたSeeed_Python_DHTをgrove.pyディレクトリ内に移動させました。

pi@raspberrypi:~ $ mv Seeed_Python_DHT grove.py
pi@raspberrypi:~ $ cd grove.py/Seeed_Python_DHT/examples

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

サンプルプログラムは既に用意されていますが、今回使ったDHT22センサーより安価なDHT11センサー用に書かれているようなので、サンプルプログラムの一部を変える必要があるみたい。
「sensor = seeed_dht.DHT("11", 12) 」の部分を「sensor = seeed_dht.DHT("22", 12)」に変えます。

dht_simpleread.py
import time
import seeed_dht
def main():

    # for DHT11/DHT22
    sensor = seeed_dht.DHT("22", 12)
    # for DHT10
    # sensor = seeed_dht.DHT("10")

    while True:
        humi, temp = sensor.read()
        if not humi is None:
            print('DHT{0}, humidity {1:.1f}%, temperature {2:.1f}*'.format(sensor.dht_type, humi, temp))
        else:
            print('DHT{0}, humidity & temperature: {1}'.format(sensor.dht_type, temp))
        time.sleep(1)


if __name__ == '__main__':
    main()

これで準備完了のはず…。ドキドキ。
ラズパイのターミナルから実行してみる。

pi@raspberrypi:~/grove.py/Seeed_Python_DHT/examples $ python3 dht_simpleread.py 
DHT22, humidity 0.0%, temperature 0.0*
DHT22, humidity 0.0%, temperature 0.0*
DHT22, humidity 39.7%, temperature 20.8*
DHT22, humidity 39.7%, temperature 20.8*

おーーー!ちゃんと測定できてるっぽい!!感動!

部屋にあったA&D社の熱中症指数計とも比べてみる。ぴったりとは言えないが、いい線いってそうな感触でした。

あと、起動直後はデータを読み取ってくれないみたいなので、時間をおいてからのデータを取得した方が良さそう。

参考文献(再掲)

1:https://wiki.seeedstudio.com/Grove_Base_Hat_for_Raspberry_Pi_Zero/
2:https://wiki.seeedstudio.com/Grove-Temperature_and_Humidity_Sensor_Pro/

最後に

最後まで読んでいただきありがとうございます!
間違いを見つけたら順次改訂していきます。
もしご指摘などありましたらお気軽にお願いします。

groveの太陽光センサも購入してあったので、次回はこちらを試してみたいと思います。