DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspberryPiと炊飯器で低温調理器を自作してみた④ 「画面表示デーモン」

ディスプレイの表示用プログラムです。

画面は今回たまたま手元にあった2色のカラーOLEDディスプレイをを利用しただけで、表示内容をファイルを読んで変えられるようにしただけで表示方法はほぼ以前に書いた記事のまま特に手を加えていません。↓

dreamerdream.hateblo.jp

 

このプログラムが無くてもシステムは問題無く動きますがLED表示とかより画面があった方が機械としてカッコイイので付けることにしました。

 

f:id:DreamerDream:20190918163901p:plain

/dev/shm/領域からデータを読み出してそのまま表示しています。

デーモンで0.5秒ごとに動かしています。

<temp_displayd.py>

 

#!/usr/bin/python
#coding:utf-8

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import time

import file_mng as file

 

#トップの文字(青字領域の高さ)
top_y = 14

#タイトル文字(黄色領域の高さ)
title_y = 0

#各行の移動距離
str_size = 10

#文字のX軸のサイズ
str_size_x = 6
# Raspberry Pi pin configuration
RST = 24
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

text_title='-- Teion Choriki --'

text_main_top='00:00:00 | Tmp:--.--'

 

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)

 

#全領域の表示を消す

def clear_all():
  draw.rectangle((0, 0,width, height ), outline=0, fill=0)

#トップ(黄色領域)の表示を消す

def clear_top():
  draw.rectangle((0, 0,width, str_size ), outline=0, fill=0)

#指定行(青文字領域)の表示を消す

def clear_row( row ):
  row = top_y + ( str_size * row )
  draw.rectangle((0, row ,width, row + str_size ), outline=0, fill=0)

#指定行(青文字領域)の表示

def write_row( row ,text ):
  clear_row( row )
  draw.text(( 0 , ( top_y + row * str_size ) ), text, fill=256 )

#トップ(黄色文字領域)の表示

def write_top(text):
  draw.text((0,title_y), text, fill=256)

#実際のディスプレイ描画

def view():
  disp.image(image)
  disp.display()

#立ち上げ時にタイトルを徐々に上に移動させて消すモーション

def remove_title():
  for i in range( str_size ):
    clear_top()
    draw.text( ( 0, -i ), text_title , fill=256)
    view()

#時間表示の部分だけ消して書き換え

def write_time( tim_str ):
  if 0 < len( tim_str ):
    draw.rectangle( ( 0 , title_y , (str_size_x * len(tim_str) ), ( title_y + str_size ) ) , outline=0, fill=0 )
    draw.text(( 0 , title_y ), tim_str , fill=256 )

#温度表示の部分だけ消して書き換え

def write_temp( temp_str ):
  if 0 < len(temp_str):
    draw.rectangle( ( str_size_x * 15 , title_y , ( str_size_x * 15 * len(temp_str) ), ( title_y + str_size ) ) , outline=0, fill=0 )
    draw.text(( str_size_x * 15 , title_y ), temp_str , fill=256 )

 

 

def main():

 #タイトルを表示して
  write_top( text_title )
  view()

  time.sleep(3)

#タイトルをスクロールで消す
  remove_title()

#タイトルを時間と温度表示に書き換えて
  write_top( text_main_top )
  view()

#以降、ファイルを読んで書き換えることを繰り返す

  while True:
    write_time( file.load_time() ) 
    write_temp( file.load_temp() )

    write_row(0, file.load_row_0() )
    write_row(1, file.load_row_1() )
    write_row(2, file.load_row_2() )
    write_row(3, file.load_row_3() )
    write_row(4, file.load_row_4() )

    view()
    time.sleep(0.5)


if __name__=='__main__':
main()

<全プログラム内部構造一覧>

dreamerdream.hateblo.jp

 

kampa.me