原著:李立源 Lee Lup Yuen/譯者:賴梓仁 Upton Lai
物聯網已經成為我們日常生活中不可或缺的一部份,並在你我的生活周遭默默地運作著,它確保了火車、巴士及計程車能準時到達,也在空氣污染危及人們健康時發出警訊。然而,很少有孩童了解物聯網的概念,像是感測器的原理、如何將感測器連接至網路,以及感測器或感測網路故障時的(可能是損失慘重的)種種後果。
使用 BBC micro:bit 連接 Sigfox 物聯網網路會是一個很好幫助孩子們理解感測器與感測網路如何運作的理想方式。micro:bit 是新式以電池提供電力的感測器裝置典範,上傳的感測資料全都來自於 micro:bit 內建的感測器,包含了溫度、光線強度與加速器等感測資料。而Sigfox 可能是今日用於城市規模測試的感測網路之中,最為便宜的方案。Sigfox 網路已經遍及了全球 50 個國家,所以您的所在地極有可能已經在 Sigfox 網路的覆蓋之內(確認 Sigfox 覆蓋範圍)。
micro:bit 物聯網裝置可以用兩顆 AAA 乾電池提供電力,讓它可以在城市裡的任何一處角落運作,免受於電力與網路的種種限制來將裝置綁定在特定位置。在這篇文章裡,將一步步帶著各位創作出專屬您的 BBC micro:bit 物聯網裝置,而且還能像在下方影片裡看到的一樣,將這個物聯網裝置連接上 Sigfox 網路。
在上方影片裡,我們可以看到Sigfox 後台會即時顯示接收自 micro:bit 上傳的感測資料。舉例來說,接收到的資料 0017 0310 2310 9860 就包含了訊息序號 0017、溫度 31.0、光線強度 231.0 與加速度 986.0(如下圖)。
硬體的準備
製作 micro:bit 物聯網裝置,我們需要以下裝置:
- 附有電池盒的 BBC micro:bit 電路板以及兩顆 AAA 乾電池。
- 給 micro:bit 使用的邊緣連接器分線板。在這篇文章裡,我使用的是 Kitronik breakout board。
- 採用 WISOL 收發器模組製作的 Sigfox 分線板:我們的 micro:bit 將透過 WISOL WSSFM10RxAT 模組傳送感測資料到 Sigfox 網路。
要購買 WISOL Sigfox 分線板的話,可以瀏覽 Sigfox 官方的開發板清單並且點擊「Zone」按鍵來以您的所在區域篩選出合適的產品,例如:射頻配置區域 1(RCZ1)適用於歐洲地區、射頻配置區域 2(RCZ2)適用於美國。

搜尋 SIGFOX 產品時,選擊「Zone」來篩選出適用於你所在區域的產品
選擇以 WISOL WSSFM10RxAT(x字樣是射頻配置區域編號)為核心的分線板,並提供 3.3 V 直流電,而非 5 V。例如,在歐洲,您可以選用 SNOC BRKWS01;在美國,您可以選用 Sea Slug Labs WISOL WSSFM10R 做為分線板(這篇文章是使用此分線板)。可以從 Tindie 市集購買到 WISOL Sigfox 分線板。如果您要使用這款分線板,記得依據您的所在區域挑選正確的 U.FL 天線頻段:

U.FL 天線 — 我是使用圖片上方的那款天線進行測試
- 射頻配置區域 1(RCZ 1)適用於歐洲及中東地區,中心頻率為 868 MHz
- 射頻配置區域 2(RCZ 2)適用於美國,中心頻率為 902 MHz
- 射頻配置區域 3(RCZ 3)適用於日本,中心頻率為 923 MHz
- 射頻配置區域 4(RCZ 4)適用於澳大利亞、紐西蘭及其他亞洲地區,中心頻率為 920 MHz
我已經測試過 RCZ 4 天線(位於圖片最上方的那款天線)。
*重點提醒:供電給 micro:bit 之前,務必確定 WISOL Sigfox 分線板已經有天線連接,否則將有可能毀損 WISOL 模組。
硬體的連接
將 micro:bit 插入邊緣連接器分線板。依據下方圖示來將 micro:bit 邊緣連接器分線板連接到 WISOL Sigfox 分線板。

micro:bit 與 WISOL Sigfox 分線板的連接方式
- micro:bit Pin P0(TX)→ Wisol Pin RX(Blue)
- micro:bit Pin P1(RX)→ Wisol Pin TX(Green)
- micro:bit Pin 3 V → Wisol Pin 3.3 V(Red)
- micro:bit Pin GND → Wisol Pin GND(Black)
連接完成後,我們的物聯網裝置看起來應該像這樣:提供電力的乾電池在左測、U.FL 電路板天線在下側邊緣。這個連結說明了 micro:bit 各個腳位功能。

連接 micro:bit 與 WISOL Sigfox 分線板
取得原始程式碼
點擊下方連接來開啟 micro:bit MakeCode — 用於 micro:bit 的網頁式視覺化程式編輯工具。
1. 點擊右側匯入(Import)按鍵
2. 點擊匯入 URL(Import URL)
3. 輸入網址: https://github.com/lupyuen/microbit-sigfox
4. 載入檔案後,點擊上方的積木(Blocks)來展開視覺化程式界面

這個物聯網程式在 MakeCode 線上編輯器裡會以方塊的型式呈現
程式的設置
在上方的 Setup Sigfox 方塊裡,點擊 COUNTRY 下拉式選單,並選取你所在的國家,這將讓程式使用各別國家的正確設定值來將感測資料並傳送到 Sigfox 網路。
這個方塊同時還指定了感測器名稱 tmp、lig 與 acl,後續,我們將會上傳這些感測數值到 Sigfox 網路。

視覺化程式是以 JavaScript 程式的型式儲存
點擊上方 JavaScript 標籤選單,您會發現視覺化程式實際上是以 JavaScript 程式的型式儲存起來。這一款 JavaScript 類型稱為 Static TypeScript。Static TypeScript 已經針對 micro:bit 進行優化,並且能夠有效率地編譯成機械碼,而點擊積木(Blocks)標籤選單可將畫面切換回方塊模式。

背景運行(Run In Background)方塊用來處理溫度/光線強度/加速器等感測器
讀取感測器
背景運行(Run In Background)上的三個方塊負責定期讀取 micro:bit 內建的感測器,並將感測數值上傳到 Sigfox 網路。
micro:bit 能在幕後同時進行多項工作,我們借助這項多工處理的能力以及每一個感測器的處理邏輯來管理每一個感測器,也因此,我們能以不同的時間間隔來讀取各個感測器。

溫度感測方塊
溫度感測方塊讀取溫度感測器並將溫度感測值指定給 tmp 變數。接著,tmp 變數透過 Send To Sigfox 函式傳送到 Sigfox 網路。函式的第一個參數(tmp)正是我們即將傳送的溫度感測值。
溫度感測方塊會等待 20 秒(也就是 20,000 毫秒),然後才又重覆 當 True(While True)方塊裡的執行步驟。

光線強度感測方塊與加速器感測方塊
光線強度感測方塊與加速器感測方塊用著相同的方式運作,同樣是先讀取 micro:bit 上的感測器,然後在將感測到的數值傳送到 Sigfox 網路,要特別注意的是,感測器名稱 tmp、lig 與 acl 需與 Setup Sigfox 函式裡的參數名稱一致。
感測數值的匯集
Sigfox 是連接物聯網裝置的專用網路,所以它只允許傳送少量且不常發送的訊息–每則訊息最多 12 個位元組、每日最多 140 則訊息。為了達到 Sigfox 訊息傳送的最佳化,我們用三種感測數值組合出一則訊息,並每間隔 20 秒傳送到 Sigfox 網路。
我們的 Sigfox 訊息看起來像是這樣:0017 0310 2310 9860
其中包含:
- 訊息序號(0017)
- 溫度(tmp = 31.0)
- 光線強度(lig = 231.0)
- 加速度(acl = 986.0)
要看看感測數值匯集的 JavaScript 程式碼嗎?可以參考 aggregate.ts。想要學習更多關於感測數值如何匯集,可以參考【Tutorial】Blue Pill 與Sigfox 物聯網串連(下) 中的「Blue Pill 如何執行程式」部分,參考文章中使用了提供溫度、溼度、海拔高度等三項感測數值的 BME280 感測器,而現在我們會用 micro:bit 內建的溫度、光線強度、加速度等感測器做替換。
micro:bit 配對
下載物聯網程式到 micro:bit 之前,我們需要先完成 micro:bit 與電腦的配對。
1. 將 micro:bit 連接到您電腦的 USB 埠
2. 點擊右上方的更多(More)圖示(齒輪狀的那個圖示),然後點擊配對裝置(Pair Device)
3. 點擊配對裝置(Pair Device)對話視窗裡的配對裝置(Pair Device)
4. 在顯示的清單裡,選擇您的 micro:bit,然後點擊 Connect
如果沒有偵測到 micro:bit,可以依循指示更新 micro:bit 韌體後,重覆上述動作。
下載並執行程式
點擊左下方的下載(Download)按鍵來將程式下載到 micro:bit。下載完成後,程式就會開始執行。

左下方的下載(Download)按鍵
稍等一下,顯示監控台 Show Console(Device)按鍵就會出現,然後點擊這個按鍵,要確定不是顯示監控台(模擬器)Show Console(Simulator)按鍵喔。

micro:bit 控制台
我們看到的這些溫度(tmp)、光線強度(lig)與加速度(acl)感測數值的圖表是從程式讀取感測器後即時轉換後繪製出來的。圖表下方是偵錯控制台。偵錯控制台裡顯示著由程式產生的偵錯用訊息,這些訊息有助於程式的除錯,因為它顯示了已經讀取到的感測數值以及 Sigfox 訊息的傳送狀態,需要特別留意這幾行:
這是您使用的這個 WISOL 模組獨一無二的 Sigfox 裝置識別碼(Device ID)與授權碼(Porting Authorization Code),用於開通您的 Sigfox 網路接取,也可以查看偵錯控制台裡的偵錯紀錄範本。
現在我們的 micro:bit 已經燒錄有物聯網程式。無論何時,只要 micro:bit 有透過 USB 界面或是乾電池提供電力,micro:bit 就是一個不斷讀取感測數值並上傳 Sigfox 網路的物聯網裝置。
斷開 micro:bit 與電腦的連接,並且改以乾電池提供電力。現在就來看看由我們的 micro:bit 上傳到 Sigfox 網路的訊息吧。
監看 Sigfox 訊息
依 Sigfox 分線板製作者提供的步驟來線上開通 WISOL Sigfox 模組。您將會一步步被導引至 Sigfox 後台主頁去註冊一個使用者帳號。點擊 Device→Messages 來確認從您的 micro:bit 上傳至 Sigfox 雲端的訊息。這些訊息會在後台接收到 micro:bit 上傳資料的同一時間,即時顯示在螢幕上。如果你發現後台沒有接收到任何訊息,試著將 micro:bit 拿到戶外,若在室外,則讓 micro:bit盡可能靠近窗台。

Sigfox 後台即時顯示接收自 micro:bit 上傳的感測資料
訊息資料(例如 0017 0310 2310 9860)包含訊息序號(0017)、溫度(31.0)、光線強度(231.0)以及加速度(986.0)。
您需要具體化感測器資料嗎?或是符合某些感測資料規則時就觸發警示嗎?這都可以在 Sigfox callback feature 中實現。現在,您有了專屬的物聯網裝置,能用乾電池提供電力,也能從城市的任何一處角落發送感測資料了。
技術上的挑戰 — 串列式的應用程式介面(API)
這一小節我將深入探討在編寫 micro:bit 程式時所遭遇到的一些技術性的問題。
BBC micro:bit 的創作者(包含 Lancaster University)做得非常好,這個micro:bit 平台比我想像得還要豐富許多,來看看這個 micro:bit平台設計。
由於我是使用 Arduino 與 STM32 Blue Pill 開發平台來教授物聯網,所以很難適應某些 micro:bit 才有的限制性功能,串列式的應用程式介面(API)就是其中一例,通常,串列 I/O 會連接到USB埠,如此,我們就能在控制台上看到偵錯訊息。為了傳送指令到 WISOL Sigfox 模組,我不得不將串列 I/O 重新指定到 P0 與 P1 。
這會造成串列應用程式介面的競爭 — 在我與 WISOL 模組溝通時,無法在控制台顯示偵錯訊息,以致於我必須使用訊息佇列來強制串列應用程式介面依序存取,還有一些雜亂無章的程式碼來做連接 USB 與連接 WISOL 的切換。

部分程式碼示意圖,完整程式請按連結
串列 I/O 的切換似乎不太俐落–一些錯亂的資料被傳到了 WISOL 模組,造成某些 WISOL 指令失效而需重送。不像 STM32 Blue Pill 的串列 I/O 擁有獨立的傳輸埠,像是 UART1、UART2。
為了保持程式碼的簡單與具教育性,我採用了serial.readUntil() 函式來讀取WISOL 模組的資料,直到行末找到分隔符號 \r 為止。如果資料變成亂碼會怎麼樣?分隔符號將永遠不會被發現,進而造成訊息在我設計的串列 I/O 訊息佇列中堆積,最終耗盡記憶體並遭強制重新開機。因此,你可能會發現經過一段沒有訊息傳送(或是訊息被截斷)的時間之後,micro:bit 就會重新開機並讓訊息序號從 0 重新計數。
我能用「看門狗」抓到這個問題並盡快讓 micro:bit 重新開機,但是這會使得程式碼更難解讀與維護,所以這篇文章裡的程式碼不適合用在量產型的物聯網裝置上。然而,它也讓我思考,如果我能在 STM32 Blue Pill 與 libopencm3 重現 micro:bit 的運作會怎麼樣?我們真的可以使用 MakeCode視覺化程式編輯工具來為 STM32 Blue Pill 裝置設計出可以量產的程式碼嗎?
這篇文章裡的 Sigfox 物聯網程式碼是從 C++ 移植到可用於 micro:bit 的 Static TypeScript。原先使用在 STM32 Blue Pill 與 Arduino 的 C++程式碼,在先前的文章中已經說明,雖然 micro:bit 不支援全套的多工處理函式,但我還是為 micro:bit 移植了原先用在 STM32 Blue Pill 與 Arduino 平台小部份的 cocoOS 多工處理函式庫。
小結
「藉由物聯網得到更好的生活。」
我在新加坡淡馬錫理工學院的物聯網學生們將要進行孩童物聯網教育的試驗,這是我撰寫這篇文章與編寫這份程式碼的動力。如同我們在這篇文章中所看到的,轉化一下生活中使用得到的感測器情境就能簡單地創作出一個可以用來做為感測網路與物聯網展示用的感測裝置。
借助更好的物聯網教育工具,我期許全世界的人們都能體會到物聯網為我們的日常生活所帶來的改變。
Click here to learn more
*【譯者】賴梓仁 Upton Lai(uptonlai@gmail.com)電子電路設計界的自由工作者,從創客小物到消費性電子產品都有涉略。
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!