項(xiàng)目3任務(wù)6-物聯(lián)網(wǎng)APP顯示溫濕度_第1頁(yè)
項(xiàng)目3任務(wù)6-物聯(lián)網(wǎng)APP顯示溫濕度_第2頁(yè)
項(xiàng)目3任務(wù)6-物聯(lián)網(wǎng)APP顯示溫濕度_第3頁(yè)
項(xiàng)目3任務(wù)6-物聯(lián)網(wǎng)APP顯示溫濕度_第4頁(yè)
項(xiàng)目3任務(wù)6-物聯(lián)網(wǎng)APP顯示溫濕度_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)物聯(lián)網(wǎng)APP顯示溫濕度一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)ESP32上報(bào):通過DHT11傳感器監(jiān)測(cè)溫濕度值,MQTT消息topic="/手機(jī)號(hào)/my_ESP32/post",MQTT消息payload="{"temperature":16}",或者"{"humidity":43}"。APP收到后,將溫度值解析后顯示在text21中,將濕度值解析后顯示在text22中。任務(wù)6分解為2個(gè)環(huán)節(jié):網(wǎng)關(guān)數(shù)據(jù)上報(bào)、APP設(shè)計(jì)。第一個(gè)環(huán)節(jié)是在Arduino環(huán)境下編寫DHT11相關(guān)庫(kù)的檢測(cè)函數(shù),再調(diào)用客戶端的publish方法;第二個(gè)環(huán)節(jié)是將任務(wù)5的MQTT.fx客戶端ID換成ESP32客戶端ID,解析后更新UI控件,從text23改為text21和text22。任務(wù)引入任務(wù)5讓MQTT.fx客戶端發(fā)送包含虛擬傳感器值的MQTT消息,由APP訂閱、接收、解析并展示。本任務(wù)讓ESP32網(wǎng)關(guān)連接真實(shí)的傳感器,檢測(cè)溫濕度并上報(bào),由APP訂閱、接收、解析并展示,構(gòu)建一個(gè)溫濕度的遠(yuǎn)程監(jiān)控系統(tǒng)。二、相關(guān)知識(shí)DHT11傳感器簡(jiǎn)介DHT11傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度傳感器,應(yīng)用數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和工作穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連。DHT11采用單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷,節(jié)約硬件資源。產(chǎn)品為4針單排引腳封裝,連接方便。課堂討論你還知道有哪些單總線的傳感器?二、相關(guān)知識(shí)DHT11傳感器應(yīng)用電路VCC供電電壓的范圍為3~5.5V,GND接地。DATA為單串行數(shù)據(jù)總線,可和單片機(jī)的數(shù)據(jù)引腳相連,如圖3-31所示。注意:數(shù)據(jù)引腳需要完成輸入和輸出雙向傳輸,故引腳的工作模式在初始化時(shí)不必設(shè)置,而是在檢測(cè)時(shí)按照時(shí)序配置引腳的工作模式。圖3-31DHT11傳感器應(yīng)用電路二、相關(guān)知識(shí)DFRobot_DHT11庫(kù)用戶通過外設(shè)庫(kù)的封裝,可以較為方便地使用相關(guān)外設(shè),而不需要關(guān)心復(fù)雜的配置和時(shí)序知識(shí)。用戶可在Arduino開發(fā)環(huán)境中調(diào)用DFRobot_DHT11庫(kù),使用DHT11傳感器。項(xiàng)目1已經(jīng)將DFRobot_DHT11外設(shè)庫(kù)下載到Arduino安裝目錄的libraries文件夾中,在Arduino工程中,用戶通過以下語(yǔ)句即可調(diào)用:#include"DFRobot_DHT11.h"其他關(guān)鍵語(yǔ)句如下:DFRobot_DHT11DHT;//創(chuàng)建溫濕度傳感器對(duì)象DHTDHT.read(DHT11_PIN);//DHT對(duì)象調(diào)用read方法,完成一次溫濕度檢測(cè)DHT檢測(cè)溫濕度后,溫度值和濕度值會(huì)分別賦值給DHT對(duì)象的temperature屬性和humidity屬性。三、任務(wù)實(shí)施實(shí)施設(shè)備ESP32網(wǎng)關(guān)和DHT11溫濕度傳感器各一個(gè),杜邦線若干,安裝了Arduino開發(fā)環(huán)境和AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī),部署了MQTT服務(wù)器的云服務(wù)器。1.網(wǎng)關(guān)與傳感器硬件連接DHT11_DAT———ESP32_IO26DHT11_GND———ESP32_GNDDHT11_VCC———ESP32_VCCDHT11的單數(shù)據(jù)總線接ESP32的Pin26。實(shí)施過程三、任務(wù)實(shí)施2.網(wǎng)關(guān)程序設(shè)計(jì)(1)頭文件、宏、變量、對(duì)象定義。#include<WiFi.h>#include<PubSubClient.h>#include<ArduinoJson.h>//需要加載ArduinoJson和DFRobot_DHT11庫(kù),否則報(bào)錯(cuò)#include"DFRobot_DHT11.h"#defineDHT11_PIN26/*配置WIFI名和密碼*/constchar*WIFI_SSID/="YYY_11_101";constchar*WIFI_PASSWORD="lxy413026";/*配置域名和端口號(hào)*/constchar*mqtt_server="47.99.107.169";constuint16_tPORT=1883;constchar*mqtt_id=ESP";constchar*mqtt_username="";constchar*mqtt_password="";/*需要操作的產(chǎn)品標(biāo)識(shí)符(溫度、濕度)*/StringTempIdentifier="temperature";StringHumiIdentifier="humidity";/*需要上報(bào)和訂閱的TOPIC*/constchar*pubTopic="my_ESP32/post";//******發(fā)布WiFiClientespClient;PubSubClientclient(espClient);//創(chuàng)建了MQTT客戶端,即ESP32硬件DFRobot_DHT11DHT;三、任務(wù)實(shí)施程序中:①調(diào)用了WiFi庫(kù)、PubSubClient庫(kù)(用于創(chuàng)建MQTT客戶端)、ArduinoJson庫(kù)(用于JSON解析)、DFRobot_DHT11(用于DHT11溫濕度傳感器);②定義了DHT11的數(shù)據(jù)引腳、配置了WiFi通信時(shí)的賬號(hào)密碼、MQTT服務(wù)器的IP地址和端口號(hào)、MQTT客戶端ID、客戶端訪問服務(wù)器時(shí)的用戶名和密碼;③定義了JSON對(duì)象(上報(bào)的消息載荷)里的溫度和濕度字段、要發(fā)布的消息topic;④創(chuàng)建了WiFi客戶端,進(jìn)一步創(chuàng)建了MQTT客戶端對(duì)象client,并創(chuàng)建了溫濕度傳感器對(duì)象DHT。三、任務(wù)實(shí)施voidsetup(){Serial.begin(115200);connectWiFi();client.setServer(mqtt_server,PORT);//沒有提供用戶名和密碼,因?yàn)镋MQX服務(wù)器允許公開訪問,如果設(shè)置的話是需要提供的/*設(shè)置回調(diào)函數(shù),當(dāng)收到訂閱信息時(shí)會(huì)執(zhí)行回調(diào)函數(shù)*/client.setCallback(callback);/*連接到MQTT服務(wù)器*/reconnect();}(2)初始化函數(shù)。初始化函數(shù)中:設(shè)置串口0的波特率為115200,對(duì)應(yīng)的電腦串口調(diào)試助手波特率要一致;進(jìn)行WiFi連接;設(shè)置MQTT客戶端要訪問的MQTT服務(wù)器;設(shè)置MQTT客戶端收到消息后的回調(diào)處理函數(shù),并連接到MQTT服務(wù)器。三、任務(wù)實(shí)施voidreconnect(){while(!client.connected()){Serial.print("AttemptingMQTTconnection...");if(client.connect(mqtt_id,mqtt_username,mqtt_password)){Serial.println("connected");}else{Serial.print("failed,rc=");Serial.print(client.state());Serial.println("tryagainin5seconds");delay(5000);}}}(3)reconnect函數(shù)。在reconnect函數(shù)中,client對(duì)象會(huì)調(diào)用connected方法判斷是否連接到MQTT服務(wù)器;如果未連接,會(huì)嘗試調(diào)用connect方法進(jìn)行連接;如果嘗試連接失敗,間隔一段時(shí)間后會(huì)再次調(diào)用connect方法進(jìn)行連接。循環(huán)是通過While語(yǔ)句實(shí)現(xiàn)的。三、任務(wù)實(shí)施uint8_ttempTime=0;voidloop(){if(!client.connected()){reconnect();}/*兩分鐘上報(bào)兩次溫濕度信息*/if(tempTime>240){tempTime=0;DHT.read(DHT11_PIN);Serial.print("DHT.temperature=");Serial.println(DHT.temperature);Serial.print("DHT.humidity=");Serial.println(DHT.humidity);client.publish(pubTopic,("{\""+TempIdentifier+"\":"+DHT.temperature+"}").c_str());}else{tempTime++;delay(500);}client.loop();}(4)loop函數(shù)。loop函數(shù)中,MQTT客戶端每2分鐘上報(bào)一次消息,消息的topic="/手機(jī)號(hào)/my_ESP32/post"。假如采集到的溫度值是16℃,消息載荷="{"temperature":16}"。程序中,DHT對(duì)象通過read方法檢測(cè)溫濕度,溫度值和濕度值會(huì)分別賦值給DHT對(duì)象的temperature屬性和humidity屬性。三、任務(wù)實(shí)施為什么是每隔2分鐘上報(bào)一次MQTT消息?如果想修改間隔時(shí)間為3分鐘,有哪些辦法?消息中的“\”是什么意思,有什么作用?課堂討論3.APP設(shè)計(jì)(1)消息topic。如圖3-32所示,APP是作為接收消息的MQTT客戶端使用的,只要修改一下訂閱的消息topic就可以了,即將"/手機(jī)號(hào)/my_FX/post"修改為"/手機(jī)號(hào)/my_ESP32/post",至于發(fā)布和訂閱消息的內(nèi)容,都保持不變。圖3-32修改訂閱的消息topic三、任務(wù)實(shí)施(2)消息payload解析。APP的MQTT客戶端收到消息后,通過Handler回傳到UI線程處理,原來是解析后展示在tet23,現(xiàn)在修改為解析溫度展示在text21文本框中。代碼如下:case3://MQTT收到消息回傳if(msg.obj.toString().contains("temperature")){StringT_val=msg.obj.toString().substring(msg.obj.toString().indexOf("temperature")+13,msg.obj.toString().indexOf("}"));Stringtext_val=T_val+"℃";binding2.text21.setText(text_val);}//Toast.makeText(SecondActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;三、任務(wù)實(shí)施4.結(jié)果展示上傳程序,打開Arduino開發(fā)環(huán)境的串口監(jiān)視器,會(huì)顯示連接MQTT服務(wù)器成功。然后觀察溫濕度檢測(cè)結(jié)果,如圖3-33所示。對(duì)應(yīng)的,如圖3-34所示,在虛擬手機(jī)上可以看到溫度值,和串口打印的溫度值是一樣的。圖3-33串口0打印的溫濕度值圖3-34APP的溫度顯示三、任務(wù)實(shí)施5.濕度上報(bào)顯示在溫度值上報(bào)顯示的基礎(chǔ)上,完成濕度值的上報(bào)顯示。APP和網(wǎng)關(guān)程序都需要簡(jiǎn)單修改一下。(1)APP解析部分代碼完善。case3://MQTT收到消息回傳if(msg.obj.toString().contains("temperature")){StringT_val=msg.obj.toString().substring(msg.obj.toString().indexOf("temperature")+13,msg.obj.toString().indexOf("}"));Stringtext_val=T_val+"℃";binding2.text21.setText(text_val);}if(msg.obj.toString().contains("humidity")){StringH_val=msg.obj.toString().substring(msg.obj.toString().indexOf("humidity")+10,msg.obj.toString().indexOf("}"));Stringtext_val=H_val+"%";binding2.text22.setText(text_val);}//Toast.makeText(SecondActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;APP的MQTT客戶端收到消息后,通過Handler回傳到UI線程處理,對(duì)濕度值的解析處理和對(duì)溫度值的解析處理思路是一樣的,把濕度值更新到text22中即可。三、任務(wù)實(shí)施(2)網(wǎng)關(guān)程序部分代碼完善。每2分鐘上報(bào)一次消息,在上報(bào)溫度消息語(yǔ)句后面,再調(diào)用client的publish方法發(fā)布(上報(bào))一條濕度消息。消息的topic="/手機(jī)號(hào)/my_ESP32/post"。假如采集到的濕度值是43%,消息載荷="{"humidity":43}"。uint8_ttempTime=0;voidloop(){if(!client.connected()){reconnect();}/*兩分鐘上報(bào)兩次溫濕度信息*/if(tempTime>240){tempTime=0;DHT.rea

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論