物聯網沒有Wi-Fi該怎麼辦?NB-IoT來幫你!使用BlocklyDuino實現願望!

一、介紹

物聯網應用範圍日漸廣泛,小到手錶大到各種家電甚至汽車,可見連接網際網路的好處非常之多,即時監控、記錄、統計裝置各種資訊,甚至遠端控制都可以快速達成,但這都必須以「有網際網路」作為前提。目前物聯網裝置通訊方式大多採用Wi-Fi 無線網路,它擁有高速、大流量的優點,但同時也存在著基礎建設較麻煩、訊號覆蓋範圍短的缺點,應用範圍如智慧家電(e.g.電視、冰箱、照明燈、風扇等);而需要時常移動的裝置則會採用4G/5G網路,具有高速、大流量、基礎安裝方便等優點,但相對它的資費較為昂貴、續航力較低(e.g.手機)。

因此,除了採用前述兩種通訊方式外,我們還可以選擇目前物聯網盛行的NB-IoT(Narrowband Internet of Things)通訊方式,它是建立在LTE 基地台基礎之下,與4G/5G一樣透過電信商的基地台通訊,省去自行維護及建置基礎建設的流程,並且具有流量不需要太大、較便宜的資費、方便的基礎建設以及省電的特性,例如:在郊區收集大量感測資料並上傳至雲端分析。

那麼我們該如何實際使用NB-IoT 呢?本篇文章就要帶大家實作NB-IoT 物聯網裝置,將感測器資料透過NB-IoT 模組上傳至雲端平台,並且透過雲端平台遠端控制裝置RGB LED。其中我們使用了 Linkit7697 結合OLED、PM2.5懸浮微粒感測器PMS5003NB-IoT模組AM7020以及相關擴展板來完成此次的NB-IoT 專案;軟體的部分使用BlocklyDuino,它提供了圖塊式的程式設計方式,對於初學者來說更加容易理解與實作。

● 材料清單

二、BlocklyDuino使用教學

安裝程式

在BlocklyDuino的大家庭中,我們使用的是與劉正吉老師、法蘭斯老師一起合作的BlocklyDuino F1,並統一由劉正吉老師做整合,相關的安裝方法請參閱吉哥的分享-如何安裝吉哥自製積木,大致上分成幾個步驟,如下所示:

1. 下載BlocklyDuino V3主程式、其他的「開發板核心函式庫」與老師們獨立製作的「擴充積木包」,共三個壓縮檔案。

2. 接著將這些壓縮檔解壓縮後,依序將「開發板核心函式庫」與「擴充積木包」資料夾內的檔案,複製並覆蓋到BlocklyDuino V3的資料夾內。

3. 完成上述步驟即完成BlocklyDuino F1的安裝,若您之前已安裝過BlocklyDuino F1,為了新增5G Wi-Fi的功能,只需下載新的「擴充積木包」,並同樣解壓縮覆蓋即可,如下圖所示:

4. 最終完成圖

完成圖

三、NB-IoT 到底是什麼?

(一)NB-IoT 介紹

NB-IoT特點

NB-IoT是窄頻物聯網(Narrowband Internet of Things)的簡稱,使用的是長期演進技術(LTE)標準的一部份,是由3GPP訂定的LPWAN無線電標準,為了讓行動設備及服務的範圍可以更遠,NB-IoT特別著重在室內的覆蓋率、低成本、長電池壽命以及高連接密度。

如下圖所示,可將物聯網架構分成三層,即「感知層」、「網路層」、「應用層」。「感知層」負責收集各種感測資料(e.g.使用Arduino結合SHT31溫溼度感測器);「網路層」提供各種傳輸資料方式,能進一步將感測資料傳遞到雲端伺服(e.g. NB-IoT、Wi-Fi、4G、5G等);「應用層」則是取得伺服器感測器資料並進一步應用在各種需求上。

有了架構定義之後我們就能知道NB-IoT屬於網路層,與WiFi、4G/5G同樣是一種提供傳輸資料的通訊方式。

物聯網架構

下圖列出了目前市面上的物聯網通訊的速度及傳輸距離,其中NB-IoT分類為LPWAN(Low-Power Wide-Area Network,低功率廣域網路),是一種用在物聯網(例如以電池作為供電來源),可以用低速率進行長距離通訊的無線網路,它的特性非常適合運用在環境監測、智慧建築、智慧停車等長距離傳輸、低功耗、低速率的應用上。

物聯網通訊的速度及傳輸距離圖表

下圖為各種LPWAN的比較圖,其中NB-IoT與4G同樣屬於國際標準,相比4G雖然速度慢了許多,但訊號強度更強、模組成本低、並且非常省電,電池運作時間可長達10年。

LPWAN比較圖

了解NB-IoT資費也是重要的一環,以下圖表大略計算了NB-IoT的每月資費以及參考情境,參考情境使用MQTT通訊協定,一個資料點可以看作一個感測器所上傳的數值,使用者可以根據這些情境大約估算每月資料用量。

NBIo-T月費與參考情境

(三)特性與應用

以下整理出NB-IoT的特性與應用供大家參考:

1. 特性

  • 超低電耗
  • 較低的模組成本
  • 不需要自建基礎建設
  • 需要支付月費
  • 有基地台之處即可使用
  • 基站連線速度慢
  • 不適合移動載具
  • 適合各裝置點分散,並且位於郊區
  • 適合沒有市電的環境

2. 應用

  • 農業物聯網:溫室農棚、花卉、養殖
  • 電力設備監控:電塔 、變電箱、風力機組、太陽能電廠
  • 公用設施:水利設施 、瓦斯水表
  • 智慧城市:智慧共桿 、共享腳踏車停車樁、汽車收費
  • 環境生態:生態保護、環境監控

四、實作NB-IoT 專案

接下來就要與大家分享本篇NB-IoT 實作專案-空氣品質檢測,首先會跟大家介紹本次專案會使用到的材料,接著是專案的硬體裝置連接與程式設定介紹。

(一)材料介紹

1. AM7020 NB-IoT 通訊模組

AM7020 是一款 NB-oT 通訊模組,它在腳位及大小皆能完整相容於Arduino MKR系列產品。內部系統晶片為聯發科MT2625,模組為 SIMCOM 的SIM7020E。採 UART 介面運行 AT Command,更方便中低階處理器使用。

頻段支援台灣三大電信業者,在 SIM卡的選用上更為彈性便利。AM7020 不僅是MIT國產、支援寬電壓輸入外,Grove UART的防呆插槽及附加的 Arduino 範例程式更能讓入門使用者輕鬆跨足NB-IoT領域;兼具低功耗、低成本、覆蓋廣等優勢的AM7020,適用於各種場域的物聯網裝置應用。

AM7020硬體詳細請參考「解密AM7020:6大方向詳解硬體規格

2. 遠傳IoT 定量制SIM 卡

遠傳IoT 定量制SIM 卡

遠傳IoT定量制SIM卡提供30MB流量,超過將自動切斷數據連線,下載速度最高5Mbps,須搭配支援4G 或NB-IoT 之終端設備,因目前要申請NB-IoT SIM卡需要以公司行號身分向電信商提出申請,若一般使用者想嘗試使用NB-oT可以參考此款SIM卡。

3. Circus 7697D

Circus 7697D 雙頻 2.4G/5G (相容 LinkIt 7697)

Circus 7697D 雙頻 2.4G/5G (相容 LinkIt 7697) 特別增加連接5GHz Wi-Fi頻段功能,相較2.4Ghz擁有干擾較少、速度更快的優點,並完全相容之前的LinkIt 7697

4. MbitBot Lite 擴展板

MbitBot Lite 擴展板

MbitBot Lite 擴展板最大特色是具備18650鋰電池供電,並且可透過Micro USB充電,讓專案能獨立穩定運作,其中還提供了多達20Pin的擴充IO,並且輸出電壓支援3.3/5V,板上還內建了兩顆WS2812以及一顆蜂鳴器,使用它作為物聯網裝置底板是非常合適的選擇(詳細硬體說明請參閱MbitBot Lite商品說明)。

5. 7697:bit breakout 擴展板

7697:bit breakout 擴展板
7697:bit breakout 擴展板

7697:bit breakout 擴展板可將 Circus 7697D轉換成micro:bit形式,並且完全相容各種開發環境,在正面還板載兩個按鈕及1.3吋的OLED,讓使用者能夠做出更多有趣的應用。

6. PM2.5 濃度感測器 PMS5003

PM2.5 濃度感測器 PMS5003

PMS5003是一款可量測PM1.0、PM2.5、PM10 懸浮微粒的感測器,通訊方式使用UART,設定成自動模式將會主動傳送感測資料,不需被動請求感測資料,下圖表為PMS5003接腳說明,出廠預設為自動模式,最終只需使用到三個IO(VCC、GND、TXD)。

PMS5003接腳說明

(二)實作步驟

1. 硬體接線表順序

首先將18650電池裝入Mbitbot Lite注意正負極標示),接著將Circus 7697D插入7697:bit breakout 擴展板,再將7697:bit breakout 擴展板插入Mbitbot Lite,PMS5003AM7020請對照以下表格連接。

Mbitbot LitePMS5003AM7020
5VPin1 (VCC)V
GNDPin2 (GND)G
IO6Pin5 (TXD)
IO4R
IO11T
IO9EN
接線表

2. AM7020 BlocklyDuino積木使用說明

接下來將詳細說明AM7020 BlocklyDuino各個積木的功能及使用方式。

首先,打開BlocklyDuino並找到左側ICSHOP裡面的AM7020積木,點開後如下圖所示:

紫色區塊為AM7020 NB-IoT相關積木,負責將AM7020初始化,並連接到電信商基地台。

藍色區塊是專為AM7020量身打造的MQTT積木。

以下將依照上圖中的編號說明各個積木的功能及參數:

1. 初始化AM7020 模組,Baud(鮑率)推薦選擇115200,內部已將UART設定為7697 Serial1(Hardware Serial,7697 IO6、IO7);重起腳位對應到AM7020 模組EN Pin(用來控制AM7020 Hardware Reset);此積木只需執行一次。

2. 連線到NB-IoT 基地台,選擇對應的電信商即可,此積木只需執行一次。

3. 用來檢查AM7020 NB-IoT 是否與基地台連線,回傳是或否,推薦在重複循環裡檢查。

4. 用來將AM7020 NB-IoT重新連線到基地台,若與基地台斷線可使用此積木快速重新連線。

5. 首次連線到MQTT Broker,輸入MQTT Broker位置(字串)、連接埠(整數,一般為1883)、MQTT ID(字串)(注意此ID不可與其他同一Broker內裝置相同,盡量使用任意字串加上隨機亂數組合MQTT ID [e.g. icshop_<隨機亂數>]),若Broker需要帳號密碼(字串)驗證則需填入,否則留空即可,KeepAlive(整數,單位秒)為MQTT 發送Heartbeat的間隔,用來確保與Broker保持連線,此數值可依照Broker規範調整,以AdafruitIO 為例,5分鐘內若都沒有與Broker傳輸一次則Broker將自動與Client斷開連接,即若上傳資料的間隔超過5分鐘,則KeepAlive必須設為低於5分鐘(<300s,建議270s)。

6. MQTT 訂閱主題(字串),須注意此訂閱Qos只支援0

7. MQTT 發布訊息,主題(字串),訊息(字串),須注意此發布Qos只支援0

8. 當收到MQTT 訂閱的主題訊息時會自動執行此積木內的程式(注意須搭配第11項積木),定時呼叫「MQTT處理」積木,只有此積木執行時才會檢查是否收到訂閱資料。

9. 用來檢查MQTT 是否與Broker連線,回傳是或否。

10. 用來將MQTT 重新連線到Broker,若與Broker斷線可使用此積木快速重新連線。

11. 處理MQTT背景程式,負責檢查是否收到訂閱資料並呼叫第8項積木內容;依照第5項積木參數KeepAlive 定時向Broker發送Heartbeat以維持連線狀態(須注意盡量避免過久呼叫此積木,否則將無法即時接收訂閱資料)。

12. 回傳接收到訊息的主題名稱,此積木用來搭配第8項積木,依照主題名稱判斷訊息來源。

13. 回傳接收到的訊息,此積木用來搭配第8項積木。

以上就是關於AM7020 BlocklyDuino積木說明,若是想了解其詳細特性可參考上述說明;如果只是一般使用的話,可依照以下範例程式操作即可。

3. 設定雲端平台

此次專案使用AdafruitIO作為雲端平台,若還沒有使用過此平台的夥伴們,可以先參閱「一次就學會使用Adafruit IO 平台!」文章,裡面從註冊Adafruit IO帳號,到如何建立Group、Feed、Dashboard、取得Username & AIO Key 都有詳細的介紹。

首先要設定Group(群組)與Feed(節點),設定的方式如下圖所示。

接下來是建立Dashboard(儀表板),請參照下圖設定。

4. 程式設計

以上我們為大家介紹了物聯網的概念,與NB-IoT 的特性及用途,並且認識此次專案的各個零件功能與用途,以及了解AM7020積木的使用方式與注意事項,接下來我們將結合前述的資訊及零件完成NB-IoT 專案。

● 目標功能

  1. 將PMS5003 PM1.0、PM2.5、PM10懸浮微粒數值顯示在OLED上。
  2. 將AM7020連線狀態顯示在OLED上(第一行)。
  3. 每分鐘將PMS5003 PM1.0、PM2.5、PM10懸浮微粒數值上傳(Protocol使用MQTT)至雲端AdafruitIO平台。
  4. 使用AM7020 MQTT訂閱兩個AdafruitIO平台顏色選擇器主題,用以控制Mbitbot Lite板上兩顆WS2812 LED燈。
  5. 接收到雲端訊息時,利用蜂鳴器發出「嗶」一聲通知使用者。

程式初始化

在開發板7697初始化裡,我們只需做以下三件事情即可:

1. 建立程式所需變數。
(1)變數timer(無號長整數),初始值0,用來記錄發布訊息的時間間隔。
(2)變數oled_timer(無號長整數),初始值0,用來記錄更新OLED的時間間隔。

2. 初始化Mbitbot Lite上的兩顆WS2812 LED、初始化OLED、AM7020、將AM7020連線到基地台,過程中透過OLED顯示連線狀態(顯示在OLED第一行)。

3. 設定MQTT 各項參數(請務必將MQTT ID、帳號、密碼改為自己的,勿依照下圖範例輸入一樣的資料)並連線到MQTT Broker(範例中使用AdafruitIO)、訂閱兩個顏色選擇器主題(icshop.rgb-l、icshop.rgb-r)、顯示MQTT連線狀態、歸零發布計時器。

● 重複執行

1. 讀取PMS5003感測器資料

2. 檢查AM7020 NB-IoT連線狀態,若斷開連線則更新OLED顯示狀態並重新連線到基地台。

3. 檢查MQTT連線狀態,若斷開連線則更新OLED顯示狀態並重新連線到MQTT Broker,連線完成後重新訂閱主題(icshop.rgb-l、icshop.rgb-r)。

4. 執行MQTT 處理用以即時接收訂閱資料。

5. 檢查是否已到達發布訊息的間隔並發布資料到各主題上(icshop.pm1、icshop.pm2-5、icshop.pm10)。

6. 檢查是否已到達更新OLED的間隔並更新OLED顯示內容(顯示MQTT連線狀態、PM1.0、PM2.5、PM10感測數值)。

處理收到的MQTT訂閱資料

1. 當收到訂閱資料時透過蜂鳴器發出「嗶」一聲(聲音長度300ms)。

2. 判斷消息主題(icshop.rgb-l、icshop.rgb-r)並控制WS2812 LED顏色。

以上就是所有的積木程式碼,讀者可以依照上述程式碼自行操作或直接下載所有範例程式

查看結果

改變燈號顏色

回到雲端平台後我們可以查看PM1.0、PM2.5、PM10感測器資料,長期觀察空氣品質,也可透過右邊兩個顏色選擇器修改裝置上的RGB LED燈顏色;了解了遠端控制的方式後,我們也可將它改為控制其他裝置,例如:郊區的路燈、農田中的灑水器、遮陽簾、排風扇等裝置。

五、小結

NB-IoT 日漸普及化,並且符合國際標準,擁有不需要自建基礎建設等多項優勢,讓我們可以將物聯網裝置任意安裝到各種地方,不再需要擔心網路來源、管理以及穩定性的問題,這些都是由電信商維護,我們只需要把重點放在資料收集、分析及應用上,並且藉由搭配NB-IoT模組AM7020,積木軟體BlocklyDuino 就能輕鬆使用NB-IoT 網路技術,對於初學者來說更加容易上手。如果想要有更進階的應用,也可以參考AM7020 Arduino範例程式,裡面提供更多關於AM7020 NB-IoT的細節,有興趣的讀者也可自行查閱。

以上就是這次關於使用BlocklyDuino 輕鬆實現NB-IoT 物聯網的教學,喜歡我們文章的夥伴們,請繼續支持我們,並且多多分享,你們的肯定是我們繼續努力的最大動力,我們下一篇文章見囉!