Arduinoとサーミスタで温度を測る

サーミスタとは温度によって抵抗値が変化することで電気的に温度を計測するセンサーだ。これをArduinoで利用するには抵抗を付けて分圧した電圧をアナログ入力で計測する。thermistor

サーミスタ(NXFT15XH103FA2B – NTCサーミスタ: 秋月電子通商)を手に入れたが、さて、分圧抵抗値はどのくらいにすれば良いのだろう?

調べると、エレキジャックに詳しい説明が載っていた。

Arduinoとサーミスタで温度を計ってみる(1)

Arduinoとサーミスタで温度を計ってみる(2)

サーミスタの電圧変化ついて式変換を示して結構詳しく書いてある。しかし、これを読んでもどうやって分圧抵抗の値を決めるのかがわからない。この記事(2)では

次に示すようにR1を3.3kにすると、0℃の時にVccの約0.9倍、85℃の時にVccの約0.3倍の出力電圧が得られます。

と書いているが、このR1の抵抗値を導き出した具体的な手順は書いていないのだ。

そこで、表計算で値を探り出すことにした。

arduino_thermistor.ods (OpenOffice)

まず、黄色いセルにサーミスタの仕様データを入れておく。次に、R1(青いセル)の値を色々変えていくと、灰色のセルの値が自動計算されてアナログ入力の電圧レベルのグラフ(縦軸:電圧レベル[10bit]、横軸:温度[℃])が描かれる。

arduino_thermistor_ods

サーミスタの仕様が25℃でR=10kΩなので、同じ10kΩの分圧抵抗を入れてみると0℃でn=760、100℃でn=91となった。水をターゲットにするならこの抵抗値でも良さそうだと確認できた。

実際に温度を計算するプログラムはこのようになる。

void setup(){
  Serial.begin(9600);
}

void loop() {
  Serial.println(calcTemp(analogRead(0)));
  delay(1000);
}

// for thermistor NXFT15XH103FA2B
float B=3452;
float T0=298.15;
float R0=10.0;
float R1=9.88;

int calcTemp(int raw) {
  float rr1,t;
  rr1= R1 * raw / (1024.0 - raw);
  t = 1 / (log(rr1 / R0) / B + (1 / T0));
  return (int)((t - 273.15) * 10.0); //unit 0.1 degree;
}

calcTemp()は引数rawにanalogRead()の値を取り、計算した温度を取り扱いを簡単にするために10倍して0.1℃の単位で切り捨ててintで返している。

引数R0、R1は簡単のためにkΩ単位で計算している。R1は分圧抵抗値であり、10kΩのはずだが、実際に利用した抵抗をテスターで測ったところ9.88kΩだったのでそれを入れた。抵抗は大抵1%くらい誤差がある。100Ω違うと温度の値にかなり影響するので、このR1の値は後から調整できるようにプログラムしたほうが良い。

上記のプログラムでは、シリアル接続したターミナルに1秒毎に温度を10倍した値をセ氏で書き込む。測定値の検証は体温計と比較するのが一番手軽だ。体温計とサーミスタを脇に挟んで、1/10℃のレベルで同じ温度が得られたら合格となる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です