thibault.sh
← 部落格

硬體開發之旅:打造 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 秒鐘。

螢幕有兩種模式:「局部更新」和「全畫面更新」。局部更新因為不用重刷整個螢幕,所以速度快多了。我利用這點做了一個「快速」更新模式:

  1. 用局部更新刷出一個全白畫面,清除掉目前的影像。
  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 穿戴式感測器,敬請期待更多更新!