2026-09 MQTT + wokwi esp32 + Node-red + Python (作業2)
在這套 ESP32 門禁系統中,MQTT 主題(Topic)扮演著「訊息傳遞通道/地址」的角色。MQTT 採用發行/訂閱(Publish/Subscribe)架構,ESP32 與後端(Python GUI / Node-RED)透過以下三個主題進行雙向資料交換:
一、 主題功能詳細解析
1. PubTopic3 (alex9ufo/2026/RFID/RFID_UID)
方向: ESP32 發行 $\rightarrow$ 後端訂閱(TX)
傳送內容: 8 碼或 14 碼的 RFID 實體卡片 UID(例如
AABBCCDD或04112233445566)。功能說明: 當使用者在門口刷卡時,ESP32 讀取卡片號碼,並將 UID 發送至此主題。
後端處理: Node-RED 或 Python 收到後,會加上
[UID]前綴,搭配當前日期與時間寫入mqtt.db資料庫作為進出刷卡紀錄。
2. PubTopic4 (alex9ufo/2026/RFID/RFID_PICC)
方向: ESP32 / 後端發行 $\rightarrow$ 後端訂閱(TX)
傳送內容:
4x4 Keypad 輸入的 8 位數密碼(例如
88888888)。工作證號碼(例如
#12345678)。實體按鈕門鈴觸發訊息(
DOORBELL_RING)。
功能說明: 作為「非卡片類」事件的回報通道。當使用者在門口按門鈴或使用鍵盤輸入資料時,ESP32 會將對應訊息發送至此主題。
後端處理: 後端收到後會加上
[PICC/Keypad]前綴並自動存入 SQLite 資料庫;若是門鈴訊息,亦可用於觸發遠端告警通知。
3. SubTopicCtrl (alex9ufo/2026/RFID/CONTROL)
方向: 後端發行 $\rightarrow$ ESP32 訂閱(RX)
傳送內容: 遠端開門指令字串(例如
"open"、"1"或"true")。功能說明: 作為「遠端控制門鎖」的專用指令通道。ESP32 啟動後會持續監聽此主題。
執行動作: 當管理者在 Python GUI 或 Node-RED Dashboard 點擊「🔓 遠端開門」按鈕時,後端會向此主題發送
"open",ESP32 收到後便會立即驅動 Servo 馬達旋轉 90 度開門 3 秒。
二、 三大主題運作對照表
| 主題變數名稱 | 主題名稱 (MQTT Topic) | 數據流向 | 主要傳送內容/指令 | 觸發時機與主要功能 |
| PubTopic3 | alex9ufo/2026/RFID/RFID_UID | ESP32 $\rightarrow$ 後端 | 卡號 UID (如 AABBCCDD) | 刷卡時主動發行,用於出勤/刷卡紀錄 |
| PubTopic4 | alex9ufo/2026/RFID/RFID_PICC | ESP32 $\rightarrow$ 後端 | 密碼、工作證號或 DOORBELL_RING | 按門鈴或鍵盤輸入時發行,用於操作紀錄與通知 |
| SubTopicCtrl | alex9ufo/2026/RFID/CONTROL | 後端 $\rightarrow$ ESP32 | 遠端開門指令 "open" | 點擊中控台「遠端開門」按鈕時發行,驅動 Servo 馬達 |
參考:
https://alex9ufoexploer.blogspot.com/2026/03/2026-2-rfidnode-redpythonsqlite.html
以下為本專案 ESP32 門禁與 IoT 監控系統 所使用的完整接腳(GPIO)配置清單:
ESP32 接腳分配表
| 模組 / 周邊元件 | 訊號名稱 | ESP32 GPIO 腳位 | 腳位功能與說明 |
| MFRC522 RFID 讀卡器 | SDA (SS) | GPIO 5 | SPI 晶片選擇 (VSPI SS) |
| SCK | GPIO 18 | SPI 時脈線 (VSPI SCK) | |
| MISO | GPIO 19 | SPI 主機輸入 (VSPI MISO) | |
| MOSI | GPIO 23 | SPI 主機輸出 (VSPI MOSI) | |
| RST | GPIO 4 | 模組重置腳位 | |
| LCD 16x2 (I2C 介面) | SDA | GPIO 21 | I2C 數據線 |
| SCL | GPIO 22 | I2C 時脈線 | |
| HC-SR04 超音波感測器 | TRIG | GPIO 16 | 超音波觸發訊號輸出 |
| ECHO | GPIO 17 | 超音波回波讀取輸入 | |
| 4x4 Keypad 矩陣鍵盤 | R1 (Row 1) | GPIO 26 | 矩陣掃描行 1 |
| R2 (Row 2) | GPIO 25 | 矩陣掃描行 2 | |
| R3 (Row 3) | GPIO 33 | 矩陣掃描行 3 | |
| R4 (Row 4) | GPIO 32 | 矩陣掃描行 4 | |
| C1 (Col 1) | GPIO 13 | 矩陣掃描列 1 | |
| C2 (Col 2) | GPIO 12 | 矩陣掃描列 2 | |
| C3 (Col 3) | GPIO 14 | 矩陣掃描列 3 | |
| C4 (Col 4) | GPIO 27 | 矩陣掃描列 4 | |
| Servo 馬達 | PWM Control | GPIO 2 | 控制 Servo 旋轉 (0°關門 / 90°開門) |
| Buzzer 蜂鳴器 | Positive (+) | GPIO 15 | 發出高低音提示聲響 |
| Pushbutton 門鈴按鈕 | Signal | GPIO 34 | 純輸入腳位 (Input-Only) ⚠️ 須外接 10kΩ 電阻上拉至 3.3V,按鍵另一端接 GND |
接線注意事項:
GPIO 34(門鈴按鍵): 屬於 Input-Only 腳位,內部沒有上拉電阻。硬體線路上務必在 GPIO 34 與 3.3V 之間外接一顆 10kΩ 提升電阻,防止未按下按鈕時腳位懸空導致 MQTT 訊息無限重複發送。
I2C 預設位址: LCD16x2 搭配 PCF8574 轉接板,I2C 位址預設為
0x27。
這份 ESP32 程式整合了多個硬體模組與 MQTT 網路通訊,主要實現了「本機智慧門禁驗證」、「遠端物聯網控門與回報」以及「智慧省電節能」三大核心功能。
一、 核心功能總覽
多重驗證解鎖(控制 Servo 馬達):
RFID 刷卡驗證: 讀取 MFRC522 卡片 UID,若匹配本機白名單卡號(如
01020304、11223344、55667788、AABBCCDD、04112233445566、C0FFEE99),即驅動伺服馬達旋轉 90 度開門 3 秒。Keypad 密碼驗證: 透過 4x4 鍵盤輸入 8 位數密碼,若為
88888888則觸發開門 3 秒。工作證號輸入: 按下
#鍵可進入工作證模式(格式為#+ 8 碼數字)。
MQTT 物聯網雙向通訊:
即時發行數據 (TX):
刷卡時將 UID 發送至
alex9ufo/2026/RFID/RFID_UID。輸入密碼、工作證號或按下門鈴時,發送至
alex9ufo/2026/RFID/RFID_PICC(如門鈴觸發發送DOORBELL_RING)。
遠端訂閱控制 (RX): 訂閱
alex9ufo/2026/RFID/CONTROL主題,當接收到"open"、"1"或"true"等指令時,可直接遠端驅動馬達開門。
HC-SR04 自動感應與省電:
當偵測到前方的障礙物/人體距離小於 50 cm 時,自動點亮 16x2 LCD 背光並顯示操作選單。
若超過 10 秒 無人靠近,自動關閉 LCD 背光以達省電與保護螢幕效果。
門鈴與周邊警報回饋:
Pushbutton 門鈴: 按下接於 GPIO 34 的門鈴按鍵時,顯示提示文字並觸發 MQTT 門鈴通知(採用去彈跳與邊緣觸發機制,避免重複發送)。
Buzzer 聲響引導: 驗證成功發出高音短嗶聲,驗證失敗發出低音警告聲。
二、 硬體腳位配置表
| 模組元件 | 功能說明 | ESP32 GPIO 腳位配置 | 備註 / 特殊說明 |
| MFRC522 | RFID 讀卡器 (SPI) | SDA(SS)=5, SCK=18, MOSI=23, MISO=19, RST=4 | 標準 VSPI 介面 |
| LCD 16x2 | 系統狀態顯示 (I2C) | SDA=21, SCL=22 | I2C 預設位址 0x27 |
| HC-SR04 | 超音波人體感應 | TRIG=16, ECHO=17 | 測距範圍 < 50 cm 自動喚醒 |
| Servo Motor | 門鎖模擬馬達 (PWM) | PWM=2 | 0 度關門 / 90 度開門 3 秒 |
| 4x4 Keypad | 密碼與工作證輸入 | R1~R4: 26, 25, 33, 32 / C1~C4: 13, 12, 14, 27 | 矩陣式掃描鍵盤 |
| Pushbutton | 實體門鈴按鈕 | GPIO 34 | Pure Input 腳位,須外接 10k 電阻上拉至 3.3V |
| Buzzer | 提示音蜂鳴器 | GPIO 15 | 提供成功與失敗聲響回饋 |
MQTTX 是一款由 EMQ 團隊開發的開放原始碼、跨平台 MQTT 5.0 桌面與 CLI/Web 客戶端測試工具。在開發 ESP32、樹莓派或 Node-RED 等 IoT 物聯網專案時,MQTTX 常被用來模擬裝置、發送控制指令與監測 MQTT Broker 的訊息傳輸。
其主要核心功能如下:
跨平台與多種型態支援
桌面版 (Desktop): 提供跨平台 GUI 視窗介面(支援 Windows, macOS, Linux),方便視覺化操作。
Web 版 (MQTTX Web): 免安裝,直接在瀏覽器開啟(
)即可測試通訊。mqttx.app/web CLI 命令列版 (MQTTX CLI): 提供命令列工具,適合整合至自動化腳本或伺服器環境。
完整支援 MQTT 協定版本
完全相容 MQTT v3.1、v3.1.1 以及 MQTT v5.0 協定。
支援 WebSocket (WS / WSS) 及 TCP/TLS 安全加密連線。
多連線同時管理
支援同時建立並管理多個 MQTT 客戶端連線(Client ID)。
可自由切換不同的連線分頁,方便模擬多台硬體裝置同時在線。
訊息訂閱與發行 (Pub/Sub)
訂閱主題 (Subscribe): 輸入如
alex9ufo/2026/RFID/#,可自訂 QoS 等級並接收即時數據訊息。發行主題 (Publish): 指定 Topic(如
alex9ufo/2026/RFID/CONTROL),隨時發送控制 Payload(如open或{"value":true})。
多種 Payload 資料格式解析
支援 JSON、Plain Text、Hex、Base64 與 CBOR 等數據格式。
具備 JSON 格式語法高亮與格式化驗證功能,避免發送錯誤的 JSON 封包。
腳本與自動化測試 (Scripting)
支援撰寫 JavaScript 腳本,可在發送或接收訊息時進行數據轉換(例如:將 RAW Data 自動格式化)或模擬大量自動化測試數據發送。
日誌與歷史紀錄
自動保存連線與訂閱歷史,方便下次直接開啟測試。
內建日誌檢視器,可輕鬆除錯連線失敗或被 Broker 中斷(Disconnect)的原因。
Node-RED 門禁監控中控台主要實現了「MQTT 數據監聽」、「SQLite 資料庫自動儲存」、「Web UI 歷史紀錄呈現」以及「遠端開門指令控制」四大功能。
一、 核心功能與運作流程
MQTT 數據自動監聽與格式化:
自動連線至 MQTT Broker (
broker.emqx.io:1883)。訂閱主題:
alex9ufo/2026/RFID/RFID_UID:接收 ESP32 傳來的刷卡 UID,自動格式化標示為[UID] <卡號>。alex9ufo/2026/RFID/RFID_PICC:接收 Keypad 輸入密碼、工作證號或門鈴觸發訊息,格式化標示為[PICC/Keypad] <內容>。
SQLite 資料庫儲存管理 (
mqtt.db):自動初始化: 系統啟動時自動檢測並建立
rfid_logs資料表(若不存在)。自動寫入機制: 每當收到新的 MQTT 數據,自動擷取當下的日期(
date)與時間(time),寫入資料庫中。欄位結構:
id:主鍵,自動從 1 開始遞增(INTEGER PRIMARY KEY AUTOINCREMENT)。mqtt:格式化後的 MQTT 訊息內容。date:記錄日期(格式:YYYY-MM-DD)。time:記錄時間(格式:HH:MM:SS)。
Web Dashboard 介面與最近 30 筆歷史呈現:
提供視覺化網頁介面(路徑為
/ui)。資料庫新增紀錄後,會立即執行 SQL 查詢
SELECT ... ORDER BY id DESC LIMIT 30,並將最新的 30 筆通行歷史紀錄即時更新顯示於網頁表格(ui_table)中。
遠端開門控制 (Remote Control):
Dashboard 提供一個 「🔓 遠端開門 (Open Door)」 按鈕。
點擊按鈕時會同時觸發兩項動作:
向 MQTT 主題
alex9ufo/2026/RFID/CONTROL發送指令"open"驅動 ESP32 Servo 馬達開門。在 SQLite 資料庫中主動寫入一筆
mqtt欄位為"RFID/CONTROL"的紀錄並同步更新至表格。
二、 Node-RED 節點功能對照表
| 節點名稱 / 類型 | 節點功能說明 |
| Inject (啟動時建立資料表) | 系統部署/啟動時自動發出觸發訊號,執行資料庫建表。 |
| MQTT In (UID & PICC) | 訂閱 ESP32 發出的刷卡與鍵盤/門鈴訊息。 |
| Function (格式化與 SQL 插入) | 將接收到的訊息加上前綴、取得目前日期時間,並組合為 INSERT INTO 的 SQL 語句。 |
| UI Button (遠端開門按鈕) | Dashboard 網頁上的控制按鈕,按下即發出開門動作訊號。 |
| MQTT Out (Control Out) | 將 "open" 開門指令發布至 MQTT Broker 供 ESP32 接收。 |
| Function (紀錄遠端開門) | 生成寫入 "RFID/CONTROL" 紀錄的 SQL 語句。 |
| SQLite (mqtt.db 處理) | 執行 INSERT / CREATE TABLE 指令並連結至 SQLite 檔案 mqtt.db。 |
| Function & SQLite (查詢 30 筆) | 執行 SQL 查詢倒序取得 ID 前 30 筆的最新紀錄。 |
| UI Table (歷史紀錄表) | 在網頁 Dashboard 上繪製並即時展示 4 個欄位 (ID, MQTT, Date, Time) 的動態表格。 |
mqtt.db)。主要功能特色
資料庫與結構管理 (Database Structure)
視覺化建表: 不需要輸入複雜的 SQL 指令,直接點選介面就能建立或修改資料表與欄位。
欄位屬性設定: 輕鬆設定欄位型態(
INTEGER、TEXT等)、主鍵(PRIMARY KEY)、自動遞增(AUTOINCREMENT)或預設值。索引與觸發器: 支援建立 Index 提升查詢速度,以及設定 Trigger 自動化邏輯。
數據瀏覽與即時編輯 (Browse Data)
類 Excel 操作: 以直觀的表格方式顯示資料,可直接雙擊儲存格修改數值。
數據過濾與排序: 支援在各欄位頂部直接輸入關鍵字過濾,或點擊欄位標題進行升降冪排序。
新增與刪除列: 點選按鈕即可手動新增或刪除資料筆數。
SQL 語法執行與測試 (Execute SQL)
獨立 SQL 編輯器: 提供語法高亮與自動補全功能,方便撰寫並測試
SELECT查詢指令。多分頁與歷史紀錄: 可同時開啟多個 SQL 分頁,並保存查詢過的歷史指令。
資料匯入與匯出 (Import / Export)
CSV 格式支援: 支援將 SQLite 資料表匯出為 CSV 檔,或將現有的 CSV 檔案直接轉入為 SQLite 資料表。
SQL Dump 備份: 可將整個資料庫架構與數據資料匯出為文字格式的
.sql備份檔。
安全變更機制 (Write / Revert Changes)
無痕預覽: 在介面上做的任何修改不會立即寫入硬碟。點擊「Write Changes」(儲存變更)才會正式寫入檔;若操作錯誤點擊「Revert Changes」即可安全還原。
Python + Tkinter 視窗監控與控制程式主要實現了「MQTT 通訊監聽」、「SQLite 本地資料庫自動儲存」、「Tkinter GUI 視覺化表格呈現」以及「遠端開門指令觸發」四大功能。
一、 核心功能與運作流程
MQTT 數據自動監聽與格式化:
背景執行
paho-mqttClient,連線至broker.emqx.io:1883免費 MQTT Broker。訂閱主題:
alex9ufo/2026/RFID/RFID_UID:接收 ESP32 傳來的刷卡卡號,自動加入[UID]前綴。alex9ufo/2026/RFID/RFID_PICC:接收 Keypad 輸入密碼、工作證號或門鈴觸發訊息,自動加入[PICC/Keypad]前綴。
SQLite 本地資料庫儲存 (
mqtt.db):自動建立資料表: 程式啟動時會檢查並自動建立
rfid_logs資料表(若檔案不存在則自動創建)。自動寫入機制: 當接收到 MQTT 訊息時,即時擷取系統當下的日期(
date)與時間(time),寫入資料庫中。欄位結構:
id:主鍵,從 1 開始自動遞增(INTEGER PRIMARY KEY AUTOINCREMENT)。mqtt:格式化後的 MQTT 訊息內容(如[UID] AABBCCDD或RFID/CONTROL)。date:記錄日期(格式:YYYY-MM-DD)。time:記錄時間(格式:HH:MM:SS)。
Tkinter GUI 介面與最近 30 筆歷史呈現:
使用 Tkinter 繪製
680x520尺寸視窗,並附帶動態Treeview表格與垂直滾動條。每當有新資料寫入時,主程式會執行 SQL 查詢
SELECT ... ORDER BY id DESC LIMIT 30,將最新的 30 筆通行歷史紀錄即時更新繪製在視窗表格上。
遠端開門控制 (Remote Control):
介面右上角提供 「🔓 遠端開門 (Open Door)」 按鈕。
點擊按鈕時觸發兩項操作:
透過 MQTT 發送指令
"open"至主題alex9ufo/2026/RFID/CONTROL,遠端驅動 ESP32 Servo 馬達旋轉 90 度開門 3 秒。在 SQLite 資料庫中寫入一筆
mqtt欄位為"RFID/CONTROL"的操作紀錄,並即時刷新介面表格。
二、 程式類別與架構對照表
| 程式區塊 / 類別 | 功能說明 |
| DatabaseManager | 專責 SQLite 資料庫操作(建立 mqtt.db、寫入資料、讀取最近 30 筆紀錄)。 |
| RFIDConsoleApp | Tkinter 主介面類別,負責 GUI 元件建置、MQTT 事件監聽與資料表格動態更新。 |
| on_connect() | MQTT 成功連線的回呼函數,負責訂閱 RFID_UID 與 RFID_PICC 主題。 |
| on_message() | 接收 MQTT 訊息的回呼函數,負責解析 Payload、格式化字串並呼叫 DB 寫入與 GUI 刷新。 |
| send_open_command() | 點擊「遠端開門」按鈕時觸發的函數,發送 open MQTT 指令並記錄 RFID/CONTROL 至 DB。 |
| refresh_table() | 清空當前 Treeview 表格,並從 mqtt.db 讀取最近 30 筆最新資料填入表格中。 |













沒有留言:
張貼留言