硬體開發之旅:打造 pikoAQI 原型
· 10 分鐘閱讀
緣起
我一直很想做個硬體專案,但本身卻完全沒有硬體或電子相關的技術背景。所以我決定邊做邊學,反正我知道 AI 肯定能幫上忙。
這個專案是做一款穿戴式/可攜式的空氣品質感測器。我會選這個題目是因為我自己剛好需要,而且難度也剛剛好:不用自己研發感測器,因為市面上已經有現成的了;但也不會太簡單,畢竟要把好幾個功能塞進小巧的體積裡,還要兼顧低功耗。
採購原型零件
一開始,我向 Claude(我的 AI 助手)說明了我的專案構想,它幫我一起腦力激盪,還挑選了合適的電子零件。
以下是我在電子零件行下的第一筆訂單:
| 零件 | 說明 | 價格 |
|---|---|---|
| NodeMCU ESP32 | 主微控制器板 | 11,92 € 稅前 |
| 電子紙螢幕 2.13 吋 TF060 | 低功耗電子紙顯示器 | 16,58 € 稅前 |
| GPS 模組 TEL0094 | 定位追蹤模組 | 15,50 € 稅前 |
| 邏輯電平轉換器 | 邏輯電平轉換器 | 3,29 € 稅前 |
| 空氣感測器 SDS011 | 空氣品質感測器(PM2.5/PM10) | 29,12 € 稅前 |
| 感測器 BME280 SKU27347 | 溫濕度/氣壓感測器 | 10,42 € 稅前 |
| 感測器 BME680 PIM357 | 具備揮發性有機物 (VOC) 偵測的環境感測器 | 22,00 € 稅前 |
為什麼選這些零件?
- ESP32:入門級但功能強大的微控制器,內建 WiFi/藍牙,體積小巧,而且處理能力足以應付正式產品的需求。
- 電子紙螢幕:功耗極低,只有在更新畫面時才需要耗電,斷電後畫面也不會消失。
- GPS 模組:提供基本的 GPS 定位功能。
- 空氣品質感測器 (SDS011):用來偵測空氣中的懸浮微粒(PM2.5、PM10)。
- BME280/BME680 感測器:測量溫度、氣壓、濕度,以及揮發性有機化合物 (VOC)。
搞定電子紙螢幕
我第一個測試的零件就是電子紙螢幕。但我買的這塊螢幕完全沒有技術文件,只有一個 Arduino 的範例程式碼。我把範例丟給 Cursor 當作參考背景,結果它還真的讓螢幕在我的程式碼裡順利運作了。
這塊螢幕是透過 SPI 介面通訊的。ESP32 開發板照理說有內建 SPI 實作,但我就是無法讓它跟螢幕連線,所以最後我還是沿用了文件範例裡自訂的 SPI 實作方式。
電子紙最大的致命傷就是更新率:它的反應非常慢,整個畫面完全更新一次甚至要花上 2 秒鐘。
螢幕有兩種模式:「局部更新」和「全畫面更新」。局部更新因為不用重刷整個螢幕,所以速度快多了。我利用這點做了一個「快速」更新模式:
- 用局部更新刷出一個全白畫面,清除掉目前的影像。
- 再次用局部更新畫上新的影像。
這種做法偶爾會出現殘影,所以這個快速模式只適用於殘影不影響閱讀的情況。
實測數據:
- 全畫面更新:2 秒
- 「快速」更新:1.1 秒
學到了什麼
- 顯示影像有不同的模式(局部更新 / 全畫面更新)。
- 電子紙螢幕渲染畫面的速度真的很慢。
- 這塊螢幕雖然堪用,但我應該找得到更便宜、反應更快的替代品。
- 我還是得搞清楚為什麼原生的 SPI 跟它不相容。
搞定 GPS
處理 GPS 就輕鬆多了。Claude 知道該怎麼接線,而且文件也直接指向 TinyGPS++ 這個函式庫。
GPS 晶片上的實體 LED 指示燈(POWER 和 PPS)在除錯時也幫了大忙。我第一次測試時 GPS 供電異常(接線出了點問題)。
一開始我一直納悶為什麼抓不到定位資料,後來才知道原來 GPS 需要先同步,而且第一次啟動(冷開機)要花很長的時間(超過 5 分鐘)。我等的時間甚至更久,可能是因為我房間訊號太弱了。
只要 GPS 成功定位,PPS 指示燈就會精準地每秒閃爍一次。這真是個簡單又直覺的設計,讓我馬上明白抓不到定位不是程式碼寫錯,而是 GPS 還在努力同步中。
我買的這塊 GPS 支援 10Hz(一般的 GPS 模組通常是 1Hz),本來是設計給空拍機用的。我根本用不到那麼高的效能。我真正需要的是精準度(即使在室內也能用),還有更親民的價格。下一個原型我會改買更適合的款式。
學到了什麼
- GPS 同步很花時間:冷開機要幾分鐘,暖開機也要 30 秒以上。
- 我不需要 1 到 10Hz 的 GPS,畢竟我又不是在造飛機或高速移動的設備。
- 我需要一個在室內收訊更好的 GPS。
- 我得找找有沒有更便宜但訊號更強的替代方案。
搞定 BME680(空氣感測器)
這顆感測器真的快把我搞瘋了,連線一直出問題。就算是拿範例給 Cursor 看,它也寫不出能用的程式碼。幸好 Adafruit 針對這顆感測器寫了專用的函式庫,我就直接拿來用了。他們家真的出了超多不同感測器的函式庫,非常實用。
這個 VOC 感測器 需要經過校正,而且剛開始數值會一直飄,大概要連續用個 48 小時之後數值才會穩定下來。這在實務上很難做進產品裡,因為一般消費者根本無法輕鬆完成校正。看來我得搭配其他感測器來交叉比對數據才行了。
學到了什麼
- VOC 感測器需要校正。我還沒想到要怎麼幫終端使用者解決這個問題;也許我只會拿它來監控數值的變化趨勢就好。
電池
我研究了一下鋰聚合物 (LiPo) 和鋰離子 (Li-Ion) 電池。LiPo 的外型好用多了,像是筆電、手機這些對體積和重量斤斤計較的穿戴式設備都是用這種。
但問題來了,大多數的 LiPo 電池輸出電壓是 3.7V,但我用的 ESP32 開發板需要 5V。我當然可以升壓,但這會讓電路變複雜,而且也會耗損電力。
電池其實也有潛在危險:它們對外力破壞非常敏感,如果 LiPo 電池被刺破、過熱或過度放電,甚至可能會起火。
所以現階段,我決定先乖乖用一般的行動電源接 USB-C 線就好。
學到了什麼
- 大多數小型的 LiPo 電池輸出都是 3.7V。
- 處理電池時,安全規範和守則絕對不能馬虎。
軟體實作
我最近都在處理軟體端和資料同步的問題。
我的目標是讓 ESP32 扮演低功耗藍牙 (BLE) 伺服器的角色,然後用我的電腦當客戶端來接收資料。
剛開始我連程式碼都燒不進微控制器,因為檔案太大了。爬文之後才發現,預設的 BLE 函式庫根本就是個龐然大物,居然吃掉了 75% 的可用快閃記憶體。後來我改用 NimBLE,檔案大小瞬間少了一半左右,代價是它只支援 BLE,不支援傳統藍牙。這對我來說根本沒差,反正我也沒打算用傳統藍牙。
接下來我還會繼續改良 pikoAQI 穿戴式感測器,敬請期待更多更新!