温度センサー

ここでは、AD変換機能と半導体温度センサーを利用して、室温の計測を試みます。半導体温度センサーは温度に対応する電圧を出力するため、組み込みは容易ですが、精度を高めるためには「校正」や「アナログ参照電圧」の設定などが必要になります。

  1. 半導体温度センサー(MCP9700)

     室温を手軽に計測する温度センサーとして各種の半導体センサーが市販されています。MCP9701 は以下のように温度に対応して、電圧を出力する半導体です。

     電源電圧 2.3〜5.5V
     測定範囲 -40〜125度
     0度での出力 500mV
     温度変化 10.0mV/度
     精度 ±4度

     温度が t のときの出力電圧は v = 10 * t + 500 となります。温度が 25度のときは、10.0*25+400=650mV になります。また、-10度のときは、10.0*(-10)+400=300.0mV になります。電源が + のみの場合 - の電圧は出せませんから、0度の出力を500mV に「かさ上げ」し、負の時は 500mV 以下の電圧を出します。
     精度は余り良くありませんが、これは、部品による個体差が大きいためで、「校正」をすることで、ある程度精度を上げることができます。

  2. 接続回路

     MCP9700は3端子のデバイスで文字が見える方向にみたとき、左から 電源+(Vdd)、出力端子(Vout)、電源ー(GND)、となります。電源を接続し、Vout を UNO のアナログ入力端子 A0 に接続します。
     
      MCP9700                     温度センサー回路図

  3. プログラム(MCP9700温度センサー)

     AD 変換した値(sv)を温度に変換するには、まず、sv を mV 単位の電圧に変換します。変換値が 1024 のとき 5000mVですから、変換値 sv の電圧は tmv=(5000.0/1024.0)*sv; となります。この計算は 小数(float)で行います。tmv から 0度 の値 500 を引き、10 で割れば温度になります。 
    //tmp9700_ref
    //MCP9700温度センサー
    
    int sensorPin = A0;    // select the input pin for the potentiometer
    int ledPin = 13;      // select the pin for the LED
    int sv = 0;  // variable to store the value coming from the sensor
    int tmp;
    
    void setup() {
      Serial.begin(9600);  
    }
    
    void loop() {
      // read the value from the sensor:
      float tmv;
      int tmp;
      sv = analogRead(sensorPin);    
      Serial.println(sv);
      tmv=(5000.0/1024.0)*sv;
      Serial.println(tmv);
      tmp=(tmv-500)/10;
      //Serial.println(tmv);
      Serial.print("tmp=");
      Serial.println(tmp);
      delay(500);             
    }
    
    ///結果1
    154
    751.95
    tmp=25
    
    
    ///結果2
    151
    737.30
    tmp=23
    
    
     これで仕様から保証される温度範囲は ±4度 です。この場合、21度から29度の範囲ということになります。この誤差は 温度から出力を計算するときのパラメータの、10、500 が部品により異なるためです。
     v = 10 * t + 500
     温度は通常25度で校正します。仕様書では 温度が0度のとき 出力 0、25度の温度が 25 になるよう係数を調整すれば、「0度から70度の範囲で、誤差の範囲は 0.5度 とすることができる」とのことです。

  4. アナログ参照電圧を利用

     AD変換するときのアナログ電圧の最大値は 5V でした。しかしMCP9700は温度が40度でも 800mV の出力になります。5VのときAD変換値は最大で1024ですから、0.8V では AD変換値は 163 になります。このままでは、AD変換機能の2割弱しか利用できないことになります。逆にいえば、ディジタル値の小さな変化で、結果の温度は大きく変化します。
     実は、Arduino のAD変換機能には、内部参照電圧機能が用意されています。これは、本体の電圧(UNOの場合5V)とは別に、内部や外部から設定したアナログ参照電圧を最大電圧としてAD変換する機能です。Arduino UNO の場合、内部参照電圧は 1.10V です。MCP9700の場合、温度が50度でも最大電圧は1V程度ですから、室内温度に限定すれば、内部参照電圧が利用できます。内部参照電圧の利用には次のような設定をします。
      analogReference(INTERNAL);
     INTERNAL の替わりに DEFAULT とすれば 5V、EXTERNAL とすると、外部端子(UNOの場合、ディジタル13番端子の二つ上にあるAREF端子)で設定した電圧を参照電圧とします。この機能を利用すると、アナログ入力の値は室温で 680 に増加します。
    //MCP9700温度センサー
    //アナログ参照電圧利用
    int sensorPin = A0;    // select the input pin for the potentiometer
    int ledPin = 13;      // select the pin for the LED
    int sv = 0;  // variable to store the value coming from the sensor
    int tmp;
    void setup() {
      Serial.begin(9600);
      analogReference(INTERNAL); //内部1.1V 
    }
    
    void loop() {
      // read the value from the sensor:
      float tmv;
      int tmp;
      sv = analogRead(sensorPin);    
      Serial.println(sv);
      tmv=(1100.0/1024.0)*sv;
      Serial.println(tmv);
      tmp=(tmv-500)/10;
      //Serial.println(tmv);
      Serial.print("tmp=");
      Serial.println(tmp);
      delay(500);             
    }
    
    ///
    681
    731.54
    tmp=23
    680
    730.47
    tmp=23
    
    

  5. 発展

    1. もっと高精度な温度センサーはありませんか

       後の章で 精度 ±0.4 度 のディジタル接続の温度センサ を紹介します。 

    2. どんな応用がありますか

       計測した温度を表示すれば、実用的な温度表示装置が出来上がります。少しプログラムを工夫すれば、最高と最低の温度を記録・表示したり、一日の温度変化を記録・表示することもできます。

    3. AD変換の値は電源電圧で変化しますか?

       AD変換は電源の電圧が変化すると、変換した値も変化します。「内部リファレンス電圧」は電源電圧に関わらず一定電圧を出しましから、精度の面でもおすすめです。