今日目標
在昨天學會了讓 ESP32 進行 Wi-Fi 模擬連線與 NTP 網路對時後,今天我們要進一步探討物聯網通訊的核心協議——MQTT。
MQTT 是一種專為物聯網設計的輕量級「發布/訂閱」通訊協定,非常適合頻寬有限、不穩定的嵌入式裝置。在將感測器數據發送到雲端平台之前,我們必須先把原始數據打包成結構化的 JSON 格式字串。今天我們將結合 DHT22 溫濕度感測器,學習如何在 MicroPython 中將實體數據打包為標準 JSON,並在序列埠模擬發布過程。
程式碼
import time
import json
import network
import dht
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)
dht_sensor = dht.DHT22(Pin(15))
def show_screen(title, msg1, msg2=""):
oled.fill(0)
oled.text(title, 0, 0)
oled.hline(0, 12, 128, 1)
oled.text(msg1, 0, 26)
if msg2:
oled.text(msg2, 0, 42)
oled.show()
show_screen("MQTT CLIENT", "Connecting WiFi...")
print("=== ESP32 MQTT 模擬發布系統啟動 ===")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
print(".", end="")
time.sleep(1)
print("\n✅ 模擬 Wi-Fi 連線成功!")
show_screen("MQTT CLIENT", "WiFi Connected", "Ready to Publish")
time.sleep(1.5)
MQTT_TOPIC = "home/greenhouse/sensor_data"
device_id = "esp32_greenhouse_01"
print(f"準備發布資料至 MQTT Topic: {MQTT_TOPIC}")
counter = 1
while True:
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
payload_dict = {
"msg_id": counter,
"device_id": device_id,
"temperature": temp,
"humidity": hum,
"timestamp": time.time()
}
json_payload = json.dumps(payload_dict)
print(f"\n[MQTT Publish] Topic: {MQTT_TOPIC}")
print(f"Payload (JSON): {json_payload}")
show_screen("MQTT PUBLISHED", f"ID: {counter}", f"T:{temp}C H:{hum}%")
counter += 1
except OSError:
print("❌ DHT22 感測器讀取失敗!")
show_screen("MQTT ERROR", "Sensor Read Fail")
time.sleep(5)
心得
今天我們掌握了物聯網溝通的共通語言——JSON 資料序列化與 MQTT 發布架構。透過將感測器數據打包,我們不再只是把數字印在螢幕上,而是具備了將環境數據推送到全世界雲端平台的能力。