[ラズパイ] ADコンバータ(ADS1115)を使ってサーミスタから温度を取得する

前回に続き、ADコンバータを使って、傍らに落ちていたサーミスタから温度の取得までを行うかなぁとおもう。手元にあるサーミスタが

これは一体、どこから持ってきたのかというと・・・


これについていたサーミスタ。防水仕様!!。テスターには接続して使っていないのでADコンバータにつないでみたくなったw。まずは、実際テスターで抵抗値がどのくらい変化するか観察してみる。

室温22度ぐらいで、11.85kΩ。まぁ、まず一般的な10kΩ(25℃)のサーミスタと考えられる。

上のような商品なんだろうなと思う。SODIAL製なんかコネクタまで一緒で同じかなとも思った。

サーミスタの抵抗値を実際の温度に変換するには、何かしら計算が必要。下のサイトでざっくりと勉強。とても参考になりました。感謝です。

サーミスタにには温度が上がると抵抗が下がるNTC、また逆タイプのPTCがあるらしく、一般的にはNTCで、これもこのタイプだった。また、サーミスタにはB値という、ある規定された温度間での抵抗値変化の固有値があるらしくサーミスタごとに違うとのこと。このサーミスタ・・・B値が不明ww。B値って簡単に求まるのかなと思い、検索すると

(抜粋)

むむ・・・。T0の0度は冬だからどうにかなるとして、T1の100度はちょっと厳しい。100度でなくてもいいんだろうけど・・・計測予定の温度が、その2点間にあればいいので、「TSYS01 0.1℃精密温度センサモジュール」なんかを使って求めようかと思ったけど長くなりそう(この段階でAM0:00)なので、SODIALのB=3380をとりあえず準用しようと思うw。

では、Pythonで実際コードを書いてみる。まずは抵抗値から温度を求めるコード。下の式を参考にした。ln(自然対数)なんて高校以来w。pythonはmath.log()で底を指定しなければeが底の自然対数となる。常用対数(底が10)とごっちゃにならないように・・・まぁlogで底が書いてなければ自然対数だった気がするけどどうだったかな

(抜粋)


# B値
B_value = 3380

# 基準温度
B_temp = 25
# 基準温度での抵抗値10kΩ
B_reg = 10000
# 0℃の絶対温度
abs_temp = 273.15

# 抵抗値より温度計算
t = (1/((1/B_value)*math.log(therm_reg/B_reg)+1/(B_temp+abs_temp))) - abs_temp

therm_regはサーミスタの抵抗値。これは次の分圧回路からADコンバータを介して取得した電圧値から求める。入力電圧Vin=3.3、分圧抵抗(バランス抵抗)R1=10000Ωとして、下の式を参考にPythonでコード化。

(抜粋)


# 入力電圧
volt = 3.3
# バランス抵抗値
balance_reg = 10000

# サーミスタ抵抗計算
therm_reg = (volt / chan.voltage-1) * balance_reg

とりあえず、0.5秒毎に表示するコード全体は次の通り

import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
import math

# サーミスタ計算用
B_value = 3380
B_temp = 25
B_reg = 10000
abs_temp = 273.15

# 分圧回路用定数
volt = 3.3
balance_reg = 10000

i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
chan = AnalogIn(ads, ADS.P0)

while True:   
    # サーミスタ抵抗計算
    therm_reg = (volt / chan.voltage-1) * balance_reg
    # 抵抗値より温度計算
    t = (1/((1/B_value)*math.log(therm_reg/B_reg)+1/(B_temp+abs_temp))) - abs_temp
    
    print("temp = %.3f℃" % t)
    time.sleep(0.5)


この動画、ボケボケですんませんw。一応、手でサーミスタを握ると体温(35℃)付近まで上昇し、離すと低下していますね。離しているときは大体室温と同じかなぁとおもうけど、精度の程は・・・。あと、抵抗10kΩはテスターで測定して10kΩに一番近いものを選びました(テスターが正しいかどうかはまた別w)。B値もあやしいしw。とりあえず眠かったのでここまでにしました。