TOPに戻る

ラズパイ5 pythonの仮想環境 ③ 温度センサTMP117の測定結果を4桁7セグメントLED表示器に

 前回、温度センサTMP117をI2Cバスにつないで、温度を測定しました。ここでは、下記の記事を参照し、4桁7セグメントLED表示器に温度を表示します。

  ラズパイ2023年10月更新 bookworm ⑥ CPUの温度を4桁7セグメントLED表示器に

4桁7セグメントLEDに表示するプログラム

 上記のプログラムでは、小数点の処理が複雑になっていたので、変更しました。

 初期設定部分です。

HT16K33_GENERIC_SYSTEM_ON  = 0x21
HT16K33_GENERIC_DISPLAY_ON = 0x81
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_SYSTEM_ON,  0)
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_DISPLAY_ON, 0)

 輝度を設定します。0~15の値で輝度が変わります。

HT16K33_GENERIC_CMD_BRIGHTNESS = 0xe0
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_CMD_BRIGHTNESS, 8)

 辞書機能を使って、LEDに表示する数字やマイナス符号、ドットを表示コードをキー (key)にし、表示するコードの値(value)を対応づけます。

num={'0':0x3f,'1':0x06,'2':0x5b,'3':0x4f,'4':0x66,'5':0x6d,'6':0x7d,
        '7':0x07,'8':0x7f,'9':0x67, '-':0x40, '.':0x80}

 辞書機能を使って、4桁のLEDの桁位置と実際の設定コードを対応付けます。


seg={0:0,1:2,2:6,3:8}

 LEDを消灯させる関数です。

  clear7segLED()

 1~4桁の数字を引数(data)に、LEDを点灯させる関数です。

  disp7seg(data)

 引数(数値)を文字型に変え、長さを得ます。

    dataString = str(data)
    dataLength = len(dataString)

 表示する文字数分のバッファを用意します。

buf = ([0]*dataLength)

 文字型にした数字の列を後ろから1文字ずつbufに入れていきます。

for i in range(dataLength):
        buf[i] = dataString[-1*(i+1)]

 辞書機能で、表記コードに変換します。

   buf[i] = num[buf[i]]

 小数点'.'を見つけたら、その次の数字に128を足して、表示時にdotを光らせます。小数点の文字自体を消去します。

  for k in range(dataLength-1 if 128 in buf else dataLength):
        if buf[k] == 128:  # '.'
            buf[k+1] = buf[k+1] + 128  # LED dot
            del buf[k]

 表示コードの並びを逆順にします。

    buf.reverse()

 実際にLEDを表示します。

    for i in range(len(buf)):
        # print(buf[i])
        i2c.write_byte_data(i2c_address, seg[i], buf[i])

import time
import smbus2

i2c_address = 0x71
i2c=smbus2.SMBus(1)

HT16K33_GENERIC_SYSTEM_ON  = 0x21
HT16K33_GENERIC_DISPLAY_ON = 0x81
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_SYSTEM_ON,  0)
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_DISPLAY_ON, 0)

HT16K33_GENERIC_CMD_BRIGHTNESS = 0xe0
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_CMD_BRIGHTNESS, 8)

num={'0':0x3f,'1':0x06,'2':0x5b,'3':0x4f,'4':0x66,'5':0x6d,'6':0x7d,
        '7':0x07,'8':0x7f,'9':0x67, '-':0x40, '.':0x80}
seg={0:0,1:2,2:6,3:8}

def clear7segLED():
    i2c.write_i2c_block_data(i2c_address, 0, [0x00] * 10)

def disp7seg(data):
    dataString = str(data)
    dataLength = len(dataString)
    # print('data  dataString dataLength ',data,dataString,dataLength)

    buf = ([0]*dataLength)
    for i in range(dataLength):
        buf[i] = dataString[-1*(i+1)]
    #print(buf)

    #for i in range(dataLength):
        buf[i] = num[buf[i]]
    #print(buf)

    for k in range(dataLength-1 if 128 in buf else dataLength):
        if buf[k] == 128:  # '.'
            buf[k+1] = buf[k+1] + 128  # LED dot
            del buf[k]
    buf.reverse()
    # print(buf,len(buf))
    for i in range(len(buf)):
        # print(buf[i])
        i2c.write_byte_data(i2c_address, seg[i], buf[i])

print("test start")
clear7segLED()
data=23.4
print(data)
disp7seg(data)
time.sleep(3)

clear7segLED()
data=-23.0
print(data)
disp7seg(data)
time.sleep(3)

clear7segLED()
data=0
print(data)
disp7seg(data)
time.sleep(3)

clear7segLED()
data=105.6
print(data)
disp7seg(data)

 いくつかのprint文のコメントを外し、実行します。

yoshi@ras05:~ $ source env/bin/activate
(env) yoshi@ras05:~ $ python tmp117-7sega.py
test start
23.4
['4', '.', '3', '2']
[102, 128, 79, 91]
-23.0
['0', '.', '3', '2', '-']
[63, 128, 79, 91, 64]
0
['0']
[63]
105.6
['6', '.', '5', '0', '1']
[125, 128, 109, 63, 6]

温度を表示する

 温度センサTMP117の測定値を表示します。

 disp7seg()関数名は、disp7segLED()に変更しました。デバッグ用print文を削除しました。

import time
import smbus2

i2c_address = 0x71
i2c=smbus2.SMBus(1)
tmp117_addr = 0x48
TemperatureRegister   = 0x00

def readTMP117temperature():
    data = i2c.read_i2c_block_data(tmp117_addr , TemperatureRegister, 2)
    temp = data[0] <<8 | data[1]
    return temp * 0.0078125

HT16K33_GENERIC_SYSTEM_ON  = 0x21
HT16K33_GENERIC_DISPLAY_ON = 0x81
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_SYSTEM_ON,  0)
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_DISPLAY_ON, 0)

HT16K33_GENERIC_CMD_BRIGHTNESS = 0xe0
i2c.write_byte_data(i2c_address, HT16K33_GENERIC_CMD_BRIGHTNESS, 8)

num={'0':0x3f,'1':0x06,'2':0x5b,'3':0x4f,'4':0x66,'5':0x6d,'6':0x7d,
        '7':0x07,'8':0x7f,'9':0x67, '-':0x40, '.':0x80}
seg={0:0,1:2,2:6,3:8}

def clear7segLED():
    i2c.write_i2c_block_data(i2c_address, 0, [0x00] * 10)

def disp7segLED(data):
    dataString = str(data)
    dataLength = len(dataString)
    buf = ([0]*dataLength)
    for i in range(dataLength):
        buf[i] = dataString[-1*(i+1)]
        buf[i] = num[buf[i]]
    for k in range(dataLength-1 if 128 in buf else dataLength):
        if buf[k] == 128:  # '.'
            buf[k+1] = buf[k+1] + 128  # LED dot
            del buf[k]
    buf.reverse()
    for i in range(len(buf)):
        i2c.write_byte_data(i2c_address, seg[i], buf[i])

print("test start")

while 1:
    clear7segLED()
    data=round(readTMP117temperature(),1)
    print(data)
    disp7segLED(data)
    time.sleep(3)

-