温度湿度センサーの利用

HSM-20G はアナログ出力の温度と湿度のセンサーです。湿度(相対)の値は温度によって変化するため、多くの湿度センサーは温度センサー機能も内蔵しています。湿度の測定原理は明示されていませんが、高分子抵抗を利用していると思われます。温度は温度で抵抗値が変化するサーミスタを利用しています。

  1. 温湿度センサーモジュールHSM-20G

     HSM-20G はアナログ出力の温度と湿度のセンサーで、概要は以下のようです。

    ・動作電圧: DC5.0V(±0.2V)
    ・最大動作電流: 2mA
    ・温度測定範囲: 0℃〜+50℃
    ・温度測定:抵抗変化 158kΩ(0℃)〜12kΩ(60℃)
    ・湿度: 電圧出力タイプ
    ・測定精度: ±5%(RH)
    ・湿度出力信号電圧: DC1.0V〜3.0V
    ・湿度測定範囲: 20〜95%



     動作電圧:5.0V、動作電流:2mA、温湿度共にアナログ出力です。

  2. 温度

     温度の変化はサーミスタを利用しています。ここで利用しているサーミスタは、ニッケル、マンガン、コバルト、鉄などの酸化物を混合して焼結したもので、温度が上がると抵抗が下がります。サーミスタは通常温度25度で抵抗値が校正されており、25度における温度精度は±0.3度です。
     下の図は縦軸が抵抗、横軸が温度です。サーミスタは非直線的な変化をします。25度の時の抵抗値は校正されておりこのセンサーでは47kです。

         抵抗ー温度

  3. 湿度

     この湿度センサーの原理は不明ですが、多孔質の吸湿性の高分子膜を用いると思われます。Y軸がセンサーの出力電圧、X軸が湿度(相対で10%目盛)です。20%-80% の間はほぼ直線的に変化します。電圧と湿度の表がありますから、これを用いて、相対湿度を求めます。

         湿度とセンサー電圧

  4. 線形近似

     どちらも直線的な変化ではないので、表の各区間で線形近似します。湿度(相対)の場合、出力電圧が  v = 1.7V であれば、湿度は40%から50%の間になります。この範囲では、直線的に変化すると考えて湿度を計算します。 具体的には (v-1.68)* 10/(2.02-1.68) で 40-50 の間の湿度差を求め、これに 40 を加えて、湿度を計算します。

      AD変換値ー湿度表
    湿度 10 20 30 40 50 60 70 80 90
    電圧 0.74 0.95 1.31 1.68 2.02 2.37 2.69 2.99 3.19

      温度はサーミスタの抵抗から求められます。測定範囲は0-60度とします。各温度に対応する抵抗値を表に纏めます。湿度の場合とどうよう、抵抗の値から、表の範囲を求め、区間内で線形補間します。

      抵抗ー温度表 
    温度 0 10 20 30 40 50 60
    抵抗 158 94 58 47 38 25 17

  5. 回路接続

    端子は4ピンのコネクタ接続になります。写真で右下から 1ピン:温度出力(白)、2ピン:GND、3:湿度出力、4:電源(5V:オレンジ)です。湿度出力には100kの抵抗と40μFのコンデンサーをつける、温度センサーには10kの抵抗を直列に接続することが推奨されています。左の回路図で左の端子がUNO、右の端子がHSM-20Gです。 ● のない交差は接続しません。
     温度センサーの抵抗は内部で5Vに接続されています。外部で10kの抵抗を接続し、この中間点の電圧を A1 で AD変換します。
       
         接続回路                    温度センサーの回路


  6. 音湿度センサープログラム

     湿度と温度の表を配列 humt[] と tmpt[] に記録します。湿度の場合、あらかじめ。出力電圧を AD変換値に換算しています。humt[0] の値 152 は 出力電圧 0.74V に相当します。tempt[] は各温度に対応する抵抗の値です。
     温度、湿度共に10回計測しその平均値を valh に求めます。湿度の場合、valh から humt[] を用いて、map() 関数で線形補間します。最初の 10 は 湿度の最低値です。9 は表のサイズ、最後の 10 は表の列当たりの湿度差です。
      hum = map(valh,10,humt,9,10);
     map() では、まず、valh が humt[] の値より最初に大きくなる列を求めます。この列と次の列との間で線形補間をします。
     温度の場合、まず、平均値 valt を求め、これを電圧 vt に変換後、さらに抵抗値 rg に変換します。温度センサーの抵抗値 rg は 10kΩと直列ですから、 10・(5/( rg +10)) = vt になります。したがって次のように計算できます。
      float rg=(5.0*10.0)/float(vt)-10;
      rg から、湿度の場合と同様 tempt[] を利用して、線形補間を行います。
     
    //温度はサーミスタなので非線形、湿度も線形ではない
    //表を利用し、部分線形補間を行う
    int i;
    int tm,num;
    int vd[4];
    //10%から90%までのAD変換値と湿度
    unsigned int humt[]={152,195,266,344,413,485,550,612,653};
    //60度から度までの抵抗の値と温度
    //unsigned long tmpt[]={158,94,58,47,38,25,17};
    unsigned int tmpt[]={17,25,38,59,95,158};//60-0
      int hum,tmp;
      long sum;
      int valt,valh;
      char string[40];
     
    void setup(){
    tm=0;
    Serial.begin(9600);
    }
    
    //valの値をary[]の値で補間する、表の先頭に対応する値をv0,
    //変化する値をgap 範囲外の場合99を返す
    int map(unsigned  val,unsigned  v0,unsigned int ary[],int num,int gap){
      float diff;
      int rval;
      if(val<ary[0]) return 99;
      if(val>ary[num-1]) return 99;
      for(i=1;i<num;i++){
        if(val<ary[i]){
          diff=ary[i]-ary[i-1];
          rval=v0+(i-1)*gap+(unsigned int)((float)(val-ary[i-1])*gap/diff);
          break;
        }
      }
      return rval;
    }
    
    void loop(){
         int tmp;
         sum=0;
         for(i=0;i<10;i++){
           tmp= analogRead(A0);//AD変換する      
           sum+=tmp;
           delay(10);
         }
         valh=sum/10;//平均値
         //Serial.println(valh);
        //湿度変換
         hum = map(valh,10,humt,9,10);
    
         sum=0;
         for(i=0;i<10;i++){
            sum += analogRead(A1);//AD変換する
           delay(10);
         }
         valt=sum/10;//平均値
         //電圧に変換
         float vt=(5.0/1024.0)*valt;
         //Serial.print("vt:");
         //Serial.println(vt);
         //抵抗値に変換
         float rg=(5.0*10.0)/float(vt)-10;
         Serial.print("rg:");
         Serial.println(rg);
        
        //温度変換
         tmp = map((int)rg,50,tmpt,6,-10);
        sprintf(string,"tmp=%2u,hum=%2u\n", tmp,hum);
        Serial.print(string);
    
        delay(1000);
    }
    
    ///実行結果
    rg:61.11
    tmp=20,hum=60
    rg:61.11
    tmp=20,hum=60
    rg:61.11
    

  7. 発展

     
    1. アナログ出力のセンサーにはどんなものがありますか?

       10cm程度の距離を測定する赤外線距離センサ(GP2Y0A21YK)、)、3軸加速度センサー(KXR-94))、圧力センサー(FSR402)などがあります。
       
       距離センサー               圧力センサー

      距離センサーは非線形ですから、温湿度センサーとどうよう、補間計算が必要です。

    2. 測定データの校正はどのように行いますか?

       正確な校正用測定器が必要になります。出力が直線的でない場合、この例のように測定点を直線で接続し、部分的な直線補間をします。

    3. もう少し精度の高いセンサーはありませんか?

       SHT11 はシリアル出力の温湿度センサーで、温度精度 0.4度、湿度精度 3.5% です。
       
       ディジタル出力温湿度センサー