5G元年的列車早已駛出,人工智能、大數(shù)據(jù)的浪潮還在涌動,云辦公、云問診成為防疫期間的熱詞。
現(xiàn)如今,物聯(lián)網(wǎng)技術(shù)正處于時代發(fā)展的風(fēng)口,相較于傳統(tǒng)的硬件設(shè)備,物聯(lián)網(wǎng)技術(shù)使得各種硬件設(shè)備能夠通過信息傳輸設(shè)備與互聯(lián)網(wǎng)連接起來,繼而進(jìn)行信息的傳遞,以實(shí)現(xiàn)智能化識別與管理,為人們的日常生活帶來便捷。
在上節(jié)課中,我們利用行空板設(shè)計(jì)了一個智慧農(nóng)業(yè)可視化系統(tǒng),模擬了對農(nóng)業(yè)中莊稼生長環(huán)境的實(shí)時監(jiān)測和改善,然而,在這其中,監(jiān)測到的數(shù)據(jù)只能顯示在行空板的屏幕上,我們必須走近行空板方能進(jìn)行觀察,很不方便。那有什么辦法能讓我們待在家中,遠(yuǎn)程就能知曉實(shí)時的環(huán)境數(shù)據(jù)呢?
這節(jié)課,就讓我們試著利用強(qiáng)大的物聯(lián)網(wǎng)技術(shù),用DFRobot的行空板來模擬一個智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng),解決這個問題吧!
任務(wù)目標(biāo)
將通過土壤濕度傳感器檢測到的濕度值顯示在屏幕上,同時,開啟SIoT物聯(lián)網(wǎng)系統(tǒng),將數(shù)據(jù)同步傳輸?shù)轿锫?lián)網(wǎng)平臺以便進(jìn)行查看,當(dāng)觀察到的土壤濕度值不佳時,通過在物聯(lián)網(wǎng)平臺的網(wǎng)頁端輸入指定字符“on”和“off”來控制繼電器和水泵澆水。
知識點(diǎn)
1、認(rèn)識物聯(lián)網(wǎng)、MQTT、SIoT
2、學(xué)習(xí)使用SIoT庫連接物聯(lián)網(wǎng)平臺的方法
3、學(xué)習(xí)使用SIoT庫向物聯(lián)網(wǎng)平臺發(fā)送消息的方法
4、學(xué)習(xí)使用SIoT庫接收物聯(lián)網(wǎng)平臺消息的方法
材料清單
硬件清單:
軟件使用:Mind+編程軟件x1
其他:
1、帶植物的花盆 x1
2、盛有水的燒杯 x1
3、十字/一字兩用螺絲刀 x1
知識儲備
1、物聯(lián)網(wǎng)
物聯(lián)網(wǎng)(Internet of Things,簡稱IoT)是借助互聯(lián)網(wǎng)、傳統(tǒng)電信網(wǎng)等信息承載體,讓所有能行使獨(dú)立功能的普通物體實(shí)現(xiàn)互聯(lián)互通的網(wǎng)絡(luò)。
物聯(lián)網(wǎng)是互聯(lián)網(wǎng)的一個延伸,互聯(lián)網(wǎng)的終端是計(jì)算機(jī)(PC、服務(wù)器),而物聯(lián)網(wǎng)的終端是硬件設(shè)備(手機(jī)、電腦、傳感器等等)。通過物聯(lián)網(wǎng),我們可以用中心計(jì)算機(jī)將各種機(jī)器、設(shè)備連接起來,進(jìn)行集中管理,實(shí)現(xiàn)物物相連。比如,將家中的燈、風(fēng)扇、空調(diào)等電器連入物聯(lián)網(wǎng)中后可以通過手機(jī)來控制它們開關(guān)。
2、MQTT
計(jì)算機(jī)為了聯(lián)網(wǎng),就必須規(guī)定通信協(xié)議,就好比一群不同國家的人在一塊兒,只有說同一種語言才能實(shí)現(xiàn)互相交流。同樣地,要想實(shí)現(xiàn)萬物互聯(lián),也需要一套協(xié)議。事實(shí)上,物聯(lián)網(wǎng)系統(tǒng)的搭建可通過很多協(xié)議來實(shí)現(xiàn),常用的物聯(lián)網(wǎng)應(yīng)用層協(xié)議包括MQTT、HTTP、XMPP、CoAP等。這里我們采用的是MQTT,通過該協(xié)議,我們可以在物聯(lián)網(wǎng)上傳輸消息。
MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議,服務(wù)器就是我們要搭建的物聯(lián)網(wǎng)平臺的載體??蛻舳丝梢允切畔l(fā)布者或訂閱者。每個客戶端都可以連接到服務(wù)器。舉個例子,郵局大家都不陌生,我們可以到郵局寄信和收信。當(dāng)我們寄信時,對于郵局而言我們就是信息發(fā)布者,當(dāng)收信時我們就成了訂閱者。同時,無論是寄信者還是收信者,我們都是客戶。而郵局這個收寄信的平臺就是所謂的服務(wù)器,為我們提供收信和寄信的服務(wù)。
當(dāng)發(fā)布者具有要分發(fā)的新數(shù)據(jù)時,它會將包含數(shù)據(jù)的控制消息發(fā)送到服務(wù)器。然后,服務(wù)器將信息分發(fā)給已訂閱該主題的任何客戶端。發(fā)布者不需要有關(guān)于訂閱者數(shù)量或位置的任何數(shù)據(jù),而訂閱者又不必配置有關(guān)發(fā)布者的任何數(shù)據(jù)。
另外,MQTT傳輸?shù)南⒖煞譃椋篢opic和payload兩部分
(1)Topic,可以理解為消息的類型,訂閱者訂閱后,就會收到該主題的消息內(nèi)容(Payload);
(2)payload,可以理解為消息的內(nèi)容,是指訂閱者具體要接收的內(nèi)容。
3、SIoT
SIoT是一個為教育定制的跨平臺的開源MQTT服務(wù)器程序,S指科學(xué)(science)、簡單(simple)的意思。SIoT支持Win10、Win7、Mac、Linux等操作系統(tǒng),一鍵啟動,無需用戶注冊或者系統(tǒng)設(shè)置即可使用。
SIoT也是為了幫助中小學(xué)生理解物聯(lián)網(wǎng)原理,并且能夠基于物聯(lián)網(wǎng)技術(shù)開發(fā)各種創(chuàng)意應(yīng)用。因?yàn)槠渲攸c(diǎn)關(guān)注物聯(lián)網(wǎng)數(shù)據(jù)的收集和導(dǎo)出,是采集科學(xué)數(shù)據(jù)的最好選擇之一。
這里,于行空板而言,SIoT應(yīng)用程序已經(jīng)被內(nèi)置在了板子上,因此在使用時,我們可直接在應(yīng)用開關(guān)內(nèi)通過點(diǎn)擊它來開啟服務(wù)。同時,為了便于它的使用,我們開發(fā)了名為“SIoT”的Python庫,旨在通過編寫Python程序來連接MQTT服務(wù)器以及實(shí)現(xiàn)消息的傳輸。
在實(shí)際使用時,開啟SIoT服務(wù)的行空板我們就可以當(dāng)作一臺服務(wù)器,連接傳感器以檢測數(shù)據(jù)的行空板(設(shè)備)我們可以當(dāng)作客戶端。
而如果在同一塊板子上既開啟SIoT服務(wù),又連接傳感器來檢測數(shù)據(jù),那么它既是客戶端又是服務(wù)器。
Tips:在這節(jié)課上,我們將通過一塊板子來實(shí)現(xiàn)物聯(lián)網(wǎng)功能,而下節(jié)課中,我們將使用三塊板子來模擬多節(jié)點(diǎn)的物聯(lián)網(wǎng)系統(tǒng)。
4、SIoT庫常見函數(shù)
(1)init()、connect()、loop()函數(shù)初始化并連接物聯(lián)網(wǎng)平臺
SIoT庫中的init()函數(shù)可以用來初始化與物聯(lián)網(wǎng)平臺的連接,使用前,我們首先需要導(dǎo)入庫,之后設(shè)定好連接物聯(lián)網(wǎng)平臺所需的參數(shù),包括服務(wù)器IP地址、物聯(lián)網(wǎng)平臺的賬號用戶名、賬號對應(yīng)的密碼,接著使用init()函數(shù)進(jìn)行連接驗(yàn)證,驗(yàn)證成功后再通過connect()和loop()函數(shù)進(jìn)行與平臺的連接。
import siot # 導(dǎo)入SIoT庫
SERVER = "10.1.2.3" # MQTT服務(wù)器IP,輸入個人實(shí)際Ip
CLIENT_ID = "" # 在SIoT上,CLIENT_ID可以留空
IOT_UserName = 'siot' # 用戶名
IOT_PassWord = 'dfrobot' # 密碼
siot.init(CLIENT_ID, SERVER, user=IOT_UserName,password=IOT_PassWord) # 初始化,確定輸入的用戶名和密碼正確
siot.connect() # 連接SIoT物聯(lián)網(wǎng)平臺
siot.loop() # 循環(huán)
其中,SERVER指的是開啟siot服務(wù)用以連接的服務(wù)器的IP地址;CLIENT_ID指的是客戶端標(biāo)識符,它是客戶端到服務(wù)器的唯一標(biāo)識,這里我們可以不輸入內(nèi)容; user指的是物聯(lián)網(wǎng)平臺賬戶的用戶名;password指賬號對應(yīng)的密碼。
(2)publish()函數(shù)向物聯(lián)網(wǎng)平臺發(fā)送消息
在連接上SIoT物聯(lián)網(wǎng)平臺后,通過SIoT庫的publish函數(shù)可以實(shí)現(xiàn)將消息發(fā)送到平臺,使用時需要先后指定發(fā)送的主題Topic(目的地)和發(fā)送的消息內(nèi)容。
IOT_pubTopic = '智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value' # 濕度topic,“項(xiàng)目名稱/設(shè)備名稱”
Soil_moisture_value = adc0.read_analog() # 讀取模擬值
siot.publish(IOT_pubTopic, Soil_moisture_value) # 發(fā)布信息至物聯(lián)網(wǎng)平臺
其中,IOT_pubTopic指主題Topic,包括項(xiàng)目ID和設(shè)備名稱;Soil_moisture_value指要發(fā)送的土壤濕度數(shù)據(jù)消息。
Tips:SIoT平臺上同時用Topic表示了項(xiàng)目ID和設(shè)備名稱,因此Topic中需要有“/”符號將兩者分開,否則物聯(lián)網(wǎng)平臺看不到項(xiàng)目。
(3)subscribe()函數(shù)訂閱物聯(lián)網(wǎng)平臺消息
在連接上SIoT物聯(lián)網(wǎng)平臺后,通過SIoT庫的subscribe()函數(shù)可以訂閱平臺發(fā)送來的消息,使用時需要先后指定發(fā)送的主題Topic(目的地)以及接收到平臺消息后所要執(zhí)行的操作。
IOT_pubTopic = '智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value' # 濕度topic,“項(xiàng)目名稱/設(shè)備名稱”
def sub_relay(client, userdata, msg):
topic = msg.topic
payload = msg.payload.decode()
'''定義接收到指令時的操作'''
print("\nTopic:" + topic + " Message:" + payload) # 打印接收到的信息
if payload == 'on': # 如果接收到“on”
img.config(w=240, h=320, image='img/澆水1.png')
relay.write_digital(1) # 繼電器輸出高電平
elif payload == 'off': # 如果接收到“off”
img.config(w=240, h=320, image='img/關(guān)水1.png')
relay.write_digital(0) # 繼電器輸出低電平
siot.subscribe(IOT_pubTopic, sub_relay) # 訂閱消息
其中,IOT_pubTopic指主題Topic,包括項(xiàng)目ID和設(shè)備名稱;sub_relay是定義的接收到平臺消息后所要執(zhí)行的功能函數(shù);msg.topic指的是消息中的Topic主題;msg.payload指的是消息的內(nèi)容;decode()是將消息內(nèi)容轉(zhuǎn)換為字符串方便后續(xù)條件判斷。
動手實(shí)踐
任務(wù)描述1:發(fā)送濕度數(shù)據(jù)至SIoT物聯(lián)網(wǎng)平臺
啟動SIoT物聯(lián)網(wǎng)系統(tǒng),通過外接土壤濕度傳感器檢測濕度值后,將數(shù)據(jù)顯示在屏幕上的同時也發(fā)送至SIoT物聯(lián)網(wǎng)平臺并在平臺網(wǎng)頁端查看。
1、硬件搭建
STEP1:通過USB連接線將行空板連接到計(jì)算機(jī)
STEP2:將土壤濕度傳感器接入行空板的P21引腳
STEP3:將土壤濕度傳感器插入花盆中
STEP4:啟動SIoT服務(wù)
按下HOME鍵進(jìn)入菜單,單擊“應(yīng)用開關(guān)”,找到SIoT應(yīng)用后點(diǎn)擊啟用,如下圖所示。
STEP5:查看ip并記錄
按下HOME鍵進(jìn)入菜單,單擊“查看網(wǎng)絡(luò)信息”,找到SIoT應(yīng)用后點(diǎn)擊啟用,如下圖所示。
Tips:“10.1.2.3”為板子通過USB線連接電腦后的固定IP地址。這里我們將它記錄下來,后續(xù)有用。
2、程序編寫
STEP1:創(chuàng)建與保存項(xiàng)目文件
啟動Mind+,另存項(xiàng)目并命名為“009、智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)”。
STEP2:創(chuàng)建與保存Python文件
創(chuàng)建一個Python程序文件“main1.py”,雙擊打開。
STEP3:導(dǎo)入圖片文件夾
在項(xiàng)目文件夾中導(dǎo)入背景圖文件夾。(圖片文件夾與程序文件同在項(xiàng)目文件夾中,下載鏈接見附錄1)
STEP4:程序編寫
(1) 導(dǎo)入所需功能庫
在這個任務(wù)中,我們需要使用Pinpong庫來使土壤濕度傳感器讀取數(shù)值并顯示在屏幕上,因此,我們需要導(dǎo)入Pinpong庫和unihiker庫中的GUI模塊,同時,為了能將數(shù)據(jù)實(shí)時發(fā)送至SIoT物聯(lián)網(wǎng)平臺,我們還需導(dǎo)入SIoT庫。
from unihiker import GUI # 導(dǎo)入unihiker庫GUI模塊from pinpong.board import Board, Pin # 導(dǎo)入pinpong庫下的Board, Pin模塊import time # 導(dǎo)入time庫import siot # 導(dǎo)入SIoT庫 |
(2) 實(shí)例化GUI類并初始化板子和引腳
之后我們創(chuàng)建gui對象并初始化板子和引腳以便后續(xù)能使用屏幕功能和控制傳感器工作。
gui = GUI() # 實(shí)例化gui對象 Board().begin() # 初始化行空板adc0 = Pin(Pin.P21, Pin.ANALOG) # 初始化21引腳為模擬輸入模式 |
(3) 設(shè)置參數(shù)并連接SIoT平臺
接下來,我們將創(chuàng)建與SIoT物聯(lián)網(wǎng)平臺的連接,在這之前,我們先設(shè)定好連接時所需要的參數(shù),包括ip地址,CLIENT_ID,用戶名,密碼以及topic,之后進(jìn)行連接并保持連接狀態(tài)。
Tips:這里的IP地址為之前記錄的“10.1.2.3”。
SERVER = "10.1.2.3" # MQTT服務(wù)器IP,輸入個人實(shí)際Ip CLIENT_ID = "" # 在SIoT上,CLIENT_ID可以留空IOT_UserName = 'siot' # 用戶名IOT_PassWord = 'dfrobot' # 密碼IOT_pubTopic = '智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value' # 濕度topic,“項(xiàng)目名稱/設(shè)備名稱” siot.init(CLIENT_ID, SERVER, user=IOT_UserName,password=IOT_PassWord) # 初始化,確定輸入的用戶名和密碼正確siot.connect() # 連接SIoT物聯(lián)網(wǎng)平臺siot.loop() # 循環(huán) |
(4) 顯示背景圖、填充矩形和初始文字
緊接著,我們在行空板的屏幕上顯示一張背景圖,并添加填充矩形和初始文字,以便后續(xù)直接在此更新數(shù)據(jù)顯示。
# 顯示背景圖片img = gui.draw_image(w=240, h=320, image='img/關(guān)水1.png') # 繪制填充矩形并在矩形框內(nèi)顯示文字gui.fill_rect(x=65, y=35, w=70, h=30, color="white") # 繪制矩形“濕度值”gui.fill_rect(x=148, y=35, w=55, h=30, color="white") # 繪制矩形以顯示濕度值數(shù)據(jù) text_1 = gui.draw_text(x=68, y=36, color="red", text='濕度值:') # 顯示"濕度值:"text_value = gui.draw_text(x=155, y=36, color="red", text="") # 顯示濕度值數(shù)據(jù) |
(5) 檢測土壤濕度并將數(shù)據(jù)顯示在屏幕及發(fā)送到SIoT物聯(lián)網(wǎng)平臺
最后,我們設(shè)置通過傳感器來讀取檢測數(shù)據(jù),將濕度值發(fā)送到物聯(lián)網(wǎng)平臺的同時也顯示在屏幕上,而為了使得上述操作能每隔一秒不停地執(zhí)行,這里,我們使用while語句。
while True: # 循環(huán) Soil_moisture_value = adc0.read_analog() # 讀取模擬值 print(Soil_moisture_value) # 打印顯示濕度值 siot.publish(IOT_pubTopic, Soil_moisture_value) # 發(fā)布信息至物聯(lián)網(wǎng)平臺 text_value.config(text=Soil_moisture_value) # 更新濕度值 time.sleep(1) # delay1秒 |
Tips:完整示例程序如下:
from unihiker import GUI # 導(dǎo)入unihiker庫GUI模塊from pinpong.board import Board, Pin # 導(dǎo)入pinpong庫下的Board, Pin模塊import time # 導(dǎo)入time庫import siot # 導(dǎo)入SIoT庫 gui = GUI() # 實(shí)例化gui對象 Board().begin() # 初始化行空板adc0 = Pin(Pin.P21, Pin.ANALOG) # 初始化21引腳為模擬輸入模式 SERVER = "10.1.2.3" # MQTT服務(wù)器IP,輸入個人實(shí)際Ip CLIENT_ID = "" # 在SIoT上,CLIENT_ID可以留空IOT_UserName = 'siot' # 用戶名IOT_PassWord = 'dfrobot' # 密碼IOT_pubTopic = '智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value' # 濕度topic,“項(xiàng)目名稱/設(shè)備名稱” siot.init(CLIENT_ID, SERVER, user=IOT_UserName,password=IOT_PassWord) # 初始化,確定輸入的用戶名和密碼正確siot.connect() # 連接SIoT物聯(lián)網(wǎng)平臺siot.loop() # 循環(huán) # 顯示背景圖片img = gui.draw_image(w=240, h=320, image='img/關(guān)水1.png') # 繪制填充矩形并在矩形框內(nèi)顯示文字gui.fill_rect(x=65, y=35, w=70, h=30, color="white") # 繪制矩形“濕度值”gui.fill_rect(x=148, y=35, w=55, h=30, color="white") # 繪制矩形以顯示濕度值數(shù)據(jù) text_1 = gui.draw_text(x=68, y=36, color="red", text='濕度值:') # 顯示"濕度值:"text_value = gui.draw_text(x=155, y=36, color="red", text="") # 顯示濕度值數(shù)據(jù) while True: # 循環(huán) Soil_moisture_value = adc0.read_analog() # 讀取模擬值 print(Soil_moisture_value) # 打印顯示濕度值 siot.publish(IOT_pubTopic, Soil_moisture_value) # 發(fā)布信息至物聯(lián)網(wǎng)平臺 text_value.config(text=Soil_moisture_value) # 更新濕度值 time.sleep(1) # delay1秒 |
3、程序運(yùn)行
STEP1:遠(yuǎn)程連接行空板,運(yùn)行程序并觀察效果
觀察行空板,可以看到在智慧農(nóng)業(yè)的背景圖上,每隔一秒顯示著檢測到的土壤濕度值。
STEP2:平臺網(wǎng)頁端查看消息
(1)打開瀏覽器,輸入“10.1.2.3”后回車,進(jìn)入行空板的網(wǎng)頁菜單,找到應(yīng)用開關(guān)下的SIoT服務(wù),點(diǎn)擊“打開頁面”。
(2)輸入默認(rèn)的賬號“siot”,密碼“dfrobot”,點(diǎn)擊登錄
(3)點(diǎn)擊“智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)”項(xiàng)目下的“查看設(shè)備列表”
可以看到“項(xiàng)目ID”、“名稱”分別對應(yīng)為程序中“IOT_pubTopic”的信息
(4)點(diǎn)擊“查看消息”
隨后我們就可以查看到“智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value”這個Topic的MQTT消息記錄啦,并伴有具體的消息內(nèi)容及發(fā)送時間,這就是我們檢測到的該時刻的土壤濕度值,如下圖。
(5)點(diǎn)擊“自動刷新消息”
通過刷新消息,我們發(fā)現(xiàn)土壤濕度數(shù)據(jù)每隔一秒進(jìn)行了更新,如下圖,
(6)點(diǎn)擊“隱藏/顯示圖標(biāo)”
點(diǎn)擊后,我們可以發(fā)現(xiàn)數(shù)據(jù)以圖表的形式呈現(xiàn)了出來,如下圖。
(7)點(diǎn)擊“導(dǎo)出查詢結(jié)果”
這里我們可以將數(shù)據(jù)以表格的形式下載下來以便后續(xù)作進(jìn)一步分析。
任務(wù)描述2:平臺網(wǎng)頁端控制澆水
在上一任務(wù)中,我們實(shí)現(xiàn)了將土壤濕度傳感器檢測到的數(shù)據(jù)上傳到SIoT物聯(lián)網(wǎng)平臺,并從平臺的網(wǎng)頁端實(shí)時查看濕度值,接下來,我們給板子添加訂閱平臺消息的功能,使得我們能夠在土壤較干燥的時候通過SIoT物聯(lián)網(wǎng)平臺的網(wǎng)頁端來及時控制澆水。
1、硬件搭建
STEP1:將繼電器接入行空板的P23引腳
STEP2:利用螺絲刀將水泵正負(fù)線與轉(zhuǎn)接頭連接起來,具體步驟同上節(jié)課。
STEP3:利用繼電器將12V電源開關(guān)與水泵的轉(zhuǎn)接頭連接起來
STEP4:將繼電器開關(guān)撥至NC端
STEP5:將水泵固定在滿水的燒杯中
STEP6:將水管插入花盆中
2、程序編寫
STEP1:創(chuàng)建與保存項(xiàng)目文件
新建一個Python程序文件“main2.py”,雙擊打開。
Step2:程序編寫
(1)初始化引腳
這里,由于我們將使用繼電器控制水泵進(jìn)行澆水,因此我們需要補(bǔ)充對繼電器引腳的初始化操作,設(shè)置其23號引腳為數(shù)字輸出模式。
relay = Pin(Pin.P23, Pin.OUT) # 初始化23引腳為數(shù)字輸出模式 |
(2)定義接收到平臺消息后的操作
由于后續(xù)我們將接收平臺發(fā)送的消息,當(dāng)消息為“on”時,控制繼電器輸出高電平來澆水,當(dāng)消息為“off”時,控制繼電器輸出低電平停止?jié)菜?。因此在這里,我們補(bǔ)充定義一個回調(diào)函數(shù),來表示接收到平臺消息后需執(zhí)行的操作,以便在后續(xù)調(diào)用。
def sub_relay(client, userdata, msg): topic = msg.topic payload = msg.payload.decode() '''定義接收到指令時的操作''' print("\nTopic:" + topic + " Message:" + payload) # 打印接收到的信息 if payload == 'on': # 如果接收到“on” img.config(w=240, h=320, image='img/澆水1.png') relay.write_digital(1) # 繼電器高電平 elif payload == 'off': # 如果接收到“off” img.config(w=240, h=320, image='img/關(guān)水1.png') relay.write_digital(0) # 繼電器低電平 |
(3)訂閱平臺發(fā)送的消息
最后,為了能接收到物聯(lián)網(wǎng)平臺發(fā)送的消息,這里,我們在連接上平臺后補(bǔ)充一下對消息的訂閱。
siot.subscribe(IOT_pubTopic, sub_relay) # 訂閱消息 |
Tips:完整示例程序如下:
from unihiker import GUI # 導(dǎo)入unihiker庫GUI模塊from pinpong.board import Board, Pin # 導(dǎo)入pinpong庫下的Board, Pin模塊import time # 導(dǎo)入time庫import siot # 導(dǎo)入SIoT庫 gui = GUI() # 實(shí)例化gui對象 Board().begin() # 初始化行空板adc0 = Pin(Pin.P21, Pin.ANALOG) # 初始化21引腳為模擬輸入模式relay = Pin(Pin.P23, Pin.OUT) # 初始化23引腳為數(shù)字輸出模式 SERVER = "10.1.2.3" # MQTT服務(wù)器IP,輸入個人實(shí)際IP CLIENT_ID = "" # 在SIoT上,CLIENT_ID可以留空IOT_UserName = 'siot' # 用戶名IOT_PassWord = 'dfrobot' # 密碼IOT_pubTopic = '智慧農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)/Soil_moisture_value' # 濕度topic,“項(xiàng)目名稱/設(shè)備名稱” def sub_relay(client, userdata, msg): topic = msg.topic payload = msg.payload.decode() '''定義接收到指令時的操作''' print("\nTopic:" + topic + " Message:" + payload) # 打印接收到的信息 if payload == 'on': # 如果接收到“on” img.config(w=240, h=320, image='img/澆水1.png') relay.write_digital(1) # 繼電器輸出高電平 elif payload == 'off': # 如果接收到“off” img.config(w=240, h=320, image='img/關(guān)水1.png') relay.write_digital(0) # 繼電器輸出低電平 siot.init(CLIENT_ID, SERVER, user=IOT_UserName,password=IOT_PassWord) # 初始化,確定輸入的用戶名和密碼正確siot.connect() # 連接SIoT物聯(lián)網(wǎng)平臺siot.subscribe(IOT_pubTopic, sub_relay) # 訂閱消息siot.loop() # 循環(huán) # 顯示背景圖片img = gui.draw_image(w=240, h=320, image='img/關(guān)水1.png') # 繪制填充矩形并在矩形框內(nèi)顯示文字gui.fill_rect(x=65, y=35, w=70, h=30, color="white") # 繪制矩形“濕度值”gui.fill_rect(x=148, y=35, w=55, h=30, color="white") # 繪制矩形以顯示濕度值數(shù)據(jù) text_1 = gui.draw_text(x=68, y=36, color="red", text='濕度值:') # 繪制矩形“濕度值”text_value = gui.draw_text(x=155, y=36, color="red", text="") # 顯示濕度值數(shù)據(jù) while True: # 循環(huán) Soil_moisture_value = adc0.read_analog() # 讀取模擬值 print(Soil_moisture_value) # 打印顯示濕度值 siot.publish(IOT_pubTopic, Soil_moisture_value) # 發(fā)布信息至物聯(lián)網(wǎng)平臺 text_value.config(text=Soil_moisture_value) # 更新濕度值 time.sleep(1) # delay1秒 |
3、程序運(yùn)行
STEP1:將12V電源開關(guān)插上220V電源插座
STEP2:遠(yuǎn)程連接行空板,運(yùn)行程序并觀察效果
觀察行空板,可以發(fā)現(xiàn)濕度值依舊不停得更新顯示在屏幕上。
STEP3:平臺發(fā)送消息
觀察檢測到的突然濕度數(shù)據(jù),當(dāng)濕度值過低時,我們在網(wǎng)頁端指定位置輸入“on”,并點(diǎn)擊發(fā)送,可以發(fā)現(xiàn)繼電器開始工作,控制水泵不斷將燒杯中的水抽入花盆中。
之后,當(dāng)水量合適后,我們再在消息框中輸入“off”,點(diǎn)擊發(fā)送后,可以發(fā)現(xiàn)水泵停了下來。
挑戰(zhàn)自我
想一想,在農(nóng)業(yè)系統(tǒng)中,還有哪些因素是會影響莊稼生長的呢,我們有何方法來檢測它嗎,自己來研究一下吧,并結(jié)合物聯(lián)網(wǎng)平臺,試著以遠(yuǎn)程的方式分析一下它對莊稼的影響規(guī)律吧!
更多行空板Python入門教程學(xué)習(xí)請關(guān)注“蘑菇云創(chuàng)造”公眾號。
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2899文章
43798瀏覽量
369172 -
溫濕度傳感器
+關(guān)注
關(guān)注
5文章
570瀏覽量
35615 -
python
+關(guān)注
關(guān)注
54文章
4759瀏覽量
84294 -
智慧農(nóng)業(yè)
+關(guān)注
關(guān)注
4文章
769瀏覽量
19776 -
DFRobot
+關(guān)注
關(guān)注
4文章
1156瀏覽量
9379
發(fā)布評論請先 登錄
相關(guān)推薦
評論