今日目標
雖然 Wokwi 線上模擬器是一個沙盒環境、無法直接連上真實的 Wi-Fi 路由器,但 MicroPython 提供了非常逼真的 network 模組來模擬 Wi-Fi 連線過程。我們將學習如何讓 ESP32 模擬連線至虛擬無線網路,並透過 NTP 網路時間協定從網際網路同步獲取精確的標準時間。
程式碼
import time
import network
import ntptime
from machine import Pin, I2C
import ssd1306
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def show_message(line1, line2=""):
oled.fill(0)
oled.text("=== NTP CLOCK ===", 0, 0)
oled.hline(0, 12, 128, 1)
oled.text(line1, 0, 26)
if line2:
oled.text(line2, 0, 42)
oled.show()
show_message("Connecting WiFi...", "Please wait...")
print("=== ESP32 Wi-Fi 模擬連線啟動 ===")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
SSID = "Wokwi-GUEST"
PASSWORD = ""
wlan.connect(SSID, PASSWORD)
max_wait = 10
while max_wait > 0:
if wlan.isconnected():
break
max_wait -= 1
print(".", end="")
time.sleep(1)
if wlan.isconnected():
ip_info = wlan.ifconfig()
print(f"\n✅ Wi-Fi 連線成功!")
print(f"取得 IP 位址: {ip_info[0]}")
show_message("WiFi Connected!", f"IP: {ip_info[0]}")
time.sleep(2)
else:
print("\n❌ Wi-Fi 連線逾時!")
show_message("WiFi Failed!", "Check network")
while True:
time.sleep(1)
print("正在從網路伺服器同步標準時間 (NTP)...")
show_message("Syncing NTP...", "Getting time...")
try:
# 呼叫 ntptime 模組寫入系統 RTC 時間 (預設為 UTC 標準時間)
ntptime.settime()
print("✅ NTP 時間同步成功!")
show_message("NTP Sync OK!", "Starting clock...")
time.sleep(1.5)
except Exception as e:
print(f"❌ NTP 同步失敗: {e}")
show_message("NTP Sync Failed", str(e))
time.sleep(2)
print("=== 進入即時網路時鐘主迴圈 ===")
while True:
# time.localtime() 回傳格式:(year, month, mday, hour, minute, second, weekday, yearday)
utc_time = time.localtime()
year, month, mday, hour, minute, second, weekday, yearday = utc_time
hour += 8
if hour >= 24:
hour -= 24
date_str = f"{year:04d}-{month:02d}-{mday:02d}"
time_str = f"{hour:02d}:{minute:02d}:{second:02d}"
oled.fill(0)
oled.text("=== INTERNET CLOCK ===", 0, 0)
oled.hline(0, 12, 128, 1)
oled.text(f"Date:", 0, 22)
oled.text(f"{date_str}", 20, 32)
oled.text(f"Time (UTC+8):", 0, 44)
oled.text(f"{time_str}", 20, 54)
oled.show()
print(f"當前網路時間: {date_str} {time_str}")
time.sleep(1)
心得
今天我們突破了單機硬體的限制,讓 ESP32 成功連上了虛擬網際網路,並學會了利用 NTP 伺服器進行時間校準。這項技術是未來製作「物聯網氣象鐘」、「定時自動排程系統」或「雲端資料上傳」不可或缺的基石。