近期媒體新寵兒莫過於IoT啦!而NBIoT在使用上除了功耗、訊號覆蓋、基地台容納數有優勢外,更能取代過去透過WiFi、Bluetooth等方式連線的物聯網裝置,像是在窮鄉僻壤的農園環境中,依靠NBIoT模組就能輕鬆(又客家)的實踐農作物的數據監測!
今天將手把手帶著各位,用「五大步驟」實作具光照度監測功能的物聯網裝置,完成後就可以放在自家小菜園內,透過搜集各個時間點的光照度數據並回傳至Adafruit IO(免費IOT平台,介紹及使用方法可參考這篇 5步驟輕鬆上手Adafruit IO平台! ,搭配光照度觀察植物的生長環境變化;家裡沒有菜園的朋友可以放在陽台植栽內,還是沒有的話就放小孩書桌旁,自製的低成本讀書監視器就這麼誕生了(說笑)!
目標功能
使用Raspberry Pi讀取照度(lux),並透過am7020 MQTT發送到Adafruit IO供遠端查看。
所需材料
-
AM7020(NBIoT Module,含sim card)
-
Raspberry Pi 3(os為Raspbian,安裝Raspbian可參考網路教學文章)
-
Tsl2561(光照度感測器)
-
杜邦線數條
材料說明
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安裝套件,輸入以下指令進行安裝。
-
安裝am7020 套件,執行:
sudo pip3 install -i https://test.pypi.org/simple/ am7020 |
-
安裝tsl2561套件,執行:
sudo pip3 install tsl2561 |
4.啟用Raspberry Serial & I2c
點選螢幕左上方的樹莓派圖示,選擇「偏好設定」>「設定樹莓派」,在Interfaces頁面將I2C跟Serial Port啟用,點選OK後重新啟動Raspberry Pi即可。
5.程式說明
程式碼請參閱Github(https://github.com/JiekangHuang/am7020_raspberry/blob/main/iot_am7020.py)。
AM7020這個套件支援MQTT以及HTTP;這次是以MQTT作通訊協定,所以只要是支援標準MQTT(e.g.mosquitto)的Broker都可以使用AM7020 module搭配AM7020這個套件做使用。
範例程式第29行需要傳入三個參數:
-
Serial port(預設為"/dev/ttyS0")。
-
Baudrate(raspberry pi與am7020之間溝通的速度)。
-
重啟腳位(套件會依照這個腳位去控制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的數值以圖形化的方式即時顯示。