秋月電子通商のDHT-11で温度と湿度を計測してみる

# 部屋の温度と湿度を記録してメンタルとの関連を調べてみたい

みなさんは「うつヌケ　うつトンネルを抜けた人たち」という本をご存じでしょうか。手塚治虫そっくりの絵を書くイタコ漫画家、田中 圭一がうつ病について書いた本です。その本に「鬱は気温変化との関連が大きい」という記述がありました。
だけ
要するに

**春先や秋口など、寒暖の差が激しいとメンタルが急降下する傾向がある**

ということです。
まあこれに関しては「うつヌケ」に書いてあるとおり、気象庁あたりのデータと山手線や中央線の人身事故データとかの関連やツイッタートレンドを分析してみれば面白いかもしれません。

ただ私としては**私個人のことが知りたい**という欲求があります。
発達障害を抱えメンタルで爆死しているので、セルフモニタリングの必要性を強く認識してます。そこで当面の目標として

**シェアハウスの寝室の気温、湿度、気圧を常にモニタリングしてみる**

ことにします。
睡眠は精神に大きな影響を与えます。睡眠時の環境がメンタルに与える影響というのも計り知れません。**計り知れないならば計ってみるしかない**。睡眠時間は記録していますが、時間だけでなく寝る場所の気温と湿度、気圧をモニタリングして精神に与える影響をはっきりさせてやろうというのがこのプロジェクトです。

ということで秋月電子通商で気温・湿度を計測するならこれというセンサーを買ってきました

[温湿度センサ　モジュール　ＤＨＴ１１](http://akizukidenshi.com/catalog/g/gM-07003/)￥300

安いですね。その分温度の温度の精度が±2℃、湿度の精度が±5%とちょっと大き目になっています。まあとりあえずはこれでいいでしょう。

この先高精度なセンサが欲しいときは

[温湿度センサ　モジュール　ＡＭ２３０２](http://akizukidenshi.com/catalog/g/gM-07002/)￥950

上位モデルのこちらを使うことにしましょう。こちらは±温度の精度が±0.5℃、湿度の精度が2%とハイグレードです。

どちらも同一メーカーの製品で同じように使うことができます。

# 使い方
## Arduinoとの接続
Arduinoとのつなぎ方ですが、これは付属のデータシートを見れば十分です。
ピンが4本あって使うのは3本、DC電源3.5～5.5VとGND、プルアップしたデータバスが1本です。つなぎ方の例が書いてあるのでその通りにArduinoのデジタルIOに刺しましょう。あるいは記事が多いセンサーなのでそれを参考にしてください。今回はプルアップ抵抗を10KΩにしました。
![AMZN_2020-02-16_18_12_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/01aef1ec-64f7-26e1-72bf-6297b547bebb.jpeg)

## ライブラリ
![DHTライブラリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/5940f646-2694-a48d-aa9b-cd711f98ba1e.png)

Arduinoのライブラリを2つ入れます。
サンプルコードに

```C++
#include "DHT.h"
```
とだけあるから
DHT sensor libraryだけ入れればいいというわけではありません。
DHT sensor libraryは動作にAdafruit Unified Sensorライブラリが必要なのでいれておきましょう。
割とよくひっかかるとこらしく、ネットで検索すると同様の記事をたくさん見つけました。
## コード
[DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)のREADME.mdにサンプルが書いてあるのでこれを活用して書いてみます。


```C++
#include "DHT.h"

#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));
  dht.begin();
}

void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();
 

  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }


  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));

}
```
サンプルには華氏温度や不快指数の算出などもありますが、ここでは省略してしまいます。

## コード詳細
### 宣言
```C++
#include "DHT.h"

#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
```
まずDHT.hをカレントディレクトリから探していく設定でインクルードします。
通信用ピンをDHTPINでデジタルIOの8番にします。
DHTTYPEをセンサ型番のDHT11にします。サンプルではDHT22になっていますが、これは上位モデルの型番です。
DHTオブジェクトdhtをピン番号8、センサ型番DHT11で作成します。

### セットアップ関数
```C++
void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));
  dht.begin();
}
```
PCとのシリアル通信を9600bpsで設定
シリアル通信でテストメッセージを送信。Fマクロを使用しています。詳しくは次のリンクで。
[Arduino 日本語リファレンス PROGMEMとFマクロ](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=1830)
dhtとの通信を開始します。

### ループ関数
```C++
void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();
 

  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }


  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));

}
```
センサからのデータ取得間隔はデータシートから二秒であることがわかるのでdelay(2000)で2000ミリ秒待つ
湿度をreadHumidity()メソッドで取得
セルシウス温度をreadTemperature()メソッドで取得


温度と湿度、どちらかがnanの場合は読み取り失敗のメッセージをシリアル通信に送りloop()のはじめからやり直す。

以降は湿度と温度の表示です。
シンプルですね。

# 実行結果
湿度と室温を取得することができました。
![DHTtest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/fad7b839-02e8-2ffe-6a80-52e579d18afe.png)

# 所感
独特な通信方式なので難しく考えていましたが、ライブラリを導入してしまえばとてもシンプルに扱えました。