乾湿球湿度計の計算処理の組み込み
  乾湿球湿度計の読みから、湿度を求めます。前回示した計算式は気象庁の気象観測の手引きの湿度を求める表を作るために使用している式です。
 湿度の計算は小数点を伴うデータがありますので、変数は浮動小数点型として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秒待っている
}

 

adr370010.jpg Arduino IDEに入力したスケッチと、モニタした結果が表示されています。湿度が74%くらいになっています。

 次回、データの型と桁落ちの関係を具体的にどのようになるか確認してみます。
<神崎康宏>

トラックバック(0)

このブログ記事を参照しているブログ一覧: 連載(37-1)Arduinoで何でも制御 湿度の値を算出する

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/2842

コメントする

カテゴリ

このブログ記事について

このページは、kanzakiが2009年4月24日 13:46に書いたブログ記事です。

ひとつ前のブログ記事は「連載(13)縫って作るコンピュータ LilyPad Arduino」です。

次のブログ記事は「連載(14)縫って作るコンピュータ LilyPad Arduino」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.