Raspberry pi zero 2Wを入手したので備忘録として書きます。
表示イメージ
Raspberry pi zero 2Wを使用して下図のような表示を行う「お天気時計」を作成しようと考えています。
LCDは前回紹介した3.2インチのタッチパネル付き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 ILI9341from busio import SPI
from digitalio import DigitalInOut
import boardfrom 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_set()
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秒時)に時計表示を更新します。
実行結果
下の写真が実行した結果です。
保護用のフィルムを付けたままなので画面が汚いですが...
以上です。