Home Assistant 已經能知道哪些垃圾桶(國際讀者稱為 trash cans)該被收走。它可以告訴我今天是垃圾日,在儀表板上顯示正確顏色,並發送提醒。但它無法告訴我,我是否真的把垃圾桶放出去了。

我相信大多數人會在手機上設定定期提醒。正如我妻子會告訴你的,我不是一般人。有些人會像正常人一樣記得把垃圾桶放出去。我很清楚自己過度設計了這件事,但我也遠離正常,六個裝有無線電的垃圾桶對我來說是一種樂趣。

幾年前我曾想過在垃圾桶上貼便宜的藍牙標籤,利用戶外藍牙代理判斷它們是否在附近。結果很挫折,電池耗電快,距離判斷不穩定,代理裝置也不可靠。我想知道垃圾桶是否移動了,但最後只是多了一個玩具。

AirTags 讓我對超寬頻(UWB)無線電產生興趣。深入了解後,我又想起了垃圾桶的點子。過去幾週,我打造了 BinRange:一個固定的無線電基站,六個小型電池標籤,搭配 Home Assistant,結合垃圾桶被偵測到的位置與收集時間。還有列印外殼、自訂韌體和無線更新。這是一個相當完整的「你有把垃圾桶放出去嗎?」解決方案。

整個製作過程我大量依賴 Codex。Astra 在中途推出,我也很好奇它的表現。使用 AI 的好處是能快速將想法付諸實驗,根據結果調整並嘗試新方法。這部分我會在其他文章詳述,現在回到垃圾桶。

我們家有一個一般垃圾桶、一個廚餘桶、一個園藝廢棄物桶、兩個回收桶和一個玻璃桶,總共六個垃圾桶。它們甚至不在同一收集日程上。幸好 Home Assistant 的 Waste Collection Schedule 整合能抓取市政府的收集日程並追蹤,否則管理這些日期本身就是一項工作。

使用便宜藍牙標籤時,估算距離的方法是 RSSI(接收訊號強度指示)。你測量接收到的訊號強度,推估標籤距離。但訊號強度受牆壁、停車車輛、反射、天線方向和硬體差異影響甚大,甚至電池電壓也會影響發射功率。訊號變弱可能是垃圾桶移遠,也可能是有障礙物阻擋,這種估距非常不精確,解釋了我原本系統的挫折。

UWB 有趣之處在於它測量無線電訊號在裝置間傳播的時間,直接得到距離,而非從訊號強度推估。當然訊號還是得穿過環境障礙,換無線電不會讓停車車輛消失。

我也花了一些時間思考學術問題:要增加維度感知,需要多少基站?如果想知道方向或精確位置,需要多少固定參考點來三角定位?這對這個專案完全沒必要,但想法總是會跑遠。

對垃圾桶來說,我只需知道每個垃圾桶是否移動超過平常存放區域的距離,算是「放出去了」。一個基站足夠開始測試。我設定十公尺邊界:裡面是「家裡」,超過是「放出去了」,前提是有新讀取資料。這是我特定的安裝方式,讓我不用把整個花園變成定位測試場。

第一次實驗用兩塊 Makerfabs ESP32-WROVER/DW3000 開發板,兩者都用 USB 供電。還沒跟 Home Assistant 整合前,我想先看看它們能否測距。透過本地網頁介面,我能分開兩板並觀察距離變化,不用拉 USB 線連接。

天線方向影響出乎意料大。在約十公尺距離,將開發板從平放改為直立,成功率從 37% 提升到 100%。較慢的無線電設定和較長的前導碼也能改善初期快速設定的困難。這些發現對後續設計很有幫助。

第一次用捲尺校準,看到報告距離與實際距離誤差不到兩公分時,我完全震驚。兩塊小板子交換無線電訊號,距離竟然能和捲尺這麼接近。

後續測試中,實測 10.1 公尺距離,平均讀數約 10.09 公尺,標準差三公分。這對只需辨識垃圾桶是否離開存放區的專案來說很鼓舞。低於兩公分誤差是第一次校準時的結果,並非所有標籤、方向或戶外位置都能達成。

戶外測試更具啟發性。讀數在約三十公尺內可靠,超過則間歇性出現。最遠讀到 37.28 公尺,但有間斷。汽車可能完全阻擋訊號。手持開發板直立於空曠處,與安裝在垃圾桶邊緣的標籤,測試結果明顯不同。

兩板行走測試建立了有用的起點,但不代表安裝垃圾桶的覆蓋範圍。

基站透過 MQTT 發布讀數,Home Assistant 為每個標籤建立獨立裝置。我考慮過 ESPHome 元件,但對我想要的架構幫助不大。系統不需額外的 BinRange 伺服器或雲端服務,無線電能在 Home Assistant 或 MQTT 連線中斷時繼續測距。

開發板證明了連結可行,但我不想每個垃圾桶都掛一塊開發板,還要電池和臨時外殼。垃圾桶端硬體必須是小巧、獨立的裝置。

我探索過自訂標籤和商用標籤,重要的是能否燒錄自訂韌體並與我的基站配合。小型 UWB 標籤不一定能與其他 UWB 產品相容。我最後買的標籤是 KKM K4W,搭載 nRF52833 處理器、DW3110 無線電和 LIS3DH 加速度計。使用可更換的 CR2477 鈕扣電池(這電池很大顆,我以前沒見過)。

兩塊 Makerfabs 開發板含運費約 123.64 美元。十個標籤每個 25 美元,加上燒錄夾具和運費約 330 美元。這是當時實驗成本,不是現成六桶套件價格,也不適合計算回本期。

供應商說標籤能燒錄我自己的韌體,並提供燒錄夾具。我更在意硬體本身和燒錄接口沒被鎖死,供應商軟體功能對我無關緊要。電池壽命宣稱對我來說沒意義,因為我會決定 CPU 何時睡眠和喚醒條件。

我對 nRF52 裝置相當熟悉,使用多年,從 rlab 時期就開始。它們是優秀的低功耗微處理器,能長時間睡眠。如果排程和中斷設計得當,能用小電池撐好幾年。這比供應韌體做什麼更吸引我。

我用一台備用的 Nesso 裝置當燒錄探針,先燒錄開發標籤,再一個個燒錄成品標籤:燒錄、建立身份、配對、標記、分配給垃圾桶,然後組裝。涉及多重身份,包括標籤印刷標籤、晶片身份和無線電地址。

順帶一提,標籤外殼印有看似唯一的序號和 QR 碼,可能是供應商韌體和軟體用的。我找不到與晶片 MAC 地址或類似識別碼的關聯,對我來說基本沒用。真可惜,如果是無線電 MAC 地址就很實用。

標籤貼在垃圾桶上,電池很大但能剛好放在桶邊緣下方,能防雨。

製造商將加速度計中斷輸出接到 nRF 的 GPIO 腳,這非常有用。代表我可以讓 nRF 長時間睡眠,睡眠期間不發送無線電訊號,只有物理事件發生時喚醒。穩定後,標籤偶爾回報狀態,UWB 無線電在嘗試間隙睡眠。韌體預設靜止時每十分鐘回報一次,我改成三十分鐘,移動時五秒回報一次,透過 Home Assistant 控制。

這樣避免電池因持續回報垃圾桶仍在原地而快速耗盡。實際電池壽命還需測量。我收集電壓和活動資訊,但短期電壓曲線無法準確估算月或年壽命。我也不想用大部分電池壽命來回報電壓,價值不高。

標籤安裝後,每次改韌體都拆開裝回燒錄夾具很麻煩。基站現在能透過藍牙對配對標籤進行簽名韌體無線更新。舊版本應用保留,壞更新可回滾,系統只有在標籤運行預期映像且自我檢查通過後才報告成功。

用 AI 測試和迭代這類功能非常棒。Codex 幫我生成並模擬各種測試條件和故障模式,讓無線更新盡可能安全。我測試損壞映像、中斷傳輸、斷電點和看門狗恢復,也測試基站不在時標籤如何確認自身健康,不會因無法連線而放棄正常韌體。

從一個標籤擴展到多個時遇到新問題。藍牙庫中記錄大小是同時連線數,不是配對裝置數。新增標籤可能失敗,雖然金鑰已存。修正後新標籤能配對且不清除既有標籤。六個垃圾桶讓軟體測試更全面。

我已無線更新基站和六個標籤,無需重新配對或用燒錄夾具。這讓我很滿意。早期連線嘗試需重試,我還想收集更多證據,確認整個流程能可靠自動執行。燒錄探針仍是救援方案。

基站需要外殼,成了另一個小專案。起初用 OpenSCAD 設計螺絲固定。第一次裝配檢查不錯,但小螺母螺絲、PLA 公差和板子晃動讓組裝不理想。

我想要全列印 PLA 外殼,無螺絲:錐形定位銷固定板子,列印彈簧壓住,蓋子能穩固。銷和彈簧有效,但蓋子太鬆。

內部唇緣改善配合度,加深卡榫增強固定,但卡榫太深插入時斷裂。那版本變成兩塊破塑膠。

改用底座和蓋子牆壁重疊,搭配多個淺卡榫。調整定位銷和通風孔後,外殼能穩固固定板子且蓋子不易掉。我很滿意,可能因為之前拉掉太多蓋子。

無螺絲外殼的列印模型。顏色和表面為示意。可從 MakerWorld 列印,設計檔和歷史嘗試在 GitHub。

用 Codex 快速迭代外殼設計很享受:我能優化設計、檢視並列印,然後實際測試蓋子是否會掉。幾何檢查只能確保兩形狀應該配合,無法保證卡榫耐用。

基站現已壁掛,列印外殼放在較大戶外電箱內,與電源元件同箱。這又是一筆 Amazon 訂單。相關元件包括:

那個 USB-C PD 模組很酷,能將 12V 轉成 USB-C 電力輸出,我想再買一個。

以上價格是我訂購時的,不是現行報價。防水箱、電源、USB-C 電源模組、保護裝置、線材和 USB 線,都是為了提醒我把垃圾桶放出去。我知道。

六個垃圾桶都裝上標籤。當時我對系統運作感到樂觀。

基站安裝在牆上,列印外殼放在大電箱內。安裝照片。

Waste Collection Schedule 整合值得大大稱讚。它抓取市政府日程,省去我維護多個重複日期和記憶哪些垃圾桶該收的麻煩。BinRange 補充垃圾桶的實際狀態,Home Assistant 將兩者結合。

一般儀表板顯示下一次收集、垃圾桶狀態和需要注意的事項。距離和無線電診斷有獨立頁面。我喜歡看技術細節,但查明天垃圾桶狀態不該需要解讀無線電訊號。

提醒訊息會合併成一則,針對相關垃圾桶:收集前一天晚上 6 點和 9 點提醒,收集當天早上 6 點若垃圾桶仍在家中再提醒。收集後一天晚上 6 點提醒帶回仍在外的垃圾桶。自動化會記錄嘗試次數,避免重複發送。

無法取得讀數不會被誤判為忘記放垃圾桶。同理,帶回提醒只知道收集日程和垃圾桶仍在外,不知道清潔隊是否已清空。

Home Assistant 提醒放垃圾桶。

我也想要垃圾桶剛清空時的通知。直覺是看移動、時間和收集日程就夠了。但回顧一次收集發現,標籤整天沒回報,這些線索不足以判斷。喚醒計數器能告訴我有活動,但無法知道誰動了垃圾桶或為何。

標籤已有加速度計,我加了更明確的判斷。相對校準的直立位置,持續傾斜超過九十度即記錄傾倒事件。標籤會保存事件,並在下一次連線時回報事件時間。Home Assistant 可將近期傾倒且已放出垃圾桶視為已清空。

最初自動化每五秒檢查一次傾倒事件,太頻繁,改成 MQTT 事件流搭配計時器,只有在有待處理事件時運作。符合條件的垃圾桶會合併通知六十秒,並保存狀態避免重複,支援 Home Assistant 重啟後恢復。定時提醒仍是備援。

Home Assistant 通知垃圾桶已清空,可帶回。

9 月 28 日我有一次園藝廢棄物收集可詳細觀察。垃圾桶約早上 7:05 開始移動,隨後越過十公尺邊界。離開期間無回報。約 10:25 回來時,帶有約 9:27 的傾倒事件,然後回到家中區域並穩定。

標籤偵測並保存了傾倒事件。離開和回來都可見。但傾倒事件在 Home Assistant 收到時已約 58 分鐘前,超過自動化接受的 30 分鐘限制,未發送「剛清空」訊息。其他垃圾桶持續回報,基站 MQTT 無故障。我仍不清楚該標籤在收集點無回報的原因。

這讓我對系統樂觀態度有所修正。無線電能產生可信距離,標籤能偵測傾倒,儀表板看起來正常,但手機仍錯過清空通知。實際收集測試讓我更清楚需注意的問題。

也改變我顯示失聯垃圾桶的方式。原本「放出」讀數過期會變成「未知」,雖然謹慎,但看到垃圾桶離開後在路邊失聯,將「放出」換成「未知」反而不實用。

現行系統會記住觀察到的離開狀態,視為推定「放出」,即使失聯或 Home Assistant 重啟。接收狀況另行顯示。只有在邊界內有新讀數才算回家。若最後一次看到垃圾桶在家,然後失聯,狀態變成「未知」,因為沒看到它離開。帶回提醒可用推定「放出」,放出提醒仍需新證據證明垃圾桶在家。

這讓顯示更貼近我實際知道的狀況。

BinRange 已安裝並使用中。(寫這段時,我意識到我已經嚴重將這個通用工具侷限於垃圾桶應用🤔)

還有一些普通觀察要做:各存放和收集位置的覆蓋範圍、完整週期的通知準確度、電池表現數週、戶外安裝的固定與外殼耐用度。我也希望更新能穩定連線,不用我重試。我並非為他人打造這系統,但若有人受啟發想嘗試或改作他用,他們(或他們的機器人朋友)都歡迎。

倉庫有韌體、外殼檔案、測試結果和 Home Assistant 範例,歡迎參考。這是我的興趣專案,我還在觀察戶外表現。

當然,看過 UWB 功能後,我開始想是否能把標籤掛在貓咪項圈上,家裡放四個基站,繪製牠們位置。能否達到公分級貓咪追蹤?我還沒測試,垃圾桶已證明環境和訊號覆蓋很重要。但我很想試試看。

大多數人可能直接找貓。

本網站觀點為作者個人,不代表其雇主立場。

我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶我如何再次過度設計一個簡單問題:用超寬頻無線電追蹤垃圾桶