温湿度計を作ってみた : 取得編

    まいど。制作部のコダマです。
    以前、Raspberry Piトイレセンサーを作ったことがありましたが、コロナ渦もあって、社内に導入の話は立ち消えとなってしまいました…
    そんな訳で、我が家の中で再び放置気味だった Raspberry Pi ですが、通勤中のある時、CO2 センサーとか作るのに使えないか、と言うので調べ始めたところ、温湿度計の方が手軽で安く作れそうだったので、せっかくなのでやってみることにしました。

    今回は、スマホから確認とかでもよかったのですが、スタンドアロンで機能させたかったので、これまた放置されていた純正LCDと組み合わせてみました。なので、今回の Raspberry Pi OS は、GUI を含めたフルセット(2021-03-04版)にしていますが、OS イメージを microSD カードに書き込んで起動するだけなので、この辺は説明を省きます。

    で、センサーを手に入れるにあたり、Raspberry Pi を買った秋月電子に行くか、アマゾンで済ませるかで迷いましたが、仕事帰りに寄れないし、センサーのために秋葉原に行くのも面倒だったので、結局アマゾンで購入しました。

    使ったセンサーは、DHT22 と言う AM2302 温湿度センサーが乗っかった製品。本体との配線の説明については今回は割愛し、とりあえず使えるか以下の手順で確認。ちなみに、自身は読み書き出来るC言語のサンプルコードが付いていましたが、ここはあえて Python で行きます。

    1. GitHub から DHT センサーのライブラリを取得

    git clone https://github.com/adafruit/Adafruit_Python_DHT.git

    2. インストール

    cd Adafruit_Python_DHT
    sudo python setup.py install

    3. ライブラリ付属のサンプルを実行して、センサーが機能していることを確認

    sudo python ./AdafruitDHT.py 2302 4

    センサーは、DHT22 と AM2302 どっちらを指定しても OK ので AM2302 を指定
    GPIO は、4ピンに配線済

    はい。ちゃんと値が取れてますね。


    IKEAの安い温度計と比べても誤差の範囲なので、まあ正常に機能していると判断して良さそうです。湿度は、湿度計がないので分からないので、信じるしかない…

    と言う訳で、ライブラリ付属のサンプルを基に、以下のようなコードで温湿度を 10 分おきに CSV に出力させることにしました。

    import Adafruit_DHT
    import time
    import datetime
    import os
    
    # Sleeptime (sec)
    SLEEPTIME = 600
    # Used GPIO
    GPIO_PIN = 4
    # Used Sensor  @see common.py L35-
    SENSOR_TYPE = 22
    
    # Main
    if __name__ == '__main__':
        try:
            print( "Cancel : CTRL+C" )
            while True:
                # Get Sensor Data
                data_hum, data_tmp = Adafruit_DHT.read_retry( SENSOR_TYPE, GPIO_PIN )
                tmp = 80.0
                hum = 99.9
                if data_hum is not None and data_tmp is not None:
                    tmp = data_tmp
                    hum = data_hum
                #print( '[DEBUG] tmp={0:0.1f}*  hum={1:0.1f}%'.format( tmp, hum ) )
    
                # Set file
                dt_now = datetime.datetime.now()
                csvFile = '{0}.csv'.format( dt_now.strftime( '%Y-%m-%d' ) )
                openMode = 'a'
                if not os.path.isfile( csvFile ): openMode ='w'
                with open( csvFile, openMode ) as f:
                    f.write( '{0},{1:0.1f},{2:0.1f}\r\n'.format( dt_now.strftime( '%H:%M:%S' ), tmp, hum ) )
    
                # Sleep
                time.sleep( SLEEPTIME )
        except KeyboardInterrupt:
            print( "Closing..." )

    ちなみに、20, 21行目で温度と湿度の初期値を設定していますが、この値はセンサーの取得上限値で、上手く取得できなかった際の値としています。あと、25行目のコメントアウトを外せば、取得時の値がターミナルで確認できます。

    これで、ひとまずセンサーからの取得は何とかなりましたので、次回はこいつを表示する部分をやってみたいと思います。

    では。