IoTで使うPython入門Step1-I2C LM75Bで温度測定 (4) アラート

 上限温度を設定して超えるとアラートを出す設定します。LM75Bは、パワーオン・リセット時には80℃がデフォルトで設定されています。

ポインタ・レジスタの機能

 今まで温度を読み出すポインタ・レジスタ(Temp)だけを扱ってきました。そのほかにもポインタ・レジスタがあります。

レジスタ名 ポインタ値 リード/ライト パワーオン・リセット時の値 詳細
Conf 0x01 R/W 0 コンフィギュレーション。8ビット
Temp 0 読み出しだけ - 温度。11ビット
Tos 0x03 R/W 0x5000 上限温度設定。9ビット。80℃
Thyst 0x02 R/W 0x4b00 ヒステリシス温度。9ビット。75℃

 上限温度を設定するTosポインタ・レジスタを、例えば30℃弱の低い温度に変更して、指をあてるとアラートが上がるように実験をします。
 Tosポインタ・レジスタに26℃を書き込みます。2バイト9ビットのレジスタですが、上位1バイト分だけを設定すれば、最小桁は1℃です。2の補数形式のデータは、下のビットを扱わなくても分解能が悪くだけで、リード/ライトに支障はありません。1バイトの26℃は0x1cです。

上位バイト 下位バイト
bit7 6 5 4 3 2 1 0 bit7 6 5 4 3 2 1 0
D8 D7 D6 D5 D4 D3 D2 D1 D0 x x x x x x x
0 1 0 1 0 0 0 0 0 x x x x x x x

配線

 3番ピンのOSがアラートの出力です。デフォルトでは、上限温度を超えるとLowになるオープン・ドレイン出力です。オープン・ドレインは、ON時に電流を吸い込みます。したがって、LEDを次のように接続しました。直列に入っている電流制限抵抗は470Ωです。

プログラム

 最初にTosポインタ・レジスタの2バイトを読み出します。電源を入れた直後は80℃が読み出されます。

 rawを求める計算式を変更しました。いままでシフトを使っていましたが(raw = ((data[0]) << 8) | (data[1]))、乗算と加算を使っても同じように16ビット・データを合成できます(raw = data[0] * 256 + data[1])。

 最後の温度tempのprintも変更しました。文字列を複数表示するには連結するために+を使いました(print(str(temp) + "C"))。型の異なるintとsrtは,で並べて表示できます(print(temp, "C"))。

import smbus
import time
i2c = smbus.SMBus(1)
addr = 0x4c # LM75B NXP. TI is 9bit
Tos = 0x03 # 9bit default 0x5000 80C

def sign16(x):
return (-(x & 0b1000000000000000) | (x & 0b0111111111111111))

# main
readTos = i2c.read_i2c_block_data(addr, Tth, 2)
print("Tos ", readTos)
i2c.write_byte_data(addr, Tos, 0x1a) # set 26.0C
while 1:
data = i2c.read_i2c_block_data(addr, 0, 2)
print("Temp ", data)
print(hex(data[0]),hex(data[1]))
raw = data[0] * 256 + data[1]
raw_s = sign16(raw)
temp = (raw_s >> 5) * 0.125
print(temp, "C")
time.sleep(1)

実行

 プログラムを走らせます。常温24℃ではLEDは点灯していません。指をICに当てて温度が上がるとLEDが点滅しました。

(※)写真では、二つのLM75B(緑の基板)と温湿度センサSHT31(紫色の基板)がつながっています。プログラムで利用しているのは、左端のLM75Bです。

(※)上限温度の設定は、電源を切っても保存されており、次回電源を入れた時にも有効なときがあります。80℃に初期化されていることもあり、その仕組みが不明です。また、プログラムを動かさなくても電源が入っている限りアラートの機能は有効なときがあります。これらは、長期にわたってテストして確認し利用するのがよいでしょう。