import network
import ntptime
import utime
from machine import Pin, I2C, RTC
import ssd1306
from characters import CHARACTER_DATA # 請確保字典中含有 '/' 半形(8×16)
# ====== WiFi 設定 ======
SSID = "Wokwi-GUEST"
PASSWORD = ""
print("連線中...")
wlan_sta = network.WLAN(network.STA_IF)
wlan_sta.active(True)
wlan_sta.connect(SSID, PASSWORD)
tmstart = utime.ticks_ms()
while not wlan_sta.isconnected():
if utime.ticks_diff(utime.ticks_ms(), tmstart) > 100000:
print(" WiFi 連線超時")
break
utime.sleep(0.5)
print(".", end="")
print("\n WiFi 連線成功IP:", wlan_sta.ifconfig())
# ====== NTP 對時 ======
try:
ntptime.host = "0.pool.ntp.org"
ntptime.settime()
print(" 已透過 NTP 自動對時")
except Exception as e:
print(" NTP 對時失敗:", e)
# ====== RTC 與 OLED 初始化 ======
rtc = RTC()
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ====== 中文/半形 繪圖函式 ======
def draw_character(data, x, y):
if len(data) == 32:
# 中文全形:16x16
for row in range(16):
for byte_index in range(2):
byte_val = data[row * 2 + byte_index]
for bit in range(8):
if byte_val & (1 << bit): # ← 低位在左
oled.pixel(x + byte_index * 8 + bit, y + row, 1)
elif len(data) == 16:
# 半形字元:8x16
for row in range(16):
byte_val = data[row]
for bit in range(8):
if byte_val & (1 << bit): # ← 低位在左
oled.pixel(x + bit, y + row, 1)
def display_text_string(oled, text, start_x=0, start_y=0, spacing=1):
x_offset = start_x
for char in text:
if char in CHARACTER_DATA:
data = CHARACTER_DATA[char]
draw_character(data, x_offset, start_y)
x_offset += 16 + spacing if len(data) == 32 else 8 + spacing
else:
oled.text(char, x_offset, start_y + 6)
x_offset += 8 + spacing
# ====== 星期對應 ======
WEEKDAYS = ["1", "2", "3", "4", "5", "6", "7"]
# ====== 主程式迴圈 ======
while True:
oled.fill(0)
now = list(rtc.datetime())
now[4] = (now[4] + 8) % 24 # 手動修正時區為 UTC+8
year, month, day = now[0], now[1], now[2]
weekday = WEEKDAYS[now[3] % 7]
hour, minute, second = now[4], now[5], now[6]
roc_year = year - 1911
# --- 第一行:姓名 學號 ---
# 第一行:姓名 + 學號(只顯示後5碼)
display_text_string(oled, "趙均奇", 0, 0)
oled.text("b11113028", 64, 0)
# 第二行:年月日(固定寬度 60px 後開始顯示)
display_text_string(oled, "年/月/日", 0, 16)
oled.text(f"{roc_year}/{month:02d}/{day:02d}", 64, 16)
# 第三行:星期
display_text_string(oled, "星期", 0, 32)
oled.text(weekday, 64, 32)
# 第四行:時分秒(不要太靠右)
display_text_string(oled, "時/分/秒", 0, 48)
oled.text(f"{hour:02d}:{minute:02d}:{second:02d}", 64, 48)
oled.show()
# 同步印出至串口
print("(B11113028, 趙均奇) 現在時間: 中華民國 {} 年 {} 月 {} 日 星期 {} - {:02d}:{:02d}:{:02d}.{:03d}".format(
roc_year, month, day, weekday, hour, minute, second, utime.ticks_ms() % 1000
))
utime.sleep(1)