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℃に初期化されていることもあり、その仕組みが不明です。また、プログラムを動かさなくても電源が入っている限りアラートの機能は有効なときがあります。これらは、長期にわたってテストして確認し利用するのがよいでしょう。