乾湿球湿度計の計算処理の組み込み
乾湿球湿度計の読みから、湿度を求めます。前回示した計算式は気象庁の気象観測の手引きの湿度を求める表を作るために使用している式です。
湿度の計算は小数点を伴うデータがありますので、変数は浮動小数点型としてfloatを指定します。湿度の計算にはt1とt3のセンサを使用しますので、これら変数を浮動小数点型にします。また、vrefもlong型では計算途中で桁落ちしてしまいます。そのためfloat型にします。
最初に計算機科学の本を読んだときに、計算中の桁落ちのことが延々と説明されていて、なんでこんなことが問題なのか実感わかず興味をもてませんでした。しかし、実際の計算ではデータの型を適切に指定しないと、実際と異なった結果となってしまいます。
これらの詳細は、次回再度説明します。
long t0=0;
float t1=0;
long t2=0;
float t3=0;
long t4=0;
float vref=1100;
int tset=0;
計算内容に応じて、それぞれ設定を行いました。
初期化ルーチンでは、アナログ入力の基準電圧を内部の1.1Vの基準電圧にするために、
analogReference(INTERNAL);
と設定しています。
void setup() { Serial.begin(9600);
// シリアル・ポートの伝送速度9600bpsに設定しシリアル通信の初期化を行う
analogReference(INTERNAL); }
void loop()
{
tset=analogRead(5);
t0= analogRead(0); // LM35DZからの温度のデータを読み取る
t0=vref*t0/1024; //
t1、t2については0.1℃単位の表示から1℃単位の表示に変換するため1/10しています。
t1、t2は float型に設定してありますから0.1℃の少数以下の値も表示されます。
t1=vref*analogRead(1)/1024/10; // 読み取った値をmV単位の値に変換する t2=vref*analogRead(2)/1024; //
t3=vref*analogRead(3)/1024/10; //
t4=vref*analogRead(4)/1024; // 測定結果をシリアル・プリントで出力する
td 乾球温度
tw 湿球温度
(1) 乾球温度における飽和水蒸気分圧 Psを乾球温度から求めます。
Ps = 6.11 ×10累乗(7.5×td/(273.3+td))
(2) 湿球温度における飽和水蒸気圧 Pwsを湿球温度から求めます。
Pws = 6.11 ×10累乗(7.5×tw/(273.3+tw)
(3) ペルンターの式で湿球温度における飽和水蒸気圧と湿球温度から現在の
水蒸気圧 Ptを求めます。
Pt = Pws - 0.0012×1013.25×(td-tw)×(1+tw/610);
(4) Pt/Ps×100で相対湿度が求められます。
ここでは td はt1、 tw はt3
Pwsはpst
となっています。
また、ps、pst、pt、ptsは実行部でも型定義ができますので、次に示すように式の左辺で型定義も行っています。
pts 通風乾湿計の場合の計算式で求めた値です。参考のため計算しました。
float ps = 6.11*pow(10,(7.5*t3/(237.3+t3)));
float pst = 6.11*pow(10,(7.5*t1/(237.3+t1)));
float pt = pst - 0.0012*1013.25*(t3-t1)*(1+t1/610);
float pts=pst-0.000662*1013.25*(t3-t1);
int HM =(pt/ps)*100;
int HM2 =(pts/ps)*100;
計算結果をモニタするために、求めた値などをSerial.printで書き出しています。
Serial.print(" t0= "); // わかりやすいように温度の見出しを出力
Serial.print(t0); // t0の温度を送信
Serial.print(" t1 "); // データの区切りのためのスペースを追加し出力
Serial.print(t1); // t1の温度の値を出力
Serial.print(" t2 "); // 温度の見出し
Serial.print(t2); // mVに変換した値、0.1℃単位の温度表示を転送
Serial.print(" t3= "); //
Serial.print(t3); //
Serial.print(" t4= "); //
Serial.print(t4); //
Serial.print(" ps ");
Serial.print(ps);
Serial.print(" pt ");
Serial.print(pt);
Serial.print(" HM ");
Serial.print(HM);
Serial.print(" pts ");
Serial.print(pts);
Serial.print(" HM2 ");
Serial.print(HM2);
Serial.println(); // 改行、行送りを出力
delay(1000); // 時間待ちここでは1秒待っている
}
次回、データの型と桁落ちの関係を具体的にどのようになるか確認してみます。


コメントする