<Raspberry Pi-45>

Raspberry Piで時刻と温度測定の表示は、<Raspberry Pi-27>で紹介しました。

今回は、python3で行いたいと思います。Raspberry Pi-27では、Raspberry Pi2 BでしたがRaspberry Pi ZEROで行いました。

LCDはAQM0802で、LCDの1行目に温度、2行目に時刻と日付を表示します。
2行目に表示させる時刻と日付ですが8文字/1行なので、交互に表示させています。(10秒毎に2秒間だけ日付の表示)



回路図


下の画像のようにi2cdetect -y 1でLCDとSTTS751のアドレスを確認します。
3e:LCD AQM0801 48:STTS751


プログラム (<は半角に変更してください)
----------------------------------------------------------------------------------------------------

import smbus
import datetime
from time import sleep

def lcd_init():
    sb.write_i2c_block_data(lcd_i2c_add,control_set, [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c])
    sleep(0.2)
    sb.write_i2c_block_data(lcd_i2c_add,control_set, [0x38, 0x0c, 0x01])
    sleep(0.0002)
    return

#指定のアドレスに移動
def ketapos():
    #print ("lcdpos=",lcdpos)
    sb.write_byte_data(lcd_i2c_add, control_set,lcdpos)
    sleep(0.001)
    return


def lcd_moji():
    #global wait
    #文字をアスキーコードに変換(0x20から0x7fだけ)
    #global n_moji
    if ord(n_moji)>=0x20 and ord(n_moji)<=0x7f:                     #####<半角にする
        #print (n_moji,"=",ord(n_moji))
        sb.write_byte_data(lcd_i2c_add, write_set, ord(n_moji)) #A の表示
        #sleep(wait1)
    return

def temp_mes():
    global temp
    temp_data1=sb.read_byte_data(tmp_i2c_add,0x00)
    temp_data2=sb.read_byte_data(tmp_i2c_add,0x02)
    temp_data2=int((temp_data2/256)*10)/10
    temp=temp_data1+temp_data2
    #temp=temp_data1
    return

def ymd_mes():
    global jikan
    day=datetime.datetime.today()
    jikan=day.strftime("%Y/%m/%d")
    jikan=jikan[2:10]
    return

def hms_mes():
    global jikan
    day=datetime.datetime.today()
    jikan=day.strftime("%H:%M:%S")
    return

def temp_now():
    global lcdpos
    global n_moji
    temp_mes()
    n_len=len(str(temp))
    lcdpos=0x80
    ketapos()
    cnt=0
    while cnt < n_len:                       #####<半角にする
        n_moji=str(temp)[cnt:cnt+1]
        #print ("n_moji=" , n_moji)
        lcd_moji()
        #sleep(0.5)
        cnt +=1
    lcdpos=0x84
    ketapos()
    sb.write_block_data(lcd_i2c_add, write_set, [0xdf,0x43])
    return

def ymd():
    global lcdpos
    global n_moji
    ymd_mes()
    #sb.write_byte_data(lcd_i2c_add, write_set, 0x43)
    n_len=len(str(jikan))
    lcdpos=0xc0
    ketapos()
    cnt=0
    while cnt < n_len:                                               #####<半角にする
        n_moji=str(jikan)[cnt:cnt+1]
        #print ("n_moji=" , n_moji)
        lcd_moji()
        #sleep(0.5)
        cnt +=1
    
    #print (jikan)
    #sleep(0.86)
    return

def hms():
    global lcdpos
    global n_moji
    hms_mes()
    #sb.write_byte_data(lcd_i2c_add, write_set, 0x43)
    n_len=len(str(jikan))
    lcdpos=0xc0
    ketapos()
    cnt=0
    while cnt < n_len:                       #####<半角にする
        n_moji=str(jikan)[cnt:cnt+1]
        #print ("n_moji=" , n_moji)
        lcd_moji()
        cnt +=1
    
    #print (jikan)
    #sleep(0.86)
    return


sb=smbus.SMBus(1)
lcd_i2c_add=0x3e
tmp_i2c_add=0x48
control_set=0x00      #制御コマンド
write_set=0x40        #書込みコマンド

lcd_init()

hms_cnt=0
while True:
    #*****温度*****
    temp_now()
    #*****時間*****
    hms()
    sleep(0.86)
    #10秒毎に年月日を2秒表示
    if hms_cnt==10:
        hms_cnt=0
        ymd()
        sleep(2)
    hms_cnt +=1

---------------------------------------------------------------------------------------------------
参考
STTS751資料を見ると、0x00に整数部 0x02に小数部のデータが下のようになっています。

add     b7      b6      b5      b4     b3     b2    b1     b0
00     sign    64℃    32℃    16℃    8℃    4℃   2℃    1℃ 
02     1/2℃   1/4℃   1/8℃   1/16℃    0    0     0      0

下の画像左は、ターミナルから整数部、小数部を取得、右側はpython3のプログラムで取得した整数部、小数部のデータです。

ターミナル:整数部 0x1d(0001 1101)は16+8+4+1で29、小数部 0x80(1000 0000)は128なので128/256すると0.5で29+0.5=29.5
python3:整数部 temp_data1=29、小数部 temp_data2=128なので128/256すると0.5で29+0.5=29.5

両方の測定結果は一致していますが、違う場合もあるようです。(その後何回かやって見たら小数部で違う場合もありました)

いずれにしても、もともと温度測定精度は±2℃なので(ーー;)





Raspberry Pi-46に続く・・・


Raspberry メニューに戻る