這一輪我們把「浴室暖風機自動控制 + 對時 + 遠端監控」整套路徑走過一遍,核心進展與待辦如下——直白版:
狀態總結
• 產出了一份可讀性高、模組化的整合程式(同檔名 pico_bath_heater_auto_ntp_mqtt.rs),功能涵蓋:
• Wi-Fi 連線(CYW43)
• 時間同步(先 HTTP Date,失敗再 NTP;超時以 with_timeout 包裝)
• 週期感測 HTU21D(每 15s)
• 週期 MQTT 發佈(固定踩點 60s),發佈前會印出時間與將要送出的主題/長度
• 暖風機電流測量介面預留(可從 ADC 讀、目前先以 debug 形式輸出)
• 各子功能可用常數開關
• 重點修補/避坑:
• 修正 embassy-net::Stack 的泛型與生命期用法(移除多餘型參,該傳參數的地方傳 &Stack 或 Stack 正確型別)
• 移除造成 E0726/E0107 的舊式宣告
• UdpSocket/TcpSocket 以靜態緩衝區(static/StaticCell)確保 'static 壽命,避免 E0597
• NTP/HTTP 超時改 with_timeout,不再使用不存在的 set_timeout
• HTU21D 讀取改成直接的 async 程式碼,移除捕捉 &mut i2c 的 async 閉包(解決「captured variable cannot escape FnMut」)
• defmt 不再用 {:.2} 這類格式(defmt 不支援),改印整數(centi/decimals)或使用 {:u32}
• MQTT 封包:CONNECT/CONNACK/PUBLISH 路徑最小化,送前/失敗都會 log
你遇到過、我們處理過的錯誤點
• http_date_poll/ntp_once:錯把 Stack<Driver> 當成帶型參用;已修成 Stack<'d> 生命期,並正確借用
• TcpSocket::write 回傳 usize,不是 ();寫入後轉為 Result<(), ()> 或檢查長度
• StaticCell 重複初始化造成 panic;統一集中初始化、避免二次 init
• PioSpi::new 參數順序/型別(SM、IRQ、CS/DIO/CLK、clock_div);依 cyw43-pio 目前 API 校正
• DMA_IRQ_0 => …::dma::InterruptHandler:不同版本的 Embassy 對 IRQ handler type 路徑不同,需對齊你專案實際版本
• defmt 格式子:用 {}/{:u32} 等,而非 {:.*} 小數格式
NanoMQ 端
• SQLite 持久化:提供了 pico_telemetry 的 CREATE TABLE + CREATE TRIGGER,以及 rules.sqlite 範例。
• 監控封包:可用 nanomq_cli sub -h 127.0.0.1 -p 2883 -t 'lab/picoW/#' -q 0;若 Connection refused,八成是服務沒起來或防火牆阻擋,或連錯協定(TCP vs WS)。
仍需你現場對齊的地方(會因版本差異而報錯)
• bind_interrupts! 裡 InterruptHandler 的路徑:請對齊你目前 embassy-rp 版本(有時是 embassy_rp::i2c::InterruptHandler、有時是 embassy_rp::pio::InterruptHandler)。
• PioSpi::new(...) 簽名:不同 cyw43-pio 版本參數順序略有差異;若編譯器提示參數錯位,依提示調整順序(SM/clock_div/IRQ/CS/DIO/CLK)。
• 若還看到 static_mut_refs 警告:可接受;要完全清零,得把 socket buffer 換成 StaticCell<[u8; N]> + init,或使用 embassy 的 SocketStorage(需要更多結構改動)。
現在的行為(照這版設計)
• 感測:每 15 秒讀 HTU21D,印 temp/rh。
• 發佈:每 60 秒固定踩點發佈;發佈前印現在 Instant(ms) 與 topic 長度;發佈失敗會印 PUBLISH failed。
• 電流測量:暫以 debug 位址/模擬值印出;接上 3.3V 分壓(你手邊 10k/5k 可),ADC 讀值換算部分已留鉤子。
推進建議(務實)
1. 先把 InterruptHandler 路徑與 PioSpi::new 參數,對齊你當前 embassy-rp/cyw43-pio 版本;這是編譯期唯一可能還不一致的地方。
2. 確認 NanoMQ listeners.tcp 在 2883 啟動,nanomq_cli sub -h 127.0.0.1 -p 2883 -t 'lab/picoW/#' -q 0 能看到訊息。
3. 若仍有偶發 PUBLISH failed:在 broker 端開啟 info/debug log 看 DISCONNECT/keepalive,並在裝置端把 keepalive 週期調整為 KEEP_ALIVE_S = 30(更保守)。
4. 要把 static_mut_refs 警告清乾淨,再迭代成 StaticCell/SocketStorage 配置(純風險治理,不影響功能)。
你要更精簡或更激進(零警告)版,我可以直接出手收斂;要把電流測量換成實際 ADC 公式也沒問題。
6YCZ5LiA6Lyq5oiR5YCR5oqK44CM5rW05a6k5pqW6aKo5qmf6Ieq5YuV5o6n5Yi2ICsg5bCN5pmCICsg6YGg56uv55uj5o6n44CN5pW05aWX6Lev5b6R6LWw6YGO5LiA6YGN77yM5qC45b+D6YCy5bGV6IiH5b6F6L6m5aaC5LiL4oCU4oCU55u055m954mI77yaCgoKCueLgOaFi+e4vee1kAoKCeKAognnlKLlh7rkuobkuIDku73lj6/oroDmgKfpq5jjgIHmqKHntYTljJbnmoTmlbTlkIjnqIvlvI/vvIjlkIzmqpTlkI0gcGljb19iYXRoX2hlYXRlcl9hdXRvX250cF9tcXR0LnJz77yJ77yM5Yqf6IO95ra16JOL77yaCgoJ4oCiCVdpLUZpIOmAo+e3mu+8iENZVzQz77yJCgoJ4oCiCeaZgumWk+WQjOatpe+8iOWFiCBIVFRQIERhdGXvvIzlpLHmlZflho0gTlRQ77yb6LaF5pmC5LulIHdpdGhfdGltZW91dCDljIXoo53vvIkKCgnigKIJ6YCx5pyf5oSf5risIEhUVTIxRO+8iOavjyAxNXPvvIkKCgnigKIJ6YCx5pyfIE1RVFQg55m85L2I77yI5Zu65a6a6Lip6bueIDYwc++8ie+8jOeZvOS9iOWJjeacg+WNsOWHuuaZgumWk+iIh+Wwh+imgemAgeWHuueahOS4u+mhjC/plbfluqYKCgnigKIJ5pqW6aKo5qmf6Zu75rWB5ris6YeP5LuL6Z2i6aCQ55WZ77yI5Y+v5b6eIEFEQyDoroDjgIHnm67liY3lhYjku6UgZGVidWcg5b2i5byP6Ly45Ye677yJCgoJ4oCiCeWQhOWtkOWKn+iDveWPr+eUqOW4uOaVuOmWi+mXnAoKCeKAognph43pu57kv67oo5wv6YG/5Z2R77yaCgoJ4oCiCeS/ruatoyBlbWJhc3N5LW5ldDo6U3RhY2sg55qE5rOb5Z6L6IiH55Sf5ZG95pyf55So5rOV77yI56e76Zmk5aSa6aSY5Z6L5Y+D77yM6Kmy5YKz5Y+D5pW455qE5Zyw5pa55YKzICZTdGFjayDmiJYgU3RhY2sg5q2j56K65Z6L5Yil77yJCgoJ4oCiCeenu+mZpOmAoOaIkCBFMDcyNi9FMDEwNyDnmoToiIrlvI/lrqPlkYoKCgnigKIJVWRwU29ja2V0L1RjcFNvY2tldCDku6XpnZzmhYvnt6nooZ3ljYDvvIhzdGF0aWMvU3RhdGljQ2VsbO+8ieeiuuS/nSAnc3RhdGljIOWjveWRve+8jOmBv+WFjSBFMDU5NwoKCeKAoglOVFAvSFRUUCDotoXmmYLmlLkgd2l0aF90aW1lb3V077yM5LiN5YaN5L2/55So5LiN5a2Y5Zyo55qEIHNldF90aW1lb3V0CgoJ4oCiCUhUVTIxRCDoroDlj5bmlLnmiJDnm7TmjqXnmoQgYXN5bmMg56iL5byP56K877yM56e76Zmk5o2V5o2JICZtdXQgaTJjIOeahCBhc3luYyDplonljIXvvIjop6PmsbrjgIxjYXB0dXJlZCB2YXJpYWJsZSBjYW5ub3QgZXNjYXBlIEZuTXV044CN77yJCgoJ4oCiCWRlZm10IOS4jeWGjeeUqCB7Oi4yfSDpgJnpoZ7moLzlvI/vvIhkZWZtdCDkuI3mlK/mj7TvvInvvIzmlLnljbDmlbTmlbjvvIhjZW50aS9kZWNpbWFsc++8ieaIluS9v+eUqCB7OnUzMn0KCgnigKIJTVFUVCDlsIHljIXvvJpDT05ORUNUL0NPTk5BQ0svUFVCTElTSCDot6/lvpHmnIDlsI/ljJbvvIzpgIHliY0v5aSx5pWX6YO95pyDIGxvZwoKCgrkvaDpgYfliLDpgY7jgIHmiJHlgJHomZXnkIbpgY7nmoTpjK/oqqTpu54KCgnigKIJaHR0cF9kYXRlX3BvbGwvbnRwX29uY2XvvJrpjK/mioogU3RhY2s8RHJpdmVyPiDnlbbmiJDluLblnovlj4PnlKjvvJvlt7Lkv67miJAgU3RhY2s8J2Q+IOeUn+WRveacn++8jOS4puato+eiuuWAn+eUqAoKCeKAoglUY3BTb2NrZXQ6OndyaXRlIOWbnuWCsyB1c2l6Ze+8jOS4jeaYryAoKe+8m+Wvq+WFpeW+jOi9ieeCuiBSZXN1bHQ8KCksICgpPiDmiJbmqqLmn6XplbfluqYKCgnigKIJU3RhdGljQ2VsbCDph43opIfliJ3lp4vljJbpgKDmiJAgcGFuaWPvvJvntbHkuIDpm4bkuK3liJ3lp4vljJbjgIHpgb/lhY3kuozmrKEgaW5pdAoKCeKAoglQaW9TcGk6Om5ldyDlj4PmlbjpoIbluo8v5Z6L5Yil77yIU03jgIFJUlHjgIFDUy9ESU8vQ0xL44CBY2xvY2tfZGl277yJ77yb5L6dIGN5dzQzLXBpbyDnm67liY0gQVBJIOagoeatowoKCeKAoglETUFfSVJRXzAgPT4g4oCmOjpkbWE6OkludGVycnVwdEhhbmRsZXLvvJrkuI3lkIzniYjmnKznmoQgRW1iYXNzeSDlsI0gSVJRIGhhbmRsZXIgdHlwZSDot6/lvpHkuI3lkIzvvIzpnIDlsI3pvYrkvaDlsIjmoYjlr6bpmpvniYjmnKwKCgnigKIJZGVmbXQg5qC85byP5a2Q77ya55SoIHt9L3s6dTMyfSDnrYnvvIzogIzpnZ4gezouKn0g5bCP5pW45qC85byPCgoKCk5hbm9NUSDnq68KCgnigKIJU1FMaXRlIOaMgeS5heWMlu+8muaPkOS+m+S6hiBwaWNvX3RlbGVtZXRyeSDnmoQgQ1JFQVRFIFRBQkxFICsgQ1JFQVRFIFRSSUdHRVLvvIzku6Xlj4ogcnVsZXMuc3FsaXRlIOevhOS+i+OAggoKCeKAognnm6PmjqflsIHljIXvvJrlj6/nlKggbmFub21xX2NsaSBzdWIgLWggMTI3LjAuMC4xIC1wIDI4ODMgLXQgJ2xhYi9waWNvVy8jJyAtcSAw77yb6IulIENvbm5lY3Rpb24gcmVmdXNlZO+8jOWFq+aIkOaYr+acjeWLmeaykui1t+S+huaIlumYsueBq+eJhumYu+aTi++8jOaIlumAo+mMr+WNlOWumu+8iFRDUCB2cyBXU++8ieOAggoKCgrku43pnIDkvaDnj77loLTlsI3pvYrnmoTlnLDmlrnvvIjmnIPlm6DniYjmnKzlt67nlbDogIzloLHpjK/vvIkKCgnigKIJYmluZF9pbnRlcnJ1cHRzISDoo6EgSW50ZXJydXB0SGFuZGxlciDnmoTot6/lvpHvvJroq4vlsI3pvYrkvaDnm67liY0gZW1iYXNzeS1ycCDniYjmnKzvvIjmnInmmYLmmK8gZW1iYXNzeV9ycDo6aTJjOjpJbnRlcnJ1cHRIYW5kbGVy44CB5pyJ5pmC5pivIGVtYmFzc3lfcnA6OnBpbzo6SW50ZXJydXB0SGFuZGxlcu+8ieOAggoKCeKAoglQaW9TcGk6Om5ldyguLi4pIOewveWQje+8muS4jeWQjCBjeXc0My1waW8g54mI5pys5Y+D5pW46aCG5bqP55Wl5pyJ5beu55Ww77yb6Iul57eo6K2v5Zmo5o+Q56S65Y+D5pW46Yyv5L2N77yM5L6d5o+Q56S66Kq/5pW06aCG5bqP77yIU00vY2xvY2tfZGl2L0lSUS9DUy9ESU8vQ0xL77yJ44CCCgoJ4oCiCeiLpemChOeci+WIsCBzdGF0aWNfbXV0X3JlZnMg6K2m5ZGK77ya5Y+v5o6l5Y+X77yb6KaB5a6M5YWo5riF6Zu277yM5b6X5oqKIHNvY2tldCBidWZmZXIg5o+b5oiQIFN0YXRpY0NlbGw8W3U4OyBOXT4gKyBpbml077yM5oiW5L2/55SoIGVtYmFzc3kg55qEIFNvY2tldFN0b3JhZ2XvvIjpnIDopoHmm7TlpJrntZDmp4vmlLnli5XvvInjgIIKCgoK54++5Zyo55qE6KGM54K677yI54Wn6YCZ54mI6Kit6KiI77yJCgoJ4oCiCeaEn+a4rO+8muavjyAxNSDnp5LoroAgSFRVMjFE77yM5Y2wIHRlbXAvcmjjgIIKCgnigKIJ55m85L2I77ya5q+PIDYwIOenkuWbuuWumui4qem7nueZvOS9iO+8m+eZvOS9iOWJjeWNsOePvuWcqCBJbnN0YW50KG1zKSDoiIcgdG9waWMg6ZW35bqm77yb55m85L2I5aSx5pWX5pyD5Y2wIFBVQkxJU0ggZmFpbGVk44CCCgoJ4oCiCembu+a1gea4rOmHj++8muaaq+S7pSBkZWJ1ZyDkvY3lnYAv5qih5pOs5YC85Y2w5Ye677yb5o6l5LiKIDMuM1Yg5YiG5aOT77yI5L2g5omL6YKKIDEway81ayDlj6/vvInvvIxBREMg6K6A5YC85o+b566X6YOo5YiG5bey55WZ6Ymk5a2Q44CCCgoKCuaOqOmAsuW7uuitsO+8iOWLmeWvpu+8iQoKCTEuCeWFiOaKiiBJbnRlcnJ1cHRIYW5kbGVyIOi3r+W+keiIhyBQaW9TcGk6Om5ldyDlj4PmlbjvvIzlsI3pvYrkvaDnlbbliY0gZW1iYXNzeS1ycC9jeXc0My1waW8g54mI5pys77yb6YCZ5piv57eo6K2v5pyf5ZSv5LiA5Y+v6IO96YKE5LiN5LiA6Ie055qE5Zyw5pa544CCCgoJMi4J56K66KqNIE5hbm9NUSBsaXN0ZW5lcnMudGNwIOWcqCAyODgzIOWVn+WLle+8jG5hbm9tcV9jbGkgc3ViIC1oIDEyNy4wLjAuMSAtcCAyODgzIC10ICdsYWIvcGljb1cvIycgLXEgMCDog73nnIvliLDoqIrmga/jgIIKCgkzLgnoi6Xku43mnInlgbbnmbwgUFVCTElTSCBmYWlsZWTvvJrlnKggYnJva2VyIOerr+mWi+WVnyBpbmZvL2RlYnVnIGxvZyDnnIsgRElTQ09OTkVDVC9rZWVwYWxpdmXvvIzkuKblnKjoo53nva7nq6/miooga2VlcGFsaXZlIOmAseacn+iqv+aVtOeCuiBLRUVQX0FMSVZFX1MgPSAzMO+8iOabtOS/neWuiO+8ieOAggoKCTQuCeimgeaKiiBzdGF0aWNfbXV0X3JlZnMg6K2m5ZGK5riF5Lm+5reo77yM5YaN6L+t5Luj5oiQIFN0YXRpY0NlbGwvU29ja2V0U3RvcmFnZSDphY3nva7vvIjntJTpoqjpmqrmsrvnkIbvvIzkuI3lvbHpn7/lip/og73vvInjgIIKCgoK5L2g6KaB5pu057K+57Ch5oiW5pu05r+A6YCy77yI6Zu26K2m5ZGK77yJ54mI77yM5oiR5Y+v5Lul55u05o6l5Ye65omL5pS25paC77yb6KaB5oqK6Zu75rWB5ris6YeP5o+b5oiQ5a+m6ZqbIEFEQyDlhazlvI/kuZ/mspLllY/poYzjgIIK