Raspberry Piで温湿度センサーAM2302を動かす
こちらを参考にしてます。
配線
私が購入したのは3ピンのAM2302なので、こんな感じで配線してます。
AM2302 | Raspberry Pi側 GPIOのピン番号 | |
---|---|---|
1 | VDD | 1 (3.3 V) |
2 | SCA | 7 (GPIO4) |
3 | GND | 9 (Ground) |
HiLetgo デジタル温度湿度センサーモジュール DHT22 AM2302 [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア:
- この商品を含むブログを見る
プログラム
プログラムはフリーで提供されています。
$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git $ cd Adafruit_Python_DHT $ sudo python setup.py install
$ cd example $ sudo python AdafruitDHT.py 2302 4
とすると、
Temp=27.9* Humidity=67.5%
というように、現在の気温と湿度が測定されます。 sudoを付けないとエラーがでます。(sudoを付けなくてもいい方法はないのでしょうか…)
$ python AdafruitDHT.py 2302 4
Traceback (most recent call last): File "AdafruitDHT.py", line 24, in
import Adafruit_DHT ModuleNotFoundError: No module named 'Adafruit_DHT'
室内温湿度のログ
/Adafruit_Python_DHT/examples/simple_test.py を改造して、次のプログラムを作りました。
#!/home/pi/.pyenv/shims/python # -*- coding: utf-8 -*- import os import Adafruit_DHT import datetime now = datetime.datetime.now() # 現在の日時を取得 sensor = Adafruit_DHT.DHT22 pin = 4 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) discomfort = 0.81*temperature + 0.01*humidity*(0.99*temperature - 14.3) + 46.3 cmd = '/opt/vc/bin/vcgencmd measure_temp' line = os.popen(cmd).readline().strip() tcpu = line.split('=')[1].split("'")[0] file = open('/home/pi/log_AM2302/log.txt', 'a+') #書き込みモードでオープン file.write('{0:%Y/%m/%d %H:%M:%S}, {1:3f}, {2:3f}, {3:3f}, {4:3f}\n'.format(now, humidity, temperature, discomfort, float(tcpu)))
これをcronで定期的に動かすことで、温湿度のログが取れるようになります。
$ crontab -e
*/5 * * * * sudo python /home/pi/log_AM2302/log_AM2302.py
こうかくことで、5分に1回ログが記録されます。(/home/pi 以下にlog_AM2302というディレクトリをあらかじめ作っていて、プログラムを動かすとlog_AM2302にlog.txtという名前のファイルが作成されて5分に1回書き込まれていきます。)
log.txtの中身は、次のように詰まっています。 時刻, 湿度, 温度, 不快指数, Raspberry PiのCPU温度
不快指数はWikipediaの式に従って計算しています。 不快指数 - Wikipedia
ログのプロット
あらかじめpandasをインストールしておいたほうが楽でした。
$ pip install pandas
次のプログラムを動かせば、横軸時刻として、湿度、温度、不快指数、CPU温度をプロットできます。
#!/usr/bin/env python # -*- coding: utf-8 -*- import pandas as pd import numpy as np import datetime import matplotlib.pyplot as plt df = pd.read_csv('./log.txt', index_col=0, parse_dates=True, names=('date', 'humidity', 'temperature', 'discomfort', 'tcpu')) print(df.index) print(df['humidity']) plt.figure(figsize=(14,6)) plt.plot(df.index, df['humidity'],'.', label='humidity') plt.plot(df.index, df['temperature'], 'x', label='room temperature') plt.plot(df.index, df['discomfort'], '+', label='discomfort') plt.plot(df.index, df['tcpu'], '-', label='cpu temperature') #axis plt.xlabel('time') plt.ylabel('') #limit plt.ylim([0,100]) #legend plt.legend() #show plt.show()