マイコンで温度を測りたい、でもサーミスタの変換が面倒すぎる
ArduinoやESP32で温度を測ろうとして、サーミスタを買ってきた。接続してanalogRead()で値を取得するところまでは順調だった。しかし、そこから先が問題だ。ADCの生値を温度に変換するには、B定数やSteinhart-Hart方程式の知識が必要になる。データシートの表を見ながら電卓を叩く作業は、正直かなりしんどい。
このツールは、NTCサーミスタの温度⇔抵抗値の相互変換をブラウザ上で即座に行える。B定数方式とSteinhart-Hart方程式の両方に対応し、ADC分圧回路の変換やルックアップテーブルの自動生成までカバーしている。
なぜサーミスタ温度⇔抵抗変換ツールを作ったのか
毎回データシートを引っ張り出す手間
サーミスタを使うたびに、データシートの温度-抵抗対応表を探し、必要な温度範囲の値を手動で拾う作業を繰り返していた。10kΩ NTCなら情報は豊富だが、100kΩや4.7kΩのサーミスタになると、対応表がPDFの奥深くに埋もれていて探すだけで時間がかかる。
さらに厄介なのがADC値からの温度変換だ。analogRead()の値を温度に変換するコードをArduinoスケッチに書くとき、B定数方式の式を毎回調べ直す。符号を間違えて摂氏マイナス200度とかの異常値が出て、30分デバッグした経験は一度や二度ではない。
こだわった設計判断
B定数とSteinhart-Hartの切り替えを最初から搭載した。ホビーユースならB定数で十分だが、3Dプリンタのヘッド温度制御や工業用途では±0.15℃の精度が求められることがある。1つのツールで両方試せれば、精度の違いを実感できる。
ルックアップテーブルの自動生成にもこだわった。マイコンのFlashにテーブルを焼き込む実装は、浮動小数点演算を省略できるため高速で省メモリだ。CSVコピー機能で、そのままスプレッドシートやCコードに貼り付けられるようにした。
NTCサーミスタとは何か — 温度で抵抗値が変わる素子
NTCサーミスタの基本原理
サーミスタ(thermistor)は「thermal resistor」の略で、温度によって抵抗値が大きく変化する半導体素子だ。NTC(Negative Temperature Coefficient)サーミスタは温度が上がると抵抗値が下がる特性を持つ。身近な例でいえば、冬の朝にエンジンをかけたとき、水温計がゆっくり上がっていくあの動き。エンジン冷却水の温度センサにもNTCサーミスタが使われている。
対照的にPTC(Positive Temperature Coefficient)サーミスタは温度上昇で抵抗値が上がる。こちらは過電流保護のヒューズ代わりに使われることが多い。
B定数方程式とは
B定数(Beta定数)方程式は、NTCサーミスタの温度-抵抗関係を2つのパラメータで近似する簡易式だ。
R(T) = R25 × exp(B × (1/T − 1/298.15))
T(R) = 1 / (1/298.15 + ln(R/R25)/B) − 273.15
- R25: 25℃における抵抗値(公称値。10kΩが最も一般的)
- B: B定数(ケルビン単位。一般的なNTCでは3000〜4500K)
- T: 絶対温度(ケルビン)
B定数方式は25℃付近では高精度だが、広い温度範囲(50℃以上の幅)では誤差が±1〜3℃に拡大する。
Steinhart-Hart方程式とは
Steinhart-Hart方程式は1968年にJohn SteinhartとStanley Hartが発表した、より高精度な温度-抵抗変換式だ(Wikipedia: Steinhart-Hart equation)。
1/T = A + B × ln(R) + C × (ln(R))³
3つの係数(A, B, C)を使うことで、-50℃〜+300℃の広範囲で±0.15℃の精度を実現する。係数はデータシートに記載されていることもあるし、3点の温度-抵抗データから連立方程式を解いて算出することもできる。
なぜNTCが選ばれるのか
NTCサーミスタが広く使われる理由は、コストの安さと感度の高さだ。1個数十円で入手でき、温度変化に対する抵抗変化率が熱電対やRTD(白金測温抵抗体)より大きいため、マイコンのADCで直接読み取りやすい。
温度変換の精度が設計品質を左右する
誤差が招く実害
サーミスタの温度変換を間違えると、具体的にどんな問題が起きるか。
3Dプリンタのノズル温度制御: PLAフィラメントの適正温度は190〜220℃。温度読みが5℃ずれるだけで、フィラメントが溶け残って詰まったり、逆に過加熱で糸引きが悪化する。温度制御が不安定になると印刷物の層間接着強度にも影響し、機械部品として使えなくなる。
食品安全: HACCP管理で冷蔵庫の温度を監視するセンサにサーミスタを使う場合、2℃の誤差は致命的だ。食品衛生法では冷蔵は10℃以下、冷凍は-15℃以下が規定されている。センサの誤差が基準超過を見逃せば、食中毒のリスクに直結する。
工業プロセス: 半導体製造の温度管理では±0.5℃の制御が求められる工程がある。B定数方式の±1〜3℃では不十分で、Steinhart-Hart方程式か、そもそもRTDを使うべきだ。
B定数とSteinhart-Hartの精度差を理解する
25℃付近(±15℃程度)の狭い範囲では両者の差はほぼない。しかし-40℃〜+125℃のフルレンジでは、B定数方式は特に低温域で誤差が拡大する。データシートのB定数は通常25-50℃間または25-85℃間で測定されており、この範囲外では近似精度が保証されない。
ADC値から温度を出したい場面で使える
マイコン温度計の設計
ArduinoやESP32でサーミスタ温度計を作るとき、ADC値→温度の変換式を組み込む必要がある。このツールでADC値モードを使えば、回路定数(プルアップ抵抗、基準電圧、ADC分解能)を入力するだけで変換結果を確認できる。
3Dプリンタのファームウェアカスタマイズ
MarlinやKlipperのサーミスタテーブルをカスタム品に差し替えたいとき、ルックアップテーブル生成が役立つ。温度範囲と刻み幅を指定してCSVを出力し、ファームウェアの設定ファイルに貼り付けるだけでよい。
IoTセンサノードの校正確認
量産前のプロトタイプで、サーミスタの読み値が期待通りかを検証する場面。既知の温度環境(氷水0℃、沸騰水100℃)で実測したADC値をこのツールに入力し、計算値と比較すれば校正の妥当性を確認できる。
HVAC(空調)制御の設計検証
空調制御システムで室温センサにNTCサーミスタを使う場合、分圧回路の設計段階で感度(1℃あたりのADC変化量)を確認したい。ルックアップテーブルで温度範囲全体のADC値分布を見れば、分解能が十分かを判断できる。
基本の使い方
3ステップで温度⇔抵抗値を変換できる。
Step 1: 変換モードを選択する
「温度→抵抗」「抵抗→温度」「ADC値→温度」の3モードから選ぶ。Arduino等でanalogRead()の値を温度に変えたいなら「ADC値→温度」を選択してみて。
Step 2: サーミスタのパラメータを入力する
プリセットから選ぶか、手持ちのサーミスタのR25・B定数を入力する。より高精度が必要ならSteinhart-Hart方程式に切り替えて係数を入力すればOK。
Step 3: 結果を確認してテーブルを出力する
変換結果がリアルタイムで表示される。温度-抵抗特性曲線のグラフで全体像を把握し、必要ならルックアップテーブルをCSVでコピーしてファームウェアやスプレッドシートに貼り付ける。
具体的な使用例 — 6つのケースで検証
ケース1: Arduino温度計の基本変換
10kΩ NTC (B=3950) をArduino (5V/10bit) に接続。プルアップ抵抗10kΩ。
入力値:
- モード: ADC値 → 温度
- ADC読み値: 512
- プラットフォーム: Arduino (5V / 10bit)
計算結果:
- 抵抗値: 10,058.7 Ω
- 温度: 24.85℃
→ 解釈: ADC値512(ちょうど中点)はプルアップ抵抗とサーミスタがほぼ等しい、つまり25℃付近ということ。R25=10kΩのサーミスタなので理にかなっている。
ケース2: ESP32で高温測定
100kΩ NTC (B=3950) をESP32 (3.3V/12bit) に接続。プルアップ100kΩ。
入力値:
- モード: 温度 → 抵抗
- 温度: 150℃
計算結果:
- 抵抗値: 約 674.6 Ω
→ 解釈: 150℃では抵抗値が公称値の約1/148に急落する。NTCの指数関数的な特性が顕著に表れるケース。この温度域ではSteinhart-Hart方程式を使うべきだ。
ケース3: 3Dプリンタのホットエンド温度
10kΩ NTC (B=3950)、Steinhart-Hart方程式で230℃を変換。
入力値:
- モード: 温度 → 抵抗
- 方程式: Steinhart-Hart(デフォルト係数)
- 温度: 230℃
計算結果:
- 抵抗値: 約 83.8 Ω
→ 解釈: 230℃はPETGやABSの印刷温度。抵抗値が100Ω以下まで下がるため、配線抵抗やコネクタ接触抵抗の影響が無視できなくなる。4線式測定の検討が必要。
ケース4: 冷凍庫の温度監視
10kΩ NTC (B=3950) で-20℃を測定。
入力値:
- モード: 温度 → 抵抗
- 温度: -20℃
計算結果:
- 抵抗値: 約 97,070 Ω(約97kΩ)
→ 解釈: -20℃ではR25の約10倍の抵抗値になる。プルアップ抵抗が10kΩだと分圧回路のダイナミックレンジが狭くなるため、プルアップ抵抗を47kΩ〜100kΩに変更するとADCの分解能を改善できる。
ケース5: 抵抗値から温度を逆算
テスターで4.7kΩを測定した場合。
入力値:
- モード: 抵抗 → 温度
- 抵抗値: 4700 Ω
- R25: 10000 Ω, B: 3950
計算結果:
- 温度: 約 42.4℃
→ 解釈: R25の半分以下まで下がっているので、室温よりかなり高い。人体の体温付近の値だ。
ケース6: ルックアップテーブル生成
Arduino用に-20℃〜80℃を5℃刻みでテーブル生成。
入力値:
- 開始: -20℃, 終了: 80℃, 刻み: 5℃
- ADC値含める: ON
結果:
- 21行のテーブルが生成される
- CSVコピーでそのままArduinoのPROGMEM配列に変換可能
→ 解釈: テーブル補間方式なら浮動小数点演算なしで温度を求められる。ATmega328のような8bitマイコンでは処理速度とFlash容量の両面で有利。
仕組み・アルゴリズム — B定数 vs Steinhart-Hart
2つの手法の比較
| 項目 | B定数方式 | Steinhart-Hart |
|---|---|---|
| パラメータ数 | 2(R25, B) | 3(A, B, C) |
| 精度 | ±1〜3℃(広範囲) | ±0.15℃ |
| 計算コスト | exp + 除算 | ln + 3乗 + 除算 |
| 逆変換 | 解析解あり | ニュートン法(数値解) |
| 用途 | ホビー、簡易測定 | 精密制御、工業用 |
ADC分圧回路の変換フロー
サーミスタとプルアップ抵抗の分圧回路では、以下の順序で変換する:
1. ADC値 → サーミスタ抵抗値
Rtherm = Rpullup × ADC / (ADCmax − ADC)
※ ADCmax = 2^bits − 1(10bitなら1023)
2. サーミスタ抵抗値 → 温度
B定数: T = 1/(1/298.15 + ln(R/R25)/B) − 273.15
S-H: T = 1/(A + B×ln(R) + C×(ln(R))³) − 273.15
具体的な計算例
10kΩ NTC (B=3950)、Arduino (5V/10bit)、プルアップ10kΩ、ADC値=350の場合:
Step 1: Rtherm = 10000 × 350 / (1023 − 350) = 5,200.6 Ω
Step 2: T = 1/(1/298.15 + ln(5200.6/10000)/3950) − 273.15
= 1/(0.003354 + (-0.6539)/3950) − 273.15
= 1/(0.003354 − 0.0001656) − 273.15
= 1/0.003188 − 273.15
= 313.66 − 273.15
= 40.5℃
なぜSteinhart-Hartの逆変換にニュートン法を使うか
Steinhart-Hart方程式の逆関数(温度→抵抗値)は解析的に解けない。3次方程式の解の公式を使う方法もあるが、実装が複雑で数値安定性に欠ける。ニュートン法なら初期値をB定数方式から得られるため、通常5〜10回の反復で10桁以上の精度に収束する。
Excel関数やメーカーツールとの違い
ワンストップの変換環境
多くのサーミスタメーカー(村田製作所、TDK、Vishay)はExcelベースの計算シートを提供している。しかし自社製品専用で、他社品のB定数を入れて使うことは想定されていない。このツールは任意のパラメータに対応する。
ADC変換まで一気通貫
温度⇔抵抗の変換だけでなく、ADC分圧回路の設計補助まで含めている。プルアップ抵抗値やADC分解能を入力すれば、マイコンのanalogRead()値と温度の関係を直接確認できる。Excelで分圧の式を別セルに書く手間がない。
ルックアップテーブルの即時出力
ファームウェアに組み込むテーブルデータを、温度範囲と刻み幅を指定するだけで生成できる。CSVコピーでそのままコードに貼り付けられるのは、メーカーツールにはない利点だ。
サーミスタにまつわる豆知識
サーミスタの発明は1930年代
NTCサーミスタの商用化は1930年代にさかのぼる。ベル研究所のSamuel Rubinが金属酸化物セラミックスの温度-抵抗特性を研究し、温度センサとしての応用を開拓した。当初は電話交換機の温度補償に使われていた(Wikipedia: Thermistor)。
宇宙開発でもサーミスタは現役
NASAの火星探査機や国際宇宙ステーション(ISS)でも、NTCサーミスタは温度モニタリングに使われている。極端な温度環境(-150℃〜+150℃)でも動作するガラス封止型サーミスタは、放射線耐性と長寿命の面で他のセンサより有利な場面がある。
自己発熱効果に注意
サーミスタに電流を流すと、素子自体がジュール熱で発熱する(自己発熱効果)。測定電流が大きいと実際の環境温度より高い値を示してしまう。一般的には測定電流を100μA以下に抑えるか、パルス駆動で自己発熱を低減する。プルアップ抵抗を大きくすれば電流を減らせるが、ノイズ耐性とのトレードオフになる。
サーミスタ活用のコツ
B定数のスペック温度範囲を確認する
データシートに「B25/50」と記載されていれば、25℃と50℃の2点で測定されたB定数だ。「B25/85」なら25〜85℃の範囲。使用温度がこの範囲外に出る場合、精度が保証されないためSteinhart-Hartを検討しよう。
プルアップ抵抗はR25と同値を基本にする
サーミスタの分圧回路でADCの分解能を最大化するには、プルアップ抵抗をR25と同じ値にするのが定石だ。25℃のとき分圧がVref/2になり、ADCレンジの中央に来る。ただし、測定したい温度範囲が25℃から大きくずれる場合は、その中心温度での抵抗値に合わせるとよい。
校正は2点以上で行う
B定数方式を使う場合、最低2点の既知温度で実測値と比較する。氷水(0℃)と沸騰水(100℃)が手軽で信頼性が高い。実測値と計算値のズレが大きければ、B定数の微調整やSteinhart-Hartへの切り替えを検討しよう。
よくある質問
Q: PTCサーミスタには対応している?
現時点ではNTCサーミスタ専用だ。PTCは温度-抵抗特性が非線形で急峻な変化点を持つため、B定数やSteinhart-Hart方程式では近似できない。PTCは主に過電流保護やヒーター用途に使われ、温度計測には不向きなため、需要を見ながら対応を検討する。
Q: Steinhart-Hart係数はどこで確認できる?
一部のメーカー(Vishay、Amphenol等)はデータシートにA/B/C係数を直接記載している。記載がない場合は、3点の温度-抵抗データ(例: 0℃、25℃、50℃)から連立方程式を解いて算出する。このツールのデフォルト値は10kΩ NTC (B=3950) の近似係数を設定してある。
Q: 計算結果のデータはサーバーに送信される?
入力値・計算結果は一切サーバーに送信されない。すべてブラウザ内で計算が完結するため、設計中の回路パラメータが外部に漏れる心配はない。
Q: B定数方式とSteinhart-Hartのどちらを使うべき?
25℃付近(±25℃程度)の測定ならB定数で十分だ。精度差は0.1℃未満に収まる。-40℃〜+125℃のフルレンジや、食品管理・工業制御のように高精度が求められる場面ではSteinhart-Hart方程式を推奨する。迷ったら両方で計算して結果を比較してみるとよい。
まとめ
サーミスタの温度⇔抵抗変換は、B定数方式で手軽に始めてSteinhart-Hart方程式で精度を追い込める。ADC分圧回路の設計からルックアップテーブル生成まで、マイコン温度計の開発に必要な計算をこのツール1つでカバーした。
電子回路の設計に興味があるなら、プルアップ抵抗計算ツールや抵抗カラーコード判別ツールも試してみて。
不具合や要望があれば、X (@MahiroMemo)から気軽に教えて。