一、介紹
使用Pi Pico 搭配擴(kuò)展板以及各種傳感器模塊,再加上網(wǎng)絡(luò)相關(guān)模塊將搜集到的數(shù)據(jù)上傳云端,完成一個(gè)簡(jiǎn)易的云端溫濕度監(jiān)測(cè)站。
二、軟件安裝
安裝Thonny IDE以及MircoPython Firmware的刻錄。
三、硬件配置
我們這次會(huì)使用到的模塊有SHT3x溫濕度模塊、1.3吋 OLED、LED燈模塊以及AM7020 NBIoT網(wǎng)絡(luò)模塊,接線方式如下對(duì)照?qǐng)D表所示。
實(shí)際功能為將讀取到的溫濕度數(shù)據(jù)顯示到1.3吋 OLED上,以及定時(shí)將數(shù)據(jù)透過(guò)AM7020上傳云端,并且提供遠(yuǎn)程網(wǎng)頁(yè)控制LED燈的功能,除了控制LED燈外也可結(jié)合繼電器實(shí)現(xiàn)控制家電(e.g.電燈、電扇、澆水設(shè)備……等)。
四、云端設(shè)定
這次我們會(huì)使用Adafruit IO做為云端平臺(tái),它將會(huì)存放溫度、濕度,以及LED燈控制訊息相關(guān)數(shù)據(jù),并且透過(guò)內(nèi)建服務(wù)Dashboard將數(shù)據(jù)以圖形化方式呈現(xiàn)。
進(jìn)到Adafruit IO官網(wǎng)新增三個(gè)Feed,分別為「temperature」、「humidity」、「led」,如下圖所示。
接著請(qǐng)新增一個(gè)Dashboard,名稱為「pico」,如下圖所示。
繼續(xù)在pico Dashboard內(nèi)新增折線圖表以及按鈕開(kāi)關(guān),折線圖數(shù)據(jù)源選擇Feed「temperature」、「humidity」,按鈕開(kāi)關(guān)數(shù)據(jù)源選擇Feed「led」,如下圖所示。
五、程序撰寫
本篇所用到的范例程序代碼可至下列連結(jié)下載。
https://github.com/JiekangHuang/pi_pico_adafruitIO_nbiot
(一)加載相關(guān)Library
為了簡(jiǎn)化程序代碼復(fù)雜度,我們將會(huì)使用AM7020、SHT31、OLED 的MicroPython Library 來(lái)處理Driver 的部分,請(qǐng)將這三個(gè)Library 預(yù)先存入Pi Pico內(nèi)以便之后主程序呼叫。
首先使用Thonny從本機(jī)開(kāi)啟要存入的檔案,并選擇檔案>>另存新檔>>Raspberry pi pico>>輸入文件名(需與原檔名相同)。
Pico Library檔案結(jié)構(gòu)如下圖所示。
第一層為lib文件夾
lib文件夾里為「am7020」文件夾、「sht31.py」、「ssd1306.py」。
am7020文件夾里為「am7020_modem.py」、「am7020_mqtt.py」、「am7020_nb.py」。
(二)程序設(shè)計(jì)
開(kāi)啟打開(kāi)范例「example/adafriotIO_pico.py」并執(zhí)行。
1 fromutime import ticks_ms, sleep_ms
2 fromam7020.am7020_nb import AM7020NB
3 fromam7020.am7020_mqtt import AM7020MQTT
4
5 importsht31
7 fromssd1306 import SSD1306_I2C
8
9 sht31_i2c= I2C(1, scl=Pin(7), sda=Pin(6), freq=400000)
10sensor = sht31.SHT31(sht31_i2c, addr=0x44)
11
12 WIDTH= 128 # oled 顯示寬度
13HEIGHT = 64 #oled 顯示高度
14
15 # 初始化 I2C 物件 I2C0 SCL =1, I2C0 SDA = GP0
16oled_i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000)
17
18 oled= SSD1306_I2C(WIDTH, HEIGHT, oled_i2c)
19
20 led =Pin(20, Pin.OUT)
21
22 #NBIoT 相關(guān)設(shè)定
23 apn ="twm.nbiot" # 存取點(diǎn)名稱
24 band= 28 # 通訊頻道
25CHECK_NET_INTERVAL_MS = 1000 # 網(wǎng)絡(luò)檢查間隔時(shí)間
26
27#相關(guān)設(shè)定
28MQTT_BROKER = "io.adafruit.com"
29 PORT= 1883
30 MQTT_USERNAME= "
31MQTT_PASSWORD = "
32TEMP_TOPIC = MQTT_USERNAME + "/feeds/pico.temperature"
33HUM_TOPIC = MQTT_USERNAME + "/feeds/pico.humidity"
34LED_TOPIC = MQTT_USERNAME + "/feeds/pico.led"
35UPLOAD_INTERVAL_MS = 30000 # 訊息上傳間隔時(shí)(毫秒)
36
37 nb =AM7020NB(0, 9600, 0, 1, 3, False) # 建立連接對(duì)象
38 mqtt= AM7020MQTT(nb) # 建立 MQTT 通訊對(duì)象
39
40
41 defnbConnect(): # ?訂聯(lián)機(jī)程序
42 print("Initializing modem...")
43 while((not nb.init() or (notnb.nbiotConnect(apn, band)))):
44 print(".")
45
46 print("Waiting for network...")
47 while(not nb.waitForNetwork()):
48 print(".")
49 sleep_ms(5000)
50
51 print(" success")
52
53
54 defreConnBroker(): # MQTT Broker 重新聯(lián)機(jī)程序
55 print("Connecting to",MQTT_BROKER, end="...")
56 if(mqtt.connBroker(MQTT_BROKER, PORT,MQTT_USERNAME, MQTT_PASSWORD, mqtt_id="ICSHOP_AM7020_MQTT_ID")):
57 print(" success")
58 print("subscribe: ",LED_TOPIC, end="")
59 if(mqtt.subscribe(LED_TOPIC,mqttCallback)):
60 print(" success")
61 else:
62 print(" fail")
63 else:
64 print(" fail")
65
66 #MQTT 訂閱內(nèi)容訊息回調(diào)函數(shù)
67
68
69 defmqttCallback(msg):
70 print(LED_TOPIC, ":", msg)
71 if(msg == "ON"):
72 led.on()
73 else:
74 led.off()
75
76
77chk_net_timer = 0 # 聯(lián)機(jī)狀態(tài)查詢周期定時(shí)器
78pub_data_timer = 0 # 訊息發(fā)布周期定時(shí)器
79
80 oled.fill(0) # 清除畫面
81oled.text("Init modem...", 0, 0)
82oled.show()
83
84print("Initializing modem...")
85while(not nb.init()):
86 print(".")
87
88while(True):
89 # show SHT31 data
90 oled.fill(0) # 清除畫面
91
92 t = round(sensor.get_temp_humi()[0], 1)
93 h = round(sensor.get_temp_humi()[1], 1)
94 # print("Temperature: {}".format(t))
95 # print("Humidity:{}".format(h))
96
97 if(ticks_ms() > chk_net_timer): # 聯(lián)機(jī)狀態(tài)查詢周期
98 chk_net_timer = ticks_ms() +CHECK_NET_INTERVAL_MS
99 if(not nb.chkNet()):
100 oled.fill(0) # 清除畫面
101 oled.text("ISP Connecting", 0, 0)
102 oled.show()
103 nbConnect()
104 oled.fill(0) # 清除畫面
105 oled.text("ISPConnected", 0, 0)
106 oled.show()
107 if(not mqtt.chkConnBroker()):
108 oled.fill(0) # 清除畫面
109 oled.text("MQTTConnecting", 0, 0)
110 oled.show()
111 reConnBroker()
112 oled.fill(0) # 清除畫面
113 oled.text("MQTTConnected", 0, 0)
114 oled.show()
115
116 if(ticks_ms() > pub_data_timer): # 訊息發(fā)布周期
117 pub_data_timer = pub_data_timer +UPLOAD_INTERVAL_MS
118 print("publish: ", t,end="")
119 if(mqtt.publish(TEMP_TOPIC, str(t))):
120 print(" success")
121 else:
122 print(" Fail")
123 print("publish: ", h,end="")
124 if(mqtt.publish(HUM_TOPIC, str(h))):
125 print(" success")
126 else:
127 print(" Fail")
128 mqtt.procSubs() # 檢查訂閱頻道狀態(tài)
129 oled.text("MQTT Connected", 0,0)
130 # 加入文字內(nèi)容
131 oled.text("Temp: ", 0, 10)
132 oled.text(str(t), 50, 10)
133 oled.text("*C", 90, 10)
134
135 oled.text("Humi: ", 0, 20)
136 oled.text(str(h), 50, 20)
137 oled.text("%", 90, 20)
138 oled.show() # 顯示繪制內(nèi)容
程序代碼說(shuō)明:
1. 引入這次實(shí)作所需模塊。
2. 建立并傳入I2C1建立SHT31對(duì)象,用來(lái)讀取溫濕度;建立并傳入I2C0建立OLED對(duì)象,用來(lái)操作OLED,OLED設(shè)定寬高為128*64;建立LED對(duì)象,pin設(shè)定為20,并設(shè)為輸出,用來(lái)顯示網(wǎng)頁(yè)控制開(kāi)關(guān)狀態(tài)。
3. 設(shè)定NBIoT 模塊所使用的APN、Band(不同電信商會(huì)不一樣,此為臺(tái)灣大哥大,Band 28),設(shè)定MQTT相關(guān)參數(shù),Broker 使用Adafruit IO,Port 使用1883,賬號(hào)密碼請(qǐng)自行修改,設(shè)定溫濕度、LED Topic,請(qǐng)務(wù)必與云端設(shè)定相同,35行設(shè)定數(shù)據(jù)上傳云端的間隔,使用者可自行依需求調(diào)整,這里設(shè)為30秒上傳一次;建立AM7020、AM7020MQTT對(duì)象,用來(lái)將數(shù)據(jù)發(fā)送至云端平臺(tái)。
4. 定義NBIoT 聯(lián)機(jī)程序,呼叫AM7020對(duì)象init 初始化方法以及nbiotConnect 方法直到成功,接著呼叫waitForNetwork 方法等待聯(lián)機(jī)完成。
5. 定義MQTT 重新聯(lián)機(jī)程序,使用AM7020MQTT對(duì)象的connBroker 方法聯(lián)機(jī)到指定Broker,這里須注意每個(gè)裝置的mqtt_id不可相同,若相同Broker 將會(huì)剔除上一次的聯(lián)機(jī),聯(lián)機(jī)完畢后使用AM7020MQTT 對(duì)象的subscribe 方法訂閱LED的 Topic,并傳入callback(于下一段說(shuō)明),用以接收LED開(kāi)關(guān)狀態(tài)。
6. 定義LED數(shù)據(jù)的Callback,當(dāng)AM7020MQTT對(duì)象收到LED主題數(shù)據(jù)時(shí)就會(huì)呼叫此方法,在此方法里面判斷訊息并控制LED亮滅。
7. 建立檢查聯(lián)機(jī)狀態(tài)、發(fā)布數(shù)據(jù)的定時(shí)器;將OLED畫面清除并顯示初始化訊息,并等待NBIOT模塊初始化成功。
8. 進(jìn)入無(wú)窮循環(huán),92~93行讀取溫濕度數(shù)據(jù),97~114定時(shí)檢查NBIOT以及MQTT的聯(lián)機(jī)狀態(tài),若中間有斷線便會(huì)呼叫上面定義的重新聯(lián)機(jī)方法,并透過(guò)OLED顯示目前狀態(tài)。
9. 透過(guò)定時(shí)器的方式定時(shí)發(fā)送溫濕度數(shù)據(jù)到云端(默認(rèn)為30秒上傳一次),發(fā)送數(shù)據(jù)使用AM7020MQTT對(duì)象的publish方法,參數(shù)帶入目標(biāo)Topic以及要發(fā)布的訊息。
10. 128行使用AM7020MQTT對(duì)象的procSubs方法檢查是否有訂閱數(shù)據(jù)到達(dá);將溫濕度數(shù)據(jù)顯示到OLED上。
六、執(zhí)行結(jié)果
完成以上步驟,并執(zhí)行范例程序代碼,我們就可以在OLED及云端上看到溫濕度數(shù)據(jù),并且可以直接透過(guò)網(wǎng)頁(yè)按鈕控制Pico 的LED燈,如下圖所示。
-
OLED
+關(guān)注
關(guān)注
120文章
6286瀏覽量
228132 -
監(jiān)測(cè)站
+關(guān)注
關(guān)注
0文章
337瀏覽量
11463
原文標(biāo)題:如何使用 Raspberry Pi Pico 實(shí)現(xiàn) IoT 物聯(lián)網(wǎng)?
文章出處:【微信號(hào):易心Microbit編程,微信公眾號(hào):易心Microbit編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
智能溫濕度監(jiān)測(cè) 溫濕度傳感器使用
【OneNET麒麟座試用申請(qǐng)】空氣質(zhì)量數(shù)據(jù)監(jiān)測(cè)站
【Thunderboard Sense試用申請(qǐng)】移動(dòng)空氣質(zhì)量監(jiān)測(cè)站
基于LoRa無(wú)線技術(shù)溫濕度監(jiān)測(cè)解決方案
水質(zhì)監(jiān)測(cè)站在智能水產(chǎn)養(yǎng)殖監(jiān)測(cè)系統(tǒng)中有何應(yīng)用
中山微型水質(zhì)多參數(shù)在線監(jiān)測(cè)站安裝案例
如何實(shí)現(xiàn)環(huán)境參數(shù)智能監(jiān)測(cè)站設(shè)計(jì)?
使用raspberry pi Pico的原因
基于 LabVIEW 的溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
土壤墑情監(jiān)測(cè)站是什么,它的應(yīng)用優(yōu)勢(shì)都有哪些
田間小氣候監(jiān)測(cè)站有什么作用
管式土壤墑情監(jiān)測(cè)站監(jiān)測(cè)方案

評(píng)論