MicroPythonでサーミスタから温度取得

前回、温湿度センサーDHT20で温度を取得しましたが、今回はサーミスタで温度を取得します。

使用したサーミスタは下記で1本15円。何かと測りたい温度測定のコストを下げたいなと思って。

サーミスタ 10kΩ (10本入)¥150
https://akizukidenshi.com/catalog/g/gP-17250/

実のところ、DHT20はこの温度校正がしたくて買いました。

 

 

■ 回路


本サーミスタを10kΩの抵抗で分圧しました。

【パーツ】
・M5stack ATOM Lite
・サーミスタDKF103*1
・抵抗R1 10kΩ

 

■ プログラム

【ソースコード(MicroPython)】

import machine
import utime
import math

adc = machine.ADC(machine.Pin(33))
adc.atten(machine.ADC.ATTN_11DB)

# サーミスタの設定
B = 3960 #B定数
To = 25 #基準温度
Ro = 10000 #基準温度時の抵抗値
# 回路の設定
Vcc = 3.3 #入力電圧
R1 = 10000 #分圧抵抗
    
Vout = adc.read_u16()* 3.3/65535

R = R1 * Vout/(Vcc-Vout)
T = 1/(1/(To+273.15)+math.log(R/Ro)/B)-273.15
    
print("Temp: " + str(T))

参考サイト:アナログ温度センサ4 サーミスタ
https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot-4.html

 

【解説】

サーミスタ、正確にはNTCサーミスタと呼ばれる素子で、温度で抵抗が変化して、その式が以下です。

R = Ro * math.exp(B*( 1/(T+273.15) - 1/(To+273.15) ))

温度Tの形にした式が以下。

T =1/(1/(To+273.15)+math.log(R/Ro)/B)-273.15

Toは基準温度、Roは基準温度時の抵抗値、BはB定数でデータシートから得られます。
今回のDKF103*1の場合、T0=25℃、Ro=10000Ω、B=3960です。

 

あとは分圧式から抵抗値を算出します。

R = R1 * Vout/(Vcc-Vout)

R1は分圧した抵抗、Vccは入力電圧、VoutはATOM LiteのADコンバータで取得した電圧です。分圧する抵抗は、温度の測定範囲とADコンバータの測定範囲に応じて決めます。

 
 

上式は対数の計算が必要で、MicroPythonはmathモジュールで手軽に計算できるので問題ないですが、PICなどのマイコンだと対数の計算をするのは手間なので、線形近似するのが、よくあるやり方だそうです。

温度の測定範囲を-10℃〜50℃として、線形近似させてみました。

今回の条件では、近似式はy=-29.14x+73.648でした。xに取得電圧を代入すれば、温度を得られます。相関係数0.9985。こちらでも全然問題ないですね。

エクセルファイルを上げておくので良かったらどうぞ。
thermistor_linear_approx.xls

 

測定

室温で実際測ってみて、DHT20の測定結果と比較すると、けっこう差がありました。テスターで確認してみると、テスターで測る電圧とATOM Liteが認識している電圧に差があり、原因として、ノートPCのUSB供給の電圧が4.5Vと低めで、3.3V出力が2.9Vになってました。
また10kΩのカーボン抵抗が実測値だと9.82kΩだったので、それぞれのパラメータを実測値に合わせると、DHT20との差がほぼなくなりました。

ただモバイルバッテリーを電源にすると5V出力は5.1Vで、3.3V出力は3.2Vになり、電圧が変わります。電源の安定度合い、大事ですね。

 

ベランダで鉛蓄電池とDCDCコンバータを電源に、外気温を5分に1回、1日計測してみました。
DHT20と今回の回路に加え、何年か前に買ったIC温度計センサーLM61CIZを合わせて測定しました(測定したときの記事)。
ちなみに今の価格でDHT20が380円、LM61CIZが120円です。

その結果がこちら。

DHT20はさすが安定してます。LM61CIZは値がバラついていますが、値としてはDHT20と同じくらい。測定時1回しか計測しませんでしたが、100回の平均をとるなどすれば問題なさそうです。ATOM Lite(ESP32)のADCの誤差である程度ズレると思ってましたが、思いの外良かったです。

さて、肝心のサーミスタの方は、値はバラついてませんが、だいぶズレちゃってますね。
DHT20の温度との関係は下図となります。

ちなみに直線近似すると、y=1.2763x-13.905(R^2=0.9924)でした。
直線や指数式で近似できるので、補正はできそうです。
補正するには、測定範囲を均等にデータを取った方が良いですが、差しあたっては使えますかね。いつか校正用のデータを取得したい。

Updated: 2022年12月6日 — 01:43

コメントを残す

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