Raspberry Piを使って温度・湿度を記録する

# サマリー（この記事でやること）
- Raspberry PiにDHT22のドライバをインストールする。
- Raspberry Piと温湿度センサ（DHT22）を使って温度・湿度を確認する。
- 取得した温度・湿度をcsv形式で書き出す。
- 一連の動作をcronを用いて定期実行する。
# 経緯
　普段、洗い物の乾燥は風呂場に除湿機を置いてやるのだが、冬場は除湿機の性能が落ちるため、1日除湿機を稼働させても服が乾ききらないということが多い。そこで、除湿機がどのような環境（室温・湿度）で稼働しているのかモニタリングすることにした。
# 環境
## 使用機材
- Raspberry Pi 4 Model B / 4GB（Element14製）
- 温湿度センサ（[DSD TECH DHT22](www.amazon.co.jp/dp/B07CM2VLBK)）
![YEP04704.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/b45ccb24-577b-d043-9475-2a6122a42b7a.jpeg)


## OS
Raspberry Pi OS Lite (64bit)
※通常のRaspberry Pi OSや別のバージョンのRaspberry Piであっても動作は変わりないはずです。（多分）

# 方法
## 準備
### ①Raspberry Piにセンサを接続する
それぞれのセンサ端子と対応するラズパイ側の端子は以下の通り。
|センサ端子|ラズパイ側端子|
|:--:|:--:|
|DAT|GPIO|
|VCC|3V3 power|
|GND|Ground|

以下の図を参考にし、ラズパイとセンサを接続しておく。GPIOピンに関しては、どの番号のピンに指したかわかるようにしておく。
![Raspberry Piピン配置](https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png)
### ②ドライバーのインストール
　ここからドライバのインストールをしておくのですが、既に**Python3用のpipやgitがインストールされていることを前提**にします。
まだpipをインストールしていない場合は、`sudo apt install python3-pip`コマンドでインストールします。
gitをインストールしていない場合には` sudo apt install git `でインストール。


```.必要なライブラリのダウンロード及びインストール
sudo apt-get update
sudo apt-get install python3-pip
sudo python3 -m pip install --upgrade pip setuptools wheel
sudo pip3 install Adafruit_DHT
```
ドライバのダウンロードとインストール
```.githubからドライバファイルをダウンロード
sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
```
setup.pyが正しく実行できれば、インストールは完了です。
## 使い方
### 基本的な使い方
基本的には```Adafruit_DHT```モジュールをインポートし、以下の関数を用いて湿度、温度を取得します。
```基本的な使い方.py
import Adafruit_DHT as DHT
humid,temp = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
```
第一関数には接続したセンサーのタイプ（今回はDHT.DHT22）、第2関数には接続したGPIOのピン番号を入力します。
### 温度・湿度を記録するプログラムを作成
今回はこんなプログラムを作成して、温度・湿度を取得した後、csvファイルに追記するプログラムを作成しました。
```main.py
import csv
import Adafruit_DHT as DHT
import statistics as st
import datetime

#センサータイプを指定
SENSOR_TYPE=DHT.DHT22
#接続したGPIOピンを指定
DHT_GPIO=2

tm_TEMP=[]
tm_Humid=[]

dt = datetime.datetime.now()
for i in range(0,4):
    a,b = DHT.read_retry(SENSOR_TYPE,DHT_GPIO)
    tm_TEMP.append(b)
    tm_Humid.append(a)

TEMP = round(st.mean(tm_TEMP),1)
HUMID = round(st.mean(tm_Humid),1)

print("["+str(datetime.datetime.now())+"] Temperature:",str(TEMP),"Humidity:",str(HUMID))

with open("./TEMP_and_HUMID.csv","a") as f:
    writer = csv.writer(f)
    writer.writerow([dt.strftime('%Y/%M/%D %H:%M:%S'),TEMP,HUMID])
```
ソースコードでは、取得したデータの精度を上げるために5回連続で温度・湿度を計測した後、その平均をcsvに書き込むことにしました。
また、csvに追記するデータとしては、「計測日時」「温度[℃]」「湿度[％]」を記録するようにしています。

　生成されるファイルにはヘッダーがなかったり、計測日時が0.00001秒単位で記録されたりなど、爪が甘いところもあります。
まぁ、csvを直接確認するというより、取得したcsvデータをもとにグラフを作って確認することがほとんどだと思いますのでね笑
もっとより丁寧にcsvデータを作りたい方は自分で改変するなりしていただければと。（他力本願）
もしより良いソースコードができたら共有していただけると幸いです。

### 動作確認
正しく実行できていれば、ターミナルに現在の温度・湿度が表示されるとともに、「TEMP_and_HUMID.csv」というファイルがカレントディレクトリ内にできているはずです。

csvファイル開くとこんな感じに記載されてるはず。
```TEMP_and_HUMID.csv
2022-12-11 21:25:03.691944,19.2,48.6
```
事前にcsvファイル作っておいて、```date,temperature[℃],Humidity[%]```のヘッダー追加しておくと良いかも。
### cronを用いて定期実行
　Raspberry Pi OSを始め、Linux系には定期的に処理を実行する```cron```と呼ばれる機能が搭載されています。
今回はこの```cron```を用いて先程作成したプログラムを定期的に実行させ、温度計の値を随時記録していきます。

```cron```の設定は非常に細かいので今回は説明を省略し、5分間隔で動作するように設定していきます。
詳しいcronの使い方は以下のサイトなどが参考になるはずです。

**参考サイト**
- [crontabの書き方(https://www.server-memo.net/tips/crontab.html)](https://www.server-memo.net/tips/crontab.html)
- [crontab - cronの設定 - Linuxコマンド(https://webkaru.net/linux/crontab-command/)](https://webkaru.net/linux/crontab-command/)
```.crontabにコマンドを登録
crontab -e
```
```.以下の情報を追記
*/5 * * * * python3 [main.pyの絶対パス]
```
書き込んだ後、保存して終了です。
これで、5分おきにプログラムが実行され、先程開いたcsvにデータが追記されていくはずです。
もし、ファイルが追記されていないようであれば、crontabで指定した絶対パスが正しいか確認してみてください。
# 実際に使ってみる
　流石に風呂場は湿度も高すぎるし、水場なので安全のため設置するのは断念。そこで、脱衣所兼キッチンに設置し、モニタリングすることにした。風呂場と脱衣所で、そこまで室温は変わらないはずなので、割と精度の高いデータが取れるハズ。
![YEP04703.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/009777e0-b52e-9a4f-082d-0ef89dd9f029.jpeg)
ということでこんな感じに設置。24時間放置した得られたデータの一部はこんな感じ。
```TEMP_and_HUMID.csv
date,temperature[℃],Humidity[%]
2022-12-12 12:00:04.164375,11.0,65.3
2022-12-12 12:05:03.383628,10.8,64.8
2022-12-12 12:10:03.681665,10.8,64.5
2022-12-12 12:15:03.960608,11.0,65.3
2022-12-12 12:20:03.299839,10.7,66.3
2022-12-12 12:25:03.575961,10.5,66.7
2022-12-12 12:30:03.841758,10.6,66.2
2022-12-12 12:35:04.120423,10.7,65.6
2022-12-12 12:40:03.390528,10.6,65.2
2022-12-12 12:45:03.679616,10.7,64.5
2022-12-12 12:50:03.964312,11.0,65.0
2022-12-12 12:55:06.771877,11.2,67.0
～～～～～～～～～～～～～～～～～～～～～～～～～～
```
　で、エクセルでグラフ化するとこんな感じ。
![24時間放置の結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/a44e7f78-b535-8873-b39d-a46393308238.png)
生活する部屋ではない環境ということもあり、昼間であっても温度は低めです。体感温度的には昼間と夜間で大きく温度が変化している印象だったのですが、意外にも温度は変わっていなかったですね。
また、一気に温度や湿度が上がったポイント（18:40あたり）があるのですが、この時間は計測した部屋で料理をしていたため、一気に温度・湿度が上昇したのだと思います。変化幅は2℃程度しか違わないのですが、比較的細かい温度変化もしっかり記録されていますね。
# まとめ
　ラズパイとDHT22を利用して温湿度計にチャレンジしました。部屋の温度が可視化されることで、暖房の利用目安の基準策定に使えそう。
また、これを利用してこの温度になったら、エアコンや加湿器をつけるといった動作もさせられそう。

最後に参考になりましたら、いいねを押して頂けると幸いです。
# 参考文献
以下のサイトを参考にさせていただきました。ありがとうございます。
- [簡単！Raspberry pi（ラズパイ）で温度・湿度（DHT22）を測る方法（https://inakita-monolab.com/iot-210105/）](https://inakita-monolab.com/iot-210105/)
- [Raspberry Piで温度と湿度を計測する。（DHT22 AM2302使用）（https://www.nakakamado.com/2021/01/raspberrypi-thermo-hygrometer.html）](https://www.nakakamado.com/2021/01/raspberrypi-thermo-hygrometer.html)
- [【RaspberryPi】センサーを接続して、温度・湿度の記録する（https://minokun.jp/pc/raspberry-pi/dht22/）](https://minokun.jp/pc/raspberry-pi/dht22/)
- [Raspberry PiのGPIOピン配置を確認する（https://www.bioerrorlog.work/entry/raspberry-pi-pinout）](https://www.bioerrorlog.work/entry/raspberry-pi-pinout)
- [Raspberry Pi Documentation（https://www.raspberrypi.com/documentation/computers/os.html#gpio-pinout）](https://www.raspberrypi.com/documentation/computers/os.html#gpio-pinout)