カメラの乾燥庫などで湿度計を使用しているのですが、
指示値がバラバラで信頼できません。
数年前に±2%の精度の物を2台購入したのですが、
当初は合っていたのですが、現在は2台の差が6%あり、
信用できません。
調べてみると、経年変化がかなりあるようで、数年経つと
当てにならないようです。
そこで、信頼できる湿度計を調べると、通風乾湿計がいいようで、
アスマン式が代表的なようです。
とは言え、10万円近くしますので、素人には手が出ません。
デジタルアスマン通風乾湿計だと15万円程度のようです。
原理を調べると、乾球温度計と湿球温度計(湿らせたガーゼで温感部を包んだ
温度計)が取り付けられていて、乾球温度計から気温、乾球温度計と湿球温度計
の差から湿度を計測できる温湿度計で、千円程度の乾湿計と通風以外は同じです。
精度を上げるために、クロムメッキされた二重金属円筒など、
日射や放射から断熱できる円筒で湿球と乾球を保護して、
通風器によって一定速度(風速2~5m/s)で通風しているようです。
日射や放射の影響の少ない室内での使用ならば、コストのかかる円筒が
不要と思い、簡易版を作成してみました。
回路図です。
回路です。
完成品です。
手持ちの湿度計と比較してみましたが、製作した湿度計だけが78.2%と
大幅にずれています。
手持ちの6台の湿度計も、40%~58%と結構バラバラです。
調べてみると、Arduinoのスケッチの湿度の計算式にミスがあり、
修正すると他の湿度計とおなじになりました。
なお、ファンがイマイチなので設計し直すことにしました。
軸流ファンの風の出口を絞って風速を増やすつもりだったのですが、
高静圧が得られるシロッコファンではないので、出口を絞ると
逆に風速が遅くなるようなので、出口を絞るのを止めました。
改良後のファンです。
ファンブレードは3DCADで設計して、3Dプリンターで印刷しました。
風速計を持っていないので、風速は不明ですが、
ファンの回転数を変化させても湿度の指示値に変化がないので、
問題ないだろうと勝手に判断しました。
比較的最近購入して、数値も中間的だった湿度計と比較しましたが、
ほぼ一致していますので、問題なさそうです。
固定は三脚を考えていたのですが、自立用の脚も追加しました。
横幅約10cm高さ(脚を除く)14cmとコンパクトで、
リチウムイオンバッテリーによるコードレス駆動なので便利です。
バイメタル式や半導体式と異なり、構造がシンプルなので
経年変化を気にせずに使用できます。
今後は我が家の湿度計の標準器です。
参考に、使用した計算式です。
1.乾球の指示値での飽和水蒸気圧を算出
Ew_T=6.11*10^(7.5*T_ave/(T_ave+237.3))
2.湿球の指示値での飽和水蒸気圧を算出
Ew_H=6.11*10^(7.5*H_ave/(H_ave+237.3))
3.乾球の指示値における水蒸気圧を算出
e=Ew_H-0.000662*1004*(T_ave-H_ave)
(通風式なので、係数は0.000662)
(我が家は標高80mなので、気圧は1004hPa)
4.相対湿度の算出
Hum=e/Ew_T*100
Arduinoのスケッチです。
//通風乾湿計
//Arduino NANO
//ATmega328P(Old Bootloader)
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 4, 9, 10, 11, 12);
// LCD(RS=2, E=4, DB4=9, DB5=10, DB6=11, DB7=12)
int V = A4;
int T = A5;
int H = A6;
int M = 8;
float val_V = 0.00;
float val_T = 0.00;
float val_H = 0.00;
float Ew_T = 0.00;//乾球飽和水蒸気圧
float Ew_H = 0.00;//湿球飽和水蒸気圧
float e = 0.00;//乾球水蒸気圧
float Hum = 0.00;//相対湿度
float REGIST;
float T_ave = 0.00;//平均値
float H_ave = 0.00;//平均値
int aveNum = 100;//▲ 平均化のサンプリング数
int i;//測定回数
void setup() {
lcd.begin(16, 2);
pinMode(M, OUTPUT);
digitalWrite(M, LOW);
}
void loop() {
val_V = analogRead(V);
if (val_V > 350){//10V以上でファン回転
digitalWrite(M, HIGH);
} else {
digitalWrite(M, LOW);
}
REGIST = 0; //平均計算のための中間の数値を格納
for (i = 1 ; i <= aveNum; i++) {
val_T = analogRead(T);
REGIST = REGIST + val_T;//読み値を足し合わせ合計していく
delay(1);
}
T_ave = REGIST / aveNum; //合計から平均を算出しT_aveとして出力
T_ave = 0.0000153 * T_ave * T_ave - 0.1048066 * T_ave + 74.6839339;
REGIST = 0; //平均計算のための中間の数値を格納
for (i = 1 ; i <= aveNum; i++) {
val_H = analogRead(H);
REGIST = REGIST + val_H;//読み値を足し合わせ合計していく
delay(1);
}
H_ave = REGIST / aveNum; //合計から平均を算出しH_aveとして出力
H_ave = 0.0000153 * H_ave * H_ave - 0.1048066 * H_ave + 74.6839339 + 0.1;
Ew_T = 6.11 * pow(10, (7.5 * T_ave / (T_ave + 237.3)));
Ew_H = 6.11 * pow(10, (7.5 * H_ave / (H_ave + 237.3)));
e = Ew_H - 0.000662 * 1004 * (T_ave - H_ave);
Hum = e / Ew_T * 100;
lcd.clear ();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(T_ave, 1);
lcd.print("C ");
lcd.setCursor(8, 0);
lcd.print("H:");
lcd.print(H_ave, 1);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.print(Hum, 1);
lcd.print("% ");
delay(1000);
}