お天気時計の作成(その1:時計表示)

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 

表示イメージ

Raspberry pi zero 2Wを使用して下図のような表示を行う「お天気時計」を作成しようと考えています。

LCDは前回紹介した3.2インチのタッチパネル付きLCDになります。

(前回のLCD接続確認はこちらです)

 


表示エリア

先ほどの表示イメージを下図のように5つのエリアに区切って、1つ1つ作っていきたいと思います。今回は、「日付と時計表示エリア」になります。

 

プログラム

作成したプログラムはこちらになります。

ファイル名:LCD_disp.py

#LCDの初期設定
def LCD_set():
    global draw,disp,image
    global COLOR_BLACK,COLOR_WHITE,COLOR_PURPLE,COLOR_RED
    global COLOR_BLUE,COLOR_GRAY,COLOR_LIGTH_BLUE
    global FONT_NOTO_12,FONT_NOTO_18,FONT_NOTO_20,FONT_NOTO_24
    global FONT_NOTO_36,FONT_NOTO_48,FONT_NOTO_64,FONT_ROBOTO
    
    from adafruit_rgb_display.rgb import color565
    from adafruit_rgb_display.ili9341 import ILI9341

    from busio import SPI
    from digitalio import DigitalInOut
    import board

    from PIL import Image, ImageDraw, ImageFont

    # Pin Configuration
    cs_pin = DigitalInOut(board.D8)
    dc_pin = DigitalInOut(board.D25)
    rst_pin = DigitalInOut(board.D24)

    # Set up SPI bus
    spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

    # Create the ILI9341 display:
    disp = ILI9341(
        spi,
        cs=cs_pin, dc=dc_pin, rst=rst_pin,
        width=240, height=320,
        rotation=90,
        baudrate=24000000
    )

    # Define image size (320x240, rotated)
    IMAGE_SIZE = (disp.height, disp.width)

    # Define fonts
    FONT_ROBOTO = ImageFont.truetype("Roboto-Medium.ttf", 12)
    FONT_NOTO_12 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 12)
    FONT_NOTO_18 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 18)
    FONT_NOTO_20 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 20)
    FONT_NOTO_24 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 24)
    FONT_NOTO_36 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 36)
    FONT_NOTO_48 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 48)
    FONT_NOTO_64 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 64)

    # Define colors
    COLOR_WHITE      = (236, 239, 241)
    COLOR_BLACK      = (  0,   0,   0)
    COLOR_PURPLE     = (239, 154, 154)
    COLOR_RED        = (239,   0,   0)
    COLOR_BLUE       = (  0,   0, 239)
    COLOR_GRAY       = (128, 128, 128)
    COLOR_LIGTH_BLUE = (  0, 239, 239)

    # Create an image with black background
    image = Image.new("RGB", IMAGE_SIZE, (0, 0, 0))

    # Draw some text
    draw = ImageDraw.Draw(image)

#今の日時を取得
def now_daytime():
    import datetime
    now = datetime.datetime.now()
    today_n = now.date().strftime("%Y/%m/%d(%a)")
    time_n = now.time().strftime("%H:%M")
    now_M_S = now.time().strftime("%M:%S")
    now_S = now.time().strftime("%S")
    return today_n,time_n,now_M_S,now_S

#時計表示
def time_disp(today_n,time_n):
    # テキストを消去
    draw.rectangle((0 , 0   ,  179, 95), fill=COLOR_BLACK)
    #時計表示
    draw.text((0 , 0 ), today_n, font=FONT_NOTO_20, fill=COLOR_WHITE)
    draw.text((4 , 20), time_n , font=FONT_NOTO_64, fill=COLOR_WHITE)
    disp.image(image)

#起動中表示
def setup_disp():
    #起動中と表示する
    draw.rectangle((0,0,319,95), fill=COLOR_BLACK)
    draw.text((4,20), "起動中" , font=FONT_NOTO_48, fill=COLOR_WHITE)
    disp.image(image)

if __name__ == '__main__':

    # libフォルダのライブラリを参照できるようにする。
    import sys
    sys.path.append('./lib')
    from LCD_led import LCD_led
    
    import time
    
    LCD_set()     #LCDの初期設定
    LCD_led(23,1) #LCDのLED点灯
    setup_disp()  #起動中表示
    time.sleep(1) #1秒wait
    
    #今の日時を取得
    today_n,time_n,now_M_S,now_S = now_daytime()
    #時計表示
    time_disp(today_n,time_n)
    
    now_S_old = "--"
    
    while True:   
        #今の日時を取得
        today_n,time_n,now_M_S,now_S = now_daytime()
        
        if now_S != now_S_old: #1秒に1回処理するためにこの処理を追加
            #0秒になったら時計表示
            if now_S == "00" :
                time_disp(today_n,time_n)
                print(today_n,time_n)                
        
        now_S_old = now_S #1秒の切り替わりを判定するために前の秒数を保存
        

プログラムの説明

   LCDの初期設定を行います。LCDを制御するためのSPIやGPIOの設定

   および、使用するフォントやフォントの色を定義しています。

  • now_daytime()

   datetime関数使用して現在の日時を取得します。

   実行すると today_n,time_n,now_M_S,now_Sを返します。

    today_n  :現在の「年月日(曜日)」

    time_n    :現在の「時:分」

    now_M_S:現在の「分:秒」

    now_S     :現在の「秒」

  • time_disp(today_n,time_n)

   現在の「年月日(曜日)」と「時:分」をLCDへ表示します。

  • setup_disp()

   日付と時間の表示エリアに「起動中」と表示します。

  • if __name__ == '__main__':以下のプログラム

    上記作成した関数の確認用のプログラムです。

   プログラム中にある「LCD_led(23,1)」関数は、前回作成した関数で、

   LCDのLEDを点灯させるための関数です。「23」はGPIO23を示し、

   「1」でLED点灯、「0」でLED消灯します。

 

  実行すると1秒間「起動中」と表示し、日付と時間を表示します。

  その後は1分毎(0秒時)に時計表示を更新します。

実行結果

下の写真が実行した結果です。

保護用のフィルムを付けたままなので画面が汚いですが...


以上です。