まいど。制作部のコダマです。
以前、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行目のコメントアウトを外せば、取得時の値がターミナルで確認できます。
これで、ひとまずセンサーからの取得は何とかなりましたので、次回はこいつを表示する部分をやってみたいと思います。
では。