スタインハート式を使ったサーミスタの温度校正のやり方|Arduino・ESP32
はじめに
この記事はArduinoとサーミスタで温度測定で使ったサーミスタの温度校正のやり方を解説します。前回はB定数を使った近似式を利用しましたが、実際やってみますとなかなか基準温度計との温度が合いませんでした。そこで今回は3点の温度地点(3温度試験点)での抵抗値を測定して、スタインハート式で温度校正する方法をご紹介いたします。
難しい理屈は分からなくても、3温度試験点の抵抗値が分かれば校正できますので恐れずに試してみてください^^ スタインハート式で温度校正することで、基準温度計とほぼ同じ値を表示させることが可能になります。
なお、Arduinoとサーミスタの配線方法は解説してません。こちらの記事をご覧ください。
つかうもの
この記事でつかうものをご紹介いたします。Arduinoでサーミスタを使えるようになっていれば、基準温度計以外とくに必要はありません。基準温度計は料理で使う温度計で十分です
サーミスタ
25℃でサーミスタ抵抗が10kΩになる 103JT-050 や 103AT-11 を使ってます。本記事の内容は他のサーミスタでも同じ方法で校正できます。
Arduino
ADコンバータが内蔵されているArduinoであればお好きなもので構いません。
もしまだArduinoをお持ちでないようでしたら、おすすめArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご覧ください。
基準温度計
3温度試験点を測定するために、基準となる温度計が必要です。もちろん基準温度計が狂っていたら元も子もありませんが、料理などで使える温度計は比較的信頼できます。なぜなら、水の沸点は100℃、氷水の温度は0℃であることを確かめることができるからです。
スタインハート式
$${\displaystyle {\frac {1}{T}}=A+B\ln R_t+C(\ln R_t)^{3}}$$
A、B、Cは3点温度の抵抗値より決定される定数です。また、Rtはその瞬間のサーミスタの抵抗値[Ω]、Tは温度[K(ケルビン)]です。
ただし、定数A、B、Cを計算するために、かなりややこしい計算が必要になります。ここでは サーミスタのSteinhart-Hartパラメータ算出 のサイトを利用させてもらい、3点の温度と抵抗値だけを入力して定数A、B、Cを算出しました。より詳しい数式を知りたい方は、 Steinhart–Hart equation (英語版のWikipedia) をご覧ください。
3温度試験点での抵抗値の測定方法
測定した3点の温度と抵抗値を、 サーミスタのSteinhart-Hartパラメータ算出 のサイトで入力して定数A、B、Cを算出してください。3点の温度は、氷水、水道水(または常温の水)、沸騰したお湯を使うと便利です。
また抵抗値の測定は、テスターを使わずにESP32のADコンバータからプログラミングによって導き出します。そうすることで、ADコンバータや抵抗値の精度をある程度緩和する狙いがあります。次の写真は、スタインハート式を使って校正された温度測定の様子です。ご覧の通り、基準温度計とほぼ同じ値を示すように校正できました。
▼ こちらはDHT22やThermoProの室内温度計と照らし合わせながらチェックしている様子です。サーミスタの校正がここまで精度高くなると、今度はDHT22の温度校正の方が問題になってきました^^;
103AT-11の実測値
例として、サーミスタ103AT-11とESP32を使って温度3点における抵抗値の測定結果を記します。
温度[℃] | 抵抗値[Ω] |
---|---|
0.8 | 20000.00 |
11.2 | 13430.0 |
101.8 | 534.0 |
これより、定数は次のとおり導き出されました。
定数 | 値 |
---|---|
A | 0.00173842581 |
B | 0.00011745478 |
C | 0.00000077076524 |
スタインハート式を使った温度測定のソースコード
スタインハート式を使った温度測定のソースコードの一部をご紹介いたします。Arduino言語(C++)で動きます。ESP32のための関数なので、ADコンバータの分解能に注意してください。Arduino Unoなどで使う場合は、4096.0 を 1024.0 へ置き換えてください。
float calcTemp() {
float divider = 10000.0; // 分圧抵抗10kΩ
float aout = float(analogRead(SENSOR_PIN));
float OFFSET_RT = 0;
float Rt = OFFSET_RT + divider * aout / (4096.0 - aout);
Serial.print("Rt: ");
Serial.println(Rt);
/**
* @brief 103AT-11の実測値
* 0.8*C = 20000.00 (103AT-11)
* 11.2*C = 13430.0 (103AT-11)
* 101.8*C = 534 (103AT-11)
*/
float THERM_T0 = 273.15;
float THERM_R0 = 27280.0;
float THERM_A = 0.00173842581;
float THERM_B = 0.00011745478;
float THERM_C = 0.00000077076524;
float T_bar = THERM_A + THERM_B * log(Rt) + THERM_C * pow(log(Rt), 3);
return 1.0 / T_bar - 273.15;
}
スタインハート式を使って校正されたサーミスタの温度測定の動画
動画はYouTubeの アイデアノート channel で公開中です。
この記事が参考になりましたら
シェアをよろしくお願いします!
\