マイクロビット(e_05)LM61 温度センサー
LM61
LM61は単一電源の温度センサーです。以下がLM61の外観です。
電源電圧は2.7~10Vなのでmicro:bitから給電して使えます。出力電圧は摂氏温度に比例(+10mV/℃)します。600mVのオフセットがあります。Vo=(10mv/℃ × T℃)+600mV で出力されます。したがって、周囲温度は、T℃=(V0-600mV)/10mV になります。
LM61で測定した温度とmicro:bitのtemperature()で測定した温度の比較してみます。
接続例
micro:bitと以下のように接続します。LM61の電源はmicro:bitの3.3Vを使います。LM61の出力をmicro:bitの入力ピンpin1に接続します。pin1のモードはアナログ入力にします。
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
スクリプト
スクリプトは以下のようにしました。※thonny-microbitを使っています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
# データを振幅比で換算(map)
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
display.off()
pin1.set_pull(pin1.NO_PULL) #LM61の出力をpin1で受ける
while True:
r_v1 = pin1.read_analog() #pin1をread_analogにする
sleep(100)
vo=u_map(r_v1, 0, 1024, 0, 3300) #3215 読値を振幅で換算して電圧に
#T=(Vo-600)/10
t0=(vo-600)/10 #摂氏温度に換算
t1=temperature() #micro:bitの温度を得る関数
#print(r_v1, vo, t0, t1)
print('Read=%04d ' % r_v1, 'Vo=%04d_mV ' % vo,'t0=%06.2f_℃ ' % t0,
't1=%06.2f_℃ ' % t1)
sleep(1000)
実行結果(ThonnyのShell表示、ThonnyのSTOPアイコンで停止)
>>> %Run b1116_lm61_b.py
Read=0265 Vo=0854_mV t0=025.48_℃ t1=023.00_℃
Read=0265 Vo=0854_mV t0=025.48_℃ t1=023.00_℃
Read=0265 Vo=0854_mV t0=025.48_℃ t1=023.00_℃
比例換算
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
で換算しています。read_analog()値は0~1023の値をとります。1023で電源電圧(3297mV)になります。
したがって read_analog()値は(3300/1024)X 読値になります。
仮に読値が511の場合は(3300/1024)*511 = 1648.8mV になります。
u_map関数の計算では、u_map(511, 0, 1024, 0, 3300) になります。そのため、y=(511-0)/(1024-0)*(3300-0) となるので、先と同じです。
結果をみるとややLM61の方が温度が高くなっています。テスターで電源電圧を測定すると3215mVでした。この値で再測定すると
>>> %Run b1116_lm61_b.py
Read=0265 Vo=0832_mV t0=023.28_℃ t1=023.00_℃
Read=0265 Vo=0832_mV t0=023.28_℃ t1=023.00_℃
Read=0265 Vo=0832_mV t0=023.28_℃ t1=023.00_℃
LM61の温度とmicro:bitのtemperature()関数で得た値とほぼ同じになりました。
温度を条件にLED点灯
LM61で測定した温度を条件にしてLEDをON/OFFの条件にしてみます。
以下のようにpin3に抵抗とLEDを接続します。pin3はwrite_digitalで使います。
先のスクリプトで不要な部分を削除して、条件式とpin3からLEDのON/OFFを追加します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
display.off()
pin1.set_pull(pin1.NO_PULL)
while True:
r_v1 = pin1.read_analog()
sleep(100)
vo=u_map(r_v1, 0, 1024, 0, 3215) #3215
t0=(vo-600)/10
if t0 > 25: # 25℃を超えたらLEDをON
pin3.write_digital(1)
print('Ta > 25℃ LED ON %06.2f_℃ ' % t0)
else: # 25℃以下ならLEDをOFF
pin3.write_digital(0)
print('Ta <=25℃ LED OFF %06.2f_℃ ' % t0)
sleep(1000*10) # 10sec 待機
実行結果(ThonnyのShellに表示)
>>> %Run b1116_lm61_b2.py
Ta <=25℃ LED OFF 023.60_℃ # 25℃以下なのでLEDはOFF
Ta > 25℃ LED ON 025.48_℃ # 25℃を超えたのでLEDをON
Ta > 25℃ LED ON 025.80_℃
Ta > 25℃ LED ON 025.80_℃
Ta > 25℃ LED ON 025.17_℃
Ta <=25℃ LED OFF 024.85_℃ # 25℃以下なのでLEDはOFF
Ta <=25℃ LED OFF 023.60_℃
応答速度
ちなみに温度の応答らしきものを調べてみました。LM61で温度を測定してプロットしただけです。
LM61のパッケージ部を手で摘まんで温めた後の冷却時間です。手を離してから定常になるまで約10分くらいかりました。樹脂パッケージなので熱の応答は遅いようです。環境が変化したら即反応が必要な用途には不向きです。
まとめ
micro:bitで温度センサーLM61を用いて温度測定をしました。LM61を使えば簡単に温度測定ができると思います。