今回は熱電対を使って温度計を作ってみます。
異なる2種類の金属線をつないで、二つの接した部分に温度差を与えると電圧が発生します。この現象をゼーベック効果といいます。熱電対とはこの現象を利用したセンサで、一端の温度が分かれば発生する電圧と既知の金属の特性からもう一方の接点の温度を求めることができます。
絶対的な温度を計る場合は熱電対の測定に使う接点を温接点、端子側を基準接点とし、その温度(基準接点温度)を測り測定点の温度を求める必要があります。基準接点温度を測定するときはサーミスタや測温抵抗体などを使います。
試作には秋月電子で購入したK型熱電対ステンレス管タイプを使いました。この熱電対は-200℃~+600℃の広範囲の温度を測定することができます。温度差1℃当たり約40.7μVの起電力が発生します。
RaspberryHabuのアナログポートに入力するには電圧変化が小さすぎるのでオペアンプで増幅します。一般的に信号を増幅するためによく使われるLM358では誤差が大きすぎるので今回は精度の高いオペアンプNJM2119Dの1回路分を使い、1kΩと100kΩの抵抗で100倍に増幅し、RaspberryHabuのアナログ1番ピンに入力しました。NJM2119Dは秋月電子で手に入ります。
熱電対の端子は商品では樹脂の端子がついていますが、ブレッドボードに指すために分解してあります。ケーブルは単芯なので被膜を取るだけでブレッドボードにさせます。
写真は2か所の温度を計るため熱電対を2つ使い、2チャンネル分の回路を作っています。
熱電対の出力はアナログなのでRaspberryHabuBasicのアナログ入力ピンからMCP3008を通してSPIでRaspberryPiに入力します。
以下のコードはサーミスタも使い室温を出したうえで熱電対で測定した結果の温度差を足して計測対象の温度を出しています。
// thermocouple.c sample program for RaspberryHABU // Licence CC 0 ( Public Domain ) #include "stdio.h" #include "stdlib.h" #include "wiringPi.h" #include "unistd.h" #define SPIBUFFSIZE 256 #define THERMISTORCHANNEL 7 #define THERMISTOR 10000 // 10k ohm #define B 3380 // #define DIVR 10000 // 10k ohm unsigned char spidata[SPIBUFFSIZE]; int MCP3008Read( int channel ){ int spireturn,data; spidata[0]= 1; spidata[1]= ( 0x80 | channel << 4 ) ; spidata[2]= 0; spireturn = wiringPiSPIDataRW( 0, spidata , SPIBUFFSIZE ); data = ((spidata[1]&3) << 8) + spidata[2]; return(data); } int main() { int spiresult,spiresult7; double thermistor_r,baseTemp,TCTemp,t1; if ( -1 == wiringPiSPISetup(0,1000000) ) { printf("SPI setup error!"); exit(1); } while (1){ spiresult7=MCP3008Read(THERMISTORCHANNEL); thermistor_r = ( DIVR * spiresult7 )/ (1024 -spiresult7 ); // thermistor is lower t1 = log( thermistor_r / THERMISTOR ) ; baseTemp = ((298*B) / ( B + ( 298 * t1 ))) - 273; spiresult=MCP3008Read(0); TCTemp = (3.3/1024.0*(double)spiresult*1.010)/0.00407; printf("temp: %3.f c (room temp: %3.f c : A0 value0 %d)\n",TCTemp+baseTemp,baseTemp,spiresult); sleep(10); } }
入力した値はAD変換され10bitのデータとしてRaspberryPiに入力されます。その値は3.3Vを10bit(1024)分割された値なので1Vあたりの数値を出し、それを40.7μVで割ることで温度差を出しています。NJM2119Dは5V電源を試用していますが、出力は4V程度までしか出ないため、1.01をかけて補正してあります。
上記のプログラムとは出力が違いますが、別の実験で熱電対と基準接点温度を測定するためにサーミスタを使ったときの出力結果は以下のようになりました。この実験ではコップのお湯の温度を測ってみました。
今回使ったK型熱電対は対温度性が1250℃(樹脂の端子カバーを残して使う場合は600℃)と高いのでオーブン作ったりリフロー機作ったりできそうですね。