<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 メニューに戻る