這是一套結合網站、美編與硬體控制的全自動拍貼機,專為活動現場、展覽或自助服務設計,讓使用者能輕鬆拍照、選擇模板並立即列印成品。系統整合軟硬體,流程自動化,並支援多種互動功能。

🧩 系統原理與架構
本系統以 Python Flask 為後端主體,結合 Arduino 控制投幣與硬體訊號,並透過熱感應印表機完成現場列印。流程自動化,並以 ngrok 實現公網穿透,讓手機可即時上傳照片。
主要流程
- 投幣啟動:使用者投幣 40 元,投幣機將訊號傳給 Arduino,Arduino 透過序列埠(Serial)傳送
coin_ok訊號給主機。 - QRCode 產生與列印:主機收到訊號後,產生唯一 Token 與專屬上傳網址,並生成 QRCode 票券(含說明、Logo、簽名等),自動列印並切紙。
- 照片上傳與模板選擇:使用者掃描 QRCode,進入網頁上傳照片並選擇拍貼模板,支援即時預覽與互動。
- 列印成品:完成後自動將美編照片傳送至印表機列印,現場立即取件。
🔌 技術整合
- Flask 網站系統:提供照片上傳、模板選擇、即時預覽與互動介面。
- 印表機控制:支援多台印表機(如 Xprinter、EPSON),可自動裁切。
- Arduino 投幣與列印指令:硬體負責投幣偵測、列印流程控制與狀態回饋。
- 多種主題模板 + 圖層疊加處理:支援多款拍貼模板,並可自訂圖層與特效。
- 自動 QRCode 產生與票券設計:每次投幣自動產生專屬 QRCode,票券含說明、簽名、直橫排文字、Logo。
- ngrok 公網穿透:自動啟動 ngrok,讓外部手機可連線上傳照片。
- Token 防重複機制:每張票券唯一 Token,防止重複上傳與列印。
- 多執行緒與序列通訊:背景監控硬體訊號,並確保 Token 持久化與執行緒安全。
🛠️ 系統架構
- 前端:RWD 響應式網頁(HTML/CSS/JavaScript),支援手機掃描 QRCode 操作。
- 後端:Python Flask,負責 API、圖片處理、列印指令下發。
- 硬體:Arduino(投幣、訊號控制)、熱感應印表機、顯示模組。
- 通訊:USB/Serial 連接 Arduino 與印表機,HTTP 通訊前後端,ngrok 公網穿透。
⚡ Arduino 與投幣機連接與偵測原理
- 投幣機:將投幣訊號(為用上拉電阻完成脈衝接收)連接至 Arduino 的數位輸入腳位。
- Arduino 程式:偵測到投幣訊號時,透過 Serial(如 COM7, 9600 baud)傳送
coin_ok字串給主機。 - 主機(Flask):背景執行緒持續監控 Serial 埠,收到
coin_ok後自動產生 QRCode 並列印,並可回傳狀態訊息給 Arduino。 - 安全與防呆:主機會記錄已用 Token,防止重複上傳與列印,並於異常時自動復原。
連接示意圖
graph TD;
A[投幣機] -- 投幣訊號 --> B(Arduino);
B -- Serial (coin_ok) --> C[主機 (Flask)];
C -- QRCode 產生與列印 --> D[熱感應印表機];
D -- 列印完成 --> C;
C -- 狀態回傳 --> B;
B -- 控制訊號 --> A;
📂 主要檔案結構
.
├── app.py # Flask 主程式
├── confing.py # 主程式調取的設定
├── static/ # 前端網頁
│ ├── simulate_coin_page.html # 管理員頁面
│ ├── upload.html # 上傳照片頁面
├── templates/ #裡面放不同模板
├── qr_codes/ # 儲存產生的 QRCode 票券
├── uploads/ # 儲存上傳的照片
🚀 特色與未來規劃
- 支援多模板、動態特效與自訂票券設計
- 可以增加雲端備份與下載功能
- 支援多語系介面
- 優化列印速度與美編演算法
- 增加現場狀態顯示與錯誤自動復原