如何使用 Raspberry Pi Pico 實現 IoT 物聯網?

PICO-IOT
PICO-IOT

一、介紹

在上一篇「【開箱文】Raspberry Pi Pico 進階套件教學全攻略」,我們使用Pi Pico 搭配Grove 擴展板以及各種感測器模組,了解各種感測器如何使用及運作,例如:控制LED燈、伺服馬達、蜂鳴器,讀取溫溼度資料等,但因為缺少網路相關模組所以無法將蒐集到的資料上傳雲端,在這個大IoT 時代中什麼都可以沒有,就網路這功能絕不能缺少,這次我們將會使用NBIoT 模組AM7020 來充當網路模組的角色,將蒐集到的資料上傳雲端,完成一個簡易的雲端溫溼度監測站。

二、軟體安裝

軟體安裝與環境設定可參考上一篇「【開箱文】Raspberry Pi Pico 進階套件教學全攻略」的「三、軟體安裝」,裡面包含Thonny IDE的安裝以及MircoPython Firmware的燒錄步驟。

三、硬體配置

我們這次會使用到的模組有SHT3x溫溼度模組1.3吋 OLEDLED燈模組以及AM7020 NBIoT網路模組,接線方式如下對照圖表所示。

模組Pi Pico擴展板
AM7020UART0
1.3吋OLEDI2C0
SHT31I2C1
10mm LEDD20

實際功能為將讀取到的溫溼度資料顯示到1.3吋 OLED上,以及定時將資料透過AM7020上傳雲端,並且提供遠端網頁控制LED燈的功能,除了控制LED燈外也可結合繼電器實現控制家電(e.g.電燈、電扇、澆水設備……等 )。

四、雲端設定

這次我們會使用Adafruit IO做為雲端平台,它將會存放溫度、濕度,以及LED燈控制訊息相關資料,並且透過內建服務Dashboard將資料以圖形化方式呈現。

進到Adafruit IO官網新增三個Feed,分別為「temperature」、「humidity」、「led」,如下圖所示(若對Adafruit IO 操作不熟悉可參考「5步驟輕鬆上手Adafruit IO平台!」)。

接著請新增一個Dashboard,名稱為「pico」,如下圖所示。

繼續在pico Dashboard內新增折線圖表以及按鈕開關,折線圖資料來源選擇Feed「temperature」、「humidity」,按鈕開關資料來源選擇Feed「led」,如下圖所示。

五、程式撰寫

本篇所用到的範例程式碼可至下列連結下載。

範例程式碼

(一)載入相關Library

為了簡化程式碼複雜度,我們將會使用AM7020、SHT31、OLED 的MicroPython Library 來處理Driver 的部分,請將這三個Library 預先存入Pi Pico內以便之後主程式呼叫。

首先使用Thonny從本機開啟要存入的檔案,並選擇檔案>>另存新檔>>Raspberry pi pico>>輸入檔案名稱(需與原檔名相同)。(詳細可參考「【開箱文】Raspberry Pi Pico 進階套件教學全攻略」的「(八)溫溼度感測器模組實作」)

Pico Library檔案結構如下圖所示。

第一層為lib資料夾

lib資料夾裡為「am7020」資料夾、「sht31.py」、「ssd1306.py」。

am7020資料夾裡為「am7020_modem.py」、「am7020_mqtt.py」、「am7020_nb.py」。

(二)程式設計

開啟打開範例「example/adafriotIO_pico.py」並執行。

程式碼說明:

1. 引入這次實作所需模組。

2. 建立並傳入I2C1建立SHT31物件,用來讀取溫溼度;建立並傳入I2C0建立OLED物件,用來操作OLED,OLED設定寬高為128*64;建立LED物件,pin設定為20,並設為輸出,用來顯示網頁控制開關狀態。

3. 設定NBIoT 模組所使用的APN、Band(不同電信商會不一樣,此為台灣大哥大,Band 28),設定MQTT相關參數,Broker 使用Adafruit IO,Port 使用1883,帳號密碼請自行修改,設定溫溼度、LED Topic,請務必與雲端設定相同,35行設定資料上傳雲端的間隔,使用者可自行依需求調整,這裡設為30秒上傳一次;建立AM7020、AM7020MQTT物件,用來將資料發送至雲端平台。

4. 定義NBIoT 連線程序,呼叫AM7020 物件init 初始化方法以及nbiotConnect 方法直到成功,接著呼叫waitForNetwork 方法等待連線完成。

5. 定義MQTT 重新連線程序,使用AM7020MQTT 物件的connBroker 方法連線到指定Broker,這裡須注意每個裝置的mqtt_id不可相同,若相同Broker 將會剔除上一次的連線,連線完畢後使用AM7020MQTT 物件的subscribe 方法訂閱LED的 Topic,並傳入callback(於下一段說明),用以接收LED開關狀態。

6. 定義LED資料的Callback,當AM7020MQTT物件收到LED主題資料時就會呼叫此方法,在此方法裡面判斷訊息並控制LED亮滅。

7. 建立檢查連線狀態、發布資料的計時器;將OLED畫面清除並顯示初始化訊息,並等待NBIOT模組初始化成功。

8. 進入無窮迴圈,92~93行讀取溫溼度資料,97~114定時檢查NBIOT以及MQTT的連線狀態,若中間有斷線便會呼叫上面定義的重新連線方法,並透過OLED顯示目前狀態。

9. 透過計時器的方式定時發送溫溼度資料到雲端(預設為30秒上傳一次),發送資料使用AM7020MQTT物件的publish方法,參數帶入目標Topic以及要發布的訊息。

10. 128行使用AM7020MQTT物件的procSubs方法檢查是否有訂閱資料到達;將溫溼度資料顯示到OLED上。

六、執行結果

完成以上步驟,並執行範例程式碼,我們就可以在OLED及雲端上看到溫溼度資料,並且可以直接透過網頁按鈕控制PicoLED燈,如下圖所示。