サーミスタ温度計を作ってみた

Category: 電子工作
thumbnail

NTCサーミスタを使用した簡易的な温度計を作ってみました

NTCサーミスタ

サーミスタは温度によって抵抗値が変化する半導体素子です。
NTCはNegative Temperature Coefficient、負温度係数の略で、温度が上がると抵抗値が下がるということです。逆に温度が上がると抵抗値も上がるPTC(Positive Temperature Coefficient)サーミスタもあります。

温度計算

NTCサーミスタの抵抗値は以下の式で表されます。
(温度の単位がケルビンであることに注意)

R1=R2exp(B(1T11T2))R_1 = R_2 \cdot \exp\left(B\cdot\left(\frac{1}{T1}-\frac{1}{T2}\right)\right) R1:温度T1(K)における抵抗値(Ω)R2:基準温度T2(K)における抵抗値(Ω)B:B定数\small { \begin{array}{l} {R_1: 温度T_1(K)における抵抗値(Ω)} \\ {R_2: 基準温度T_2(K)における抵抗値(Ω)} \\ {B: B定数} \end{array} }

これをTについて解くと

1T11T2=ln(R1/R2)B\frac{1}{T_1} - \frac{1}{T_2} = \frac{\ln(R_1/R_2)}{B}

こうなって

T1=1(ln(R1/R2)B+1T2)T_1 = \frac{1}{\left(\frac{\ln(R_1/R_2)}{B} + \frac{1}{T_2}\right)}

こうなります

参考:
TDK NTCサーミスタの⼀般技術情報 https://product.tdk.com/ja/system/files/dam/doc/product/sensor/ntc/ntc_element/general_tech_info/ntc_thermistor_general_technical_information_digest_ja.pdf

使用した部品

  • NTCサーミスタ NCP15XH103F03RC muRata 10kΩ 3380K 1005
  • RaspberryPi Pico2
  • SSD1608 128x64 OLEDディスプレイ

NTCサーミスタは表面実装タイプの物なので自作の変換基板上にはんだ付けしました。

配線

                                3.3V
┌─────────┐    ┌────────────┐    |
│ SSD1306 │    │    Pico    │    ⎕ R 10kΩ
│     SCL ├────┤ IO4   IO26 ├────┤
│     SDA ├────┤ IO5        │    ⎕ NTC 10kΩ/25°C
└─────────┘    └────────────┘    |
                                GND

コード

Arduino環境で開発しました。
U8g2(グラフィックライブラリ)が必要です。

#include <U8g2lib.h>

#define THERMISTOR_PIN 26

const int ADC_BITS = 12;
const int STEPS = 1<<ADC_BITS;
const float REF_V = 3.3;

const int B_CONSTANT = 3380;
const int THERMISTOR_R = 10000;
const int THERMISTOR_T = 25;

const int RESISTOR = 10000;


U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup(){
  analogReadResolution(ADC_BITS);
  u8g2.begin();
  u8g2.setFont(u8g2_font_crox5t_tf);
}

float read_voltage(){
  int result = analogRead(THERMISTOR_PIN);
  float voltage = result * REF_V / STEPS;
  return voltage;
}

float thermistor_V_to_R(float voltage){
  float th_R = (voltage*RESISTOR)/(REF_V-voltage);
  return th_R;
}

float tempture_C(float R_1){
  float T_1 = 1 / (log(R_1/THERMISTOR_R)/B_CONSTANT + (1/(THERMISTOR_T+273.15)));
  float Temp_C = T_1 - 273.15;
  return Temp_C;
}

void draw_temp(float temp){
  u8g2.clearBuffer();
  char temp_buffer[16];
  sprintf(temp_buffer, "%4.2f °C", temp);
  u8g2.drawUTF8(25,40, temp_buffer);
  u8g2.sendBuffer();
}

void loop(){
  float thermistor_V = read_voltage();
  float thermistor_R = thermistor_V_to_R(thermistor_V);
  float tempture = tempture_C(thermistor_R);

  draw_temp(tempture);
  
  delay(1000);
}

完成品

1秒ごとに温度を測定して表示します。

最初は既製品の温度計より5°Cほど高い温度が表示されていましたが、1時間ほど置いておくと+1°Cくらいに落ち着きました。

安定性改善

測定値が不安定で、毎秒ごとに0.5°C以上の変動があるので、5回測定して平均を取るようにしました。

float read_voltage(){
+  int sum = 0;
+  for (int a=0; a<5; a++){
+    sum += analogRead(THERMISTOR_PIN);
+  }
+  float result = sum/5;
-  int result = analogRead(THERMISTOR_PIN);
  float voltage = result * REF_V / STEPS;
  return voltage;
}

多少は改善されましたが、相変わらず0.1の桁はほぼ無意味となっています。

試しにサーミスタを10kΩの抵抗に付け替えてみました。
理論上は25°Cピッタリになるはずですが、結果としては25°Cを中心に値がいつまでも安定せず。
どうやらサーミスタではなくRaspberryPi PicoのADCに問題があるようです。

深掘りしていきたいところですが、今の自分の知識では難しそうなので、とりあえずI2C接続の気温センサーを試してみようと思っています。