iT邦幫忙

2026 iThome 鐵人賽

DAY 17
0

下行控制、上行回報與狀態格式都已完成,今天先驗收沒有網頁的雙大腦系統。

驗收下行控制與回程

先執行 Day 16 程式,Python 啟動後會呼叫一次 on_toggle_led(None, None),MPU 經由 Bridge.call("toggle_led") 要求 MCU 切換 D2。

D2 改變後,MCU 應立即呼叫 Bridge.call("led_status", ledState),Python Console 接著顯示 ON 或 OFF,完整路徑應符合下列順序。

MPU 下命令
→ MCU 執行 toggle_led()
→ MCU 更新 ledState 與 D2
→ MCU 回報 led_status
→ Python 顯示 ON/OFF

這項測試同時驗證下行與回程,若只看到「已要求 MCU 切換 LED」卻沒有狀態文字,表示命令送出後的回報路徑仍需檢查。

驗收時應一次只追蹤一個節點,先確認 Python 是否送出命令,再看 D2 是否切換,最後檢查 Console 是否收到 ON/OFF,這樣可以判斷問題位於下行呼叫、MCU 執行或上行回報,不必同時修改兩端程式。

驗收現場操作的上行路徑

Edge Service 保持運行時,連續按下 D9,每次都應由 MCU 偵測下降緣、處理去彈跳並呼叫 toggle_led(),D2 切換後,Python Console 顯示新的 ON/OFF。

這條路徑沒有先經過 MPU 命令,起點是現場按鈕,但最後仍使用同一個 led_status 回報,證明 MCU 不論收到哪種操作,都會將真正結果送給上層服務。

再將按鈕持續按住兩秒,LED 只能切換一次,Console 也只能新增一筆狀態,若連續出現多筆輸出,應先回頭檢查下降緣與 50 ms 去彈跳是否仍保留。

接著交替進行一次啟動測試與數次現場操作,所有變化都應由 MCU 的 toggle_led() 完成,Python 只顯示 MCU 回報的結果,若上層出現一筆沒有對應 LED 動作的狀態,就代表系統可能存在額外的狀態來源。

驗收 MCU 的獨立能力

暫停 Python 服務後再次操作 D9,D2 仍應正常切換,這是第一階段已通過的能力,加入 Bridge 與狀態回報後也不能被破壞。

MPU 未運作時無法顯示 Console 訊息是正常結果,但現場控制不應因此失效,MCU 仍負責按鈕、ledState 與硬體輸出,上層服務只在可用時接收回報。

移除啟動測試呼叫

下行與上行驗收完成後,刪除 Python 中這一行暫時測試程式。

on_toggle_led(None, None)

移除後重新執行 App,服務啟動時不應自行切換 LED,而是保持等待,這樣未來 Web 事件接上 on_toggle_led() 後,只有真正收到操作命令才會呼叫 MCU。

這個修改不是刪除下行能力,on_toggle_led()Bridge.call("toggle_led") 仍完整保留,只是不再由程式啟動自動觸發,最終版本同時具備可被事件呼叫的入口與不干擾現場狀態的待命行為。

Day 17 的最終 python/main.py 如下。

from arduino.app_utils import App, Bridge

service_name = "Intersection Edge Service"
service_ready = True

def on_led_status(state: bool):
    label = "ON" if state else "OFF"
    message = {"status": label}
    print("LED 狀態:", message["status"])

def on_toggle_led(client_id, data):
    Bridge.call("toggle_led")

Bridge.provide("led_status", on_led_status)

print("Service ready:", service_name)
App.run()

驗收結果要同時符合四條路徑

完成測試後,開機時 Python 應只顯示服務準備完成,按下 D9 時 LED 與 Console 同步變化,暫時加入測試呼叫時 MPU 能要求 MCU 切換,停用 Python 後 MCU 又仍能獨立操作,四種結果缺少任何一項,都不能視為雙大腦整合完成。

階段結束代表可以向上加功能

本次驗收的目的不是證明 LED 還會亮,而是確認加入 Python 與 Bridge 後,第一階段的現場控制沒有退步,第二階段的雙向訊息也有固定入口與唯一狀態來源,只有底層路徑穩定,下一階段的 HTML、CSS 與 JavaScript 才能專心處理畫面,不必再回頭重做硬體責任。

第二階段驗收完成

  • MPU 可以呼叫 MCU 的 toggle_led()
  • MCU 完成切換後會回報真正的 ledState
  • Python 可以將狀態顯示為 ON/OFF。
  • 實體按鈕操作也會進入同一條上行路徑。
  • Python 停止時,MCU 現場控制仍可獨立運作。

現在沒有網頁的雙大腦系統已經完成,命令能下去、狀態能回來,下一篇要建立第一個 HTML 管理頁面,讓維護人員可以從瀏覽器看到控制介面。

下一篇|建立第一個網頁管理頁面


上一篇
Day 16|將硬體狀態轉成可讀資訊
系列文
一塊板子,兩個腦袋:Arduino UNO Q 30 天實戰17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言