近期媒體新寵兒莫過於IoT啦!而NBIoT在使用上除了功耗、訊號覆蓋、基地台容納數有優勢外,更能取代過去透過WiFiBluetooth等方式連線的物聯網裝置,像是在窮鄉僻壤的農園環境中,依靠NBIoT模組就能輕鬆(又客家)的實踐農作物的數據監測!

今天將手把手帶著各位,用「五大步驟」實作具光照度監測功能的物聯網裝置,完成後就可以放在自家小菜園內,透過搜集各個時間點的光照度數據並回傳至Adafruit IO(免費IOT平台,介紹及使用方法可參考這篇 5步驟輕鬆上手Adafruit IO平台! ,搭配光照度觀察植物的生長環境變化;家裡沒有菜園的朋友可以放在陽台植栽內,還是沒有的話就放小孩書桌旁,自製的低成本讀書監視器就這麼誕生了(說笑)!

 

目標功能

使用Raspberry Pi讀取照度(lux),並透過am7020 MQTT發送到Adafruit IO供遠端查看。

 

所需材料

  1. AM7020(NBIoT Module,含sim card)

  2. Raspberry Pi 3(os為Raspbian,安裝Raspbian可參考網路教學文章)

  3. Tsl2561(光照度感測器)

  4. 杜邦線數條

 

材料說明

AM7020是一款 NBIoT 通訊模組,使用UART來發送AT Command。建議直接安裝am7020這個Python套件,以省去發送AT Command的繁瑣過程,套件裡也包含HTTP、MQTT等功能,直接使用就可以了。

 

Raspberry Pi需安裝Raspbian作業系統,網路上有許多安裝教學,如果沒有使用過Raspberry Pi的人可以先去了解如何為Raspberry Pi安裝作業系統。

Tsl2561是一款光強度感測模組,支援電壓範圍2.7v~3.6v,所能承受的工作溫度為-30~70度(攝氏),一般夏天炎熱環境也能正常運作;傳輸使用I2C介面,並具有16-bit resolution,可測量0~65535的光照度(lux),在套件的部分支援非常廣,Arduino或Raspberry Pi都很容易找到專屬套件。

 

五步驟手把手教學:

1.設定Adafruit IO

2.硬體接線

3.Raspberry Pi 安裝套件及設定

4.啟用Raspberry Serial & I2c

5.程式說明

 

1.設定Adafruit IO

我們需要為Adafruit IO建一個Group(Pi3)、一個Feed(lux),以及一個供我們查看資料的Dashboard(建立方法可參考這篇5步驟輕鬆上手Adafruit IO平台!)。

建立好的Group會像這樣:

由於室外的光照度都非常高,在Dashboard新增block時,要設定顯示的最大值為30000,顯示單位為Lux(還不會設定的話可以參考這篇5步驟輕鬆上手Adafruit IO平台!)。

建立好的Dashboard會像這樣:

建立完成後我們需要記錄lux這個Feed的MQTT Topic(可在Feed裡面右邊Feed Info找到),我的例子:Zack_Huang/feeds/pi3.lux

 

 

2.硬體接線

Raspberry Pi

TSL2561

am7020

5v

 

V

3v3

Vcc

-

GND

GND

G

SDA(GPIO 2)

SDA

-

SCL(GPIO 3)

SCL

-

UART0 TX

 

R

UART0 RX

 

T

GPIO 18

 

EN

 

 

3.Raspberry Pi 安裝套件及設定

接下來為am7020 module以及TSL2561安裝套件,輸入以下指令進行安裝。

 

  1. 安裝am7020 套件,執行:

sudo pip3 install -i https://test.pypi.org/simple/ am7020

  1. 安裝tsl2561套件,執行:

sudo pip3 install tsl2561

 

 

4.啟用Raspberry Serial & I2c

點選螢幕左上方的樹莓派圖示,選擇「偏好設定」>「設定樹莓派」,在Interfaces頁面將I2C跟Serial Port啟用,點選OK後重新啟動Raspberry Pi即可。

 

 

5.程式說明

程式碼請參閱Githubhttps://github.com/JiekangHuang/am7020_raspberry/blob/main/iot_am7020.py)。

AM7020這個套件支援MQTT以及HTTP;這次是以MQTT作通訊協定,所以只要是支援標準MQTT(e.g.mosquitto)的Broker都可以使用AM7020 module搭配AM7020這個套件做使用。

 

範例程式第29行需要傳入三個參數:

  1. Serial port(預設為"/dev/ttyS0")。

  2. Baudrate(raspberry pi與am7020之間溝通的速度)。

  3. 重啟腳位(套件會依照這個腳位去控制am7020 module是否重啟,對應到am7020 module的EN腳位)。

 

範例程式第48行:使用mqtt物件裡的connBroker方法執行MQTT連線,只要給定MQTT Broker、port(1883)就可以順利連線了,如果有設定username及password的話也請記得要一併給定才能順利連上。

 

範例程式第56行:使用mqtt物件裡的publish方法執行發布訊息命令,只要給定目標Topic(主題)、即可發布訊息至該主題上。

 

範例程式第83行:使用mqtt物件裡的procSubs方法去監聽有沒有遠端資料到達,目前我們只有發布沒有接收。

 

執行範例程式碼iot_am7020.py:

執行: python3 iot_am7020.py

請將第21行MQTT_USERNAME修改為自己的Adafruit IO username,第22行修改為自己的key,第25行修改為之前記下來的MQTT Topic(lux),我的例子: Zack_Huang/feeds/pi3.lux

 

首先透過am7020套件對am7020 module做初始化(連線至基地台以及Adafruit IO MQTT Broker),之後會使用MQTT當作通訊協定連線到設定的MQTT Broker(這裡用Adafruit IO),並且每60秒會將TSL2561讀到的照度發布至我們先前設定的Feed內;而Dashboard則會將lux這個Feed的數值以圖形化的方式即時顯示。

 

 

小結

五個簡單的步驟就能使用Raspberry Pi讀取tsl2561光強度感測模組的數值,並將資料發送至雲端平台;在沒有WiFi的環境下省去建置WiFi的過程及成本,透過NBIoT向基地台發送資料並實現遠端監測光照度的功能,實作NBIoT就是如此輕鬆愉快!喜歡的朋友請大力分享給周遭親友一起入NBIoT坑,有更多想看的文章也歡迎來信許願,各位的支持就是更新的最大動力,我們下回見!