次に示す、サーミスタによる温度測定の回路にに基づいてセンサの出力電圧から温度を求めるArduinoのスケッチを作成します。Arduinoを使用せずに温度を測定する場合は、電源電圧とR1の抵抗値を調整し、温度を測定する範囲内で出力電圧と温度の関係の直線性が良く、目的とする温度の差が検出でき、マイコンのアナログ入力の分解能で読み取れるだけの感度が得られるようにします。
 今回は、Arduino とサーミスタの特性式に基づいて計算しますので、出力電圧と温度の関係の直線性については気にしていません。
 測定範囲内でできるだけ大きな出力電圧の変化が得られることと、サーミスタの自己加熱を防止するために可能な限り電流が小さくなるようにしています。
 103ATではデータシートから25℃のときの抵抗値が10kΩ、0℃で28kΩ、85℃で1.45kΩとなっています。次に示すようにR1を3.3kにすると、0℃の時にVccの約0.9倍、85℃の時にVccの約0.3倍の出力電圧が得られます。電流も5Vの電源で1.05mA位でサーミスタの消費電力も 1.6mWになります。
 電源電圧はArduinoと同じ電源電圧として5Vとし、R1の抵抗値は消費電力、出力電圧の範囲から3.3kΩとしました。

adrsens110010.jpg

出力電庄からサーミスタの抵抗値を求める
 電源電圧、出力電圧の次の比にR1の値を乗算してサーミスタの抵抗値を求めます。
       Vout/(Vcc-Vout)               ---(4)
 出力電圧は、Arduinoのアナログ入力値nから次の式で電圧を求めます。
                Vout=n×Vcc/1024             ---(5)
                       Vccは基準電圧
 そのため(4)は次のようになります。
         n×Vcc/1024/(Vcc‐n×Vcc/1024)
       =n/(1024‐n)

サーミスタの抵抗値
 サーミスタの抵抗値Rは次の式で得られます。
       R==n/(1024‐n)
 あとは、次の式で温度を計算すれば、サーミスタで温度T(絶対温度)の測定ができます。
        T=1/(ln(R/R0)/B + (1/T0))        ------(6)


Arduinoのスケッチ
  LCDに測定結果を表示しますので最初にLCDライブラリを読み込むための#include を記述し、次ぎのLiquidCrystal lcd(2,3,4,5,6,7);ArduinoとLCDモジュールの配線方法を指定します。

#include<LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);

 次に、実数としてBでサーミスタのB定数、T0で25度の絶対温度293.15を設定し、この温度の時のサーミスタの抵抗値R0が10kΩであることを示します。抵抗の値はkΩの単位となっています。そのあと、R1の抵抗値をディジタル・マルチメータで測定した値、実測抵抗値の32.5kΩを指定しています。rr1は測定時のサーミスタの抵抗値、tは測定された絶対温度の測定値がセットされます。以上の定数、変数はfloat型にしてあります。
 この他にINT型のアナログ入力値nが定義され変数・定数の定義を終えます。

float B=3435,T0=298.15,R0=10.0,R1=3.25,rr1,t;
int n;

 次の、setup()関数でシリアル関数の初期化を行っています。デバッグ時にPCに経過を送信するためのものです。LCDに途中経過も表示していますので、必要なければ削除してもかまいません。 lcd.begin(16,2); の命令はLCDを16文字2行表示にするためのものです。この命令を実行しないとLCDの表示が2行になりません。

void setup(){
Serial.begin(9600);
lcd.begin(16,2); }
void loop(){
n=analogRead(1);


 最初にアナログ・ポート1に接続されたサーミスタの出力を読み取ります。サーミスタの出力から次ぎの式で、サーミスタの抵抗値をrr1にセットします。

rr1=R1*n/(1024.0-n);

   rr1に求められたサーミスタの抵抗値を用いて、次の命令で温度を求めtにセットします。
 式の中のlogは常用対数の関数でなく通常lnで表示されている自然対数の関数を示します。常用対数はlog10()として別に用意されています。これはC言語の仕様のようです。
t=1/(log(rr1/R0)/B+(1/T0));

 以上で温度の計測が完了したので、次のスケッチでLCDへの表示を行います。

lcd.clear();
lcd.print("n=");
lcd.print(n);
lcd.print(" rr1=");
lcd.print(rr1);
lcd.setCursor(0,1);
lcd.print("temp=");
lcd.print(t-273.15);
delay(500);
}


 delay(500)で少しタイムラグを置きながら繰り返します。完成したスケッチを次に示します。


adrsens110020.jpg このスケッチで実際に気温を測定している様子を次に示します。

adrsens110030.jpg Arduinoでは対数計算も問題なく対応できるので、サーミスタの測定値から数行の計算で温度が求まります。
<神崎康宏>


トラックバック(0)

このブログ記事を参照しているブログ一覧: Arduinoとサーミスタで温度を計ってみる(2)

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







newハイパー・マイコンmbedでインターネット電子工作


マイコンと電子工作 No.6


マイコンと電子工作 No.4


マイコンと電子工作No.1
サポート・ページはこちら