Arduino nanoで、湿り空気の状態を表示した。（水蒸気量、水蒸気圧、露点温度、比エンタルピー）

#骨子
Arduino、温湿度センサ、液晶表示器を用いて、湿り空気の状態を示す諸量を計算させた。
近似計算式をArduino nanoに組み込んだ。

#システム構成
センサ : DHT11
コントローラ : Arduino nano
表示器 : LCD1602

#使用ライブラリ
物理計算用ライブラリ : math.h
温湿度センサ用ライブラリ : DHT.h
液晶表示用ライブラリ : LiquidCrystal.h

#本文
温湿度をDHT11で計測し、表示器としてLCD1602を用いるサンプルスケッチは、基本的なチュートリアルとして公開されている。

DHT11では、整数値で温度と湿度を出力する。
一般に、温度と湿度と言われているのは、湿り空気においては乾球温度と相対湿度である。
この2量から下記の7量を近似計算した。

- 露点温度 Dew point temperature (Frost point)
- 飽和水蒸気量 Saturated steam amount
- 水蒸気量 Steam amount
- 飽和水蒸気圧 Saturated steam pressure
- 水蒸気圧 Saturated vapor pressure
- 絶対湿度 Absolute humidity
- 比エンタルピー Specific enthalpy

飽和水蒸気量は、Wexler-Hylandによる近似計算式を用いた。
飽和水蒸気圧は、Tetens(1930)のパラメータによるAugust他の近似式により計算し、水蒸気圧は飽和水蒸気圧に相対湿度（％）を乗算した。
露点温度は、JIS Z 8806の飽和水蒸気圧表から求められる式により計算した。
絶対湿度は相対温度、水蒸気圧による状態方程式により計算した。
比エンタルピーは、温度と絶対湿度をパラメータとする計算式により、カロリー単位、ジュール単位で表現した。

#コードサンプル

```
// saturation steam amount (formula by Wexler-Hyland)
// 飽和水蒸気量 [g/m3]
double saturated_steam_amount(double theta_celcius)
{
  double saturation_steam_amount_fs;
  double Tab;
  double t1, t2, t3, t4, t5;

  Tab = 273.15 + theta_celcius;
  t1 = -5800.2206 / Tab;
  t2 = 0.048640239 * Tab;
  t3 = 0.41764768 * pow(10, -4) * Tab * Tab;
  t4 = 0.14452093 * pow(10, -7) * Tab * Tab * Tab;
  t5 = 6.5459673 * log(Tab);

  saturation_steam_amount_fs = exp(t1 + 1.3914993 - t2 + t3 - t4 + t5) / 1000;
  return saturation_steam_amount_fs;
}
```

![SSA.jpg](https://qiita-image-store.s3.amazonaws.com/0/255256/518eee31-ec93-64d3-3075-c6e2cc450262.jpeg)



```
// saturation steam pressure (formula by August etc. and Parameters by Tetens(1930))
// 飽和水蒸気圧 [mmHg]
double saturation_steam_pressure(double theta_celcius)
{
  double f;
  double index;
  index = 7.5 * theta_celcius / (theta_celcius + 237.3);
  f = 6.1078 * pow(10, index);
  return f;
}
```

![SSP.jpg](https://qiita-image-store.s3.amazonaws.com/0/255256/174e1536-335e-8050-902c-e459530eccc2.jpeg)



```
// dew point temparature(frost point)
// 露点温度 [CDP]
double dewpoint(double celsius, double humidity)
{
  double RATIO = 373.15 / (273.15 + celsius);
  double RHS = -7.90298 * (RATIO - 1);
  RHS += 5.02808 * log10(RATIO);
  RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
  RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
  RHS += log10(1013.246);

  double VP = pow(10, RHS - 3) * humidity;

  double T = log(VP/0.61078);
  return (241.88 * T) / (17.558 - T);
}
```

![DW.jpg](https://qiita-image-store.s3.amazonaws.com/0/255256/0ef34ccd-2c65-5477-697f-eb13db2e02e7.jpeg)



```
// specific enthalpy Cal
// 比エンタルピー(kcal/kgDA)
double specific_enthalpy(double theta_celcius, double absolute_humidity)
{
  return 0.24 * theta_celcius + (0.431 * theta_celcius + 597.3) * absolute_humidity;
}
```

![SEC.jpg](https://qiita-image-store.s3.amazonaws.com/0/255256/c20fc563-01bf-d11c-1dd1-e91886433fe8.jpeg)



#難しかったこと
近似計算式は複雑であり、また対数を用いるため、コードに記述すると読みにくくなる。
そのため、式の要素ごとに分解して、組み合わせて計算した。

#わかったこと
温度と水分量が分かることで、空気の状態は一意に、そして様々な物理量で表現できる。
温度が高ければ高いほど、含むことができる水分量が多くなる。
湿り空気は、水分量が多いほど、そのエネルギー状態が高くなる。

#あとがき
空気の状態を数値化して表現する、これは非常に大事だと感じました。
ニーズがあるようであれば、Arduino nanoに組み込んだスケッチをGitHubで公開したいと思います。
コミュニティの情報を参考にさせていただきましたのでLGPLで公開できればと考えています。

読んでいただきありがとうございました。